<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='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'><id>tag:blogger.com,1999:blog-5899416337306467227</id><updated>2025-11-22T05:31:28.713+03:00</updated><category term="c++"/><category term="java"/><category term="opengl"/><category term="c"/><category term="3d"/><category term="assembly"/><category term="cpu"/><category term="directx"/><category term="game engine"/><category term="cryptography"/><category term="game"/><category term="gpu"/><category term="microsoft"/><category term="visual studio"/><category term="C#"/><category term="IDE"/><category term="artificial intelligence"/><category term="controller"/><category term="framework"/><category term="intel"/><category term="java EE"/><category term="javascript"/><category term="model"/><category term="mvc"/><category term="netbeans"/><category term="oyun motoru"/><category term="spring"/><category term="veri yapıları"/><category term="view"/><category term="web"/><category term="yapay zeka"/><category term="8085"/><category term="FILO"/><category term="JNA"/><category term="JNI"/><category term="Java Native Access"/><category term="LIFO"/><category term="NASA"/><category term="SDL"/><category term="algoritma"/><category term="ati"/><category term="bağlı liste"/><category term="bmp"/><category term="delphi"/><category term="deserialization"/><category term="disassembly"/><category term="drawing text"/><category term="dword ptr"/><category term="encryption"/><category term="fizik"/><category term="fourier açılımı"/><category term="glut"/><category term="glutbitmapcharacter"/><category term="grafik"/><category term="graphic"/><category term="güvenlik"/><category term="jquery"/><category term="linked list"/><category term="mikroişlemci"/><category term="minimax"/><category term="monte carlo"/><category term="nvidia"/><category term="openmp"/><category term="paralel programming"/><category term="php"/><category term="pi"/><category term="process"/><category term="python"/><category term="rasterpos2i"/><category term="real-time"/><category term="register"/><category term="render"/><category term="security"/><category term="serialization"/><category term="serileştirme"/><category term="singleton"/><category term="stack"/><category term="synchronized"/><category term="tasarım şablonu"/><category term="texture"/><category term="tic tac toe"/><category term="veri iletişimi"/><category term="winapi"/><category term="windows"/><category term="winexec"/><category term="yığın"/><title type='text'>Ramazan Bellek</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>48</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-870773906330756231</id><published>2013-12-31T21:43:00.000+02:00</published><updated>2013-12-31T21:43:44.898+02:00</updated><title type='text'>Quadtree ile Hızlandırılmış Geometrik Arama</title><content type='html'>Bir çok problemin çözümünde geometrik çözümlerden istifade edilebilir. Geometrik çözüm, bir meseleyi geometrik perspektif vasıtasıyla çözmektir, velev ki problemimiz doğrudan geometrik olarak tanımlanmış olmasın. Biraz daha açarsak, doğrudan geometrik olarak tanımlanmış problemlere örnek vermek gerekirse, kapalı bir sistemde hareket eden hava moleküllerinin bulunduğu kap yüzeyiyle ve birbirleriyle olan çarpışma testlerinin yapılması olabilir. Doğrudan geometrik olarak tanımlanmayan problemlere ise bir cemiyetteki insanların birbiriyle olan münasebetlerinin mevcut skaler veriler üzerinden geometrik yorumlama vasıtasıyla tespit edilmesi olabilir. İster doğrudan ister yorumlama vasıtasıyla olsun geometrik hale gelen verilerde en büyük problem hızlı bir şekilde arama yapabilmektir. Arama ile kastedilen işlem, belirli bir bölgedeki veyahut belirli bir noktanın belirli bir mesafedeki komşularının tespitidir. Bu işlemi gerçekleştirmek için akla ilk gelen çözüm en ilkel hali ile zorlama yöntemidir (brute-force). Bu yöntemde tahmin edebileceğiniz gibi aranan noktaların bulunması için tüm noktalar sırayla taranır ve referans noktamıza olan uzaklığına bakılır. Bu usul her zaman doğru sonuca kati suretle varacaktır, fakat muhtemelen en uzun yoldan, zira muhtemel olsun olmasın tüm noktaları taradık ve maliyeti azami tuttuk.&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/AVvXsEgR4qpgg6-xQMXoNzsArQpkNEpkyiWXwY19-cYHO696DOy_a3TjiEalW805LthTW5DRd3Vw6fHAhI-kE2l5WKD3ElPfyL48RYePCJrM5g59iPUX9c3QXVGZg9gJCQNRloPUZKWJRCDni4c/s1600/calisma_uzayi.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/AVvXsEgR4qpgg6-xQMXoNzsArQpkNEpkyiWXwY19-cYHO696DOy_a3TjiEalW805LthTW5DRd3Vw6fHAhI-kE2l5WKD3ElPfyL48RYePCJrM5g59iPUX9c3QXVGZg9gJCQNRloPUZKWJRCDni4c/s640/calisma_uzayi.png&quot; /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
İnsan zihni bu problemi çözerken aslında çok da fazla zorlanmaz, zira sezgilerindeki gelişmişlik arama uzayında orta kısımda bulunan bir referans noktası için yapacağımız komşu aramasını gidipte çok uzaklarda aramaz, doğrudan ilgili kısma bakar. Fakat bilgisayar sistemlerinde genelde durum böyle değildir, veriler hafızada karışık bir sırayla tutulmaktadır (genelde üretim sırasına göre). Bu yüzden hangi nokta hangi noktaya ne kadar yakın bunu verinin geliş sırasında anlamak mümkün değildir. İşte hızlandırma tam da bu noktada mümkün olmaktadır. Aslında hızlandırma yöntemlerinde yapılan genel olarak düzensiz veriyi daha düzenli bir hale getirmekten ibarettir. 

Meseleyi daha iyi idrak etmek için doğrudan kullanacağımız veriyapısını detaylandıralım. Quadtree veri yapısı alsında bir çeşit ağaç yapısıdır. 2 boyutlu uzayda geçerli olmak üzere bir kök düğümden başlayarak her düğüm 4 alt düğüme ayrılmaktadır. Bu bölümleme kapsadığı noktalardan bağımsız olarak 4 eşit parçaya bölme şeklinde gerçekleşir. Nokta ihtiva eden düğümlere yaprak denmektedir. Bizim tasarımımızda bir yaprakta en fazla 1 nokta mevcut olabilir. Tarama işlemi ise, tıpkı ağacı oluşturduğumuz gibi, aradığımız nokta mevcut düğümün sol (alt-üst) ya da sağ (alt-üst) kısımlarından hangisine ait ise o bölgedeki alt ağacı tarayarak devam ediyoruz, böylelikle yakınlık ihtimali olmayan diğer bölgelerdeki noktaları devre dışı bırakmış ve bu yükten kurtulmuş oluyoruz, aynı insanın sezgisel olarak yaptığı gibi. Örnek ağaçlara bir göz atalım:&lt;br /&gt;
&lt;br /&gt;
&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;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQStjHU1BtqHeTDEQO4WuFjArlg2MMgh0nmM18f0XOwprwh6dAuqZYKiIu54Hopads23qad3R015Cb8AAar28o-l3B4959HolsTnhX8nlKAr_MeAUwduxfqjzsNVvstQazdqZvBi7p5hU/s1600/quadtree1.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQStjHU1BtqHeTDEQO4WuFjArlg2MMgh0nmM18f0XOwprwh6dAuqZYKiIu54Hopads23qad3R015Cb8AAar28o-l3B4959HolsTnhX8nlKAr_MeAUwduxfqjzsNVvstQazdqZvBi7p5hU/s400/quadtree1.PNG&quot; width=&quot;400&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/AVvXsEiGae4tVdqarkR9tie0RQH46aHC55NZm6ovuswLLoYoqMkRTjd6uOgLHzaalSlqXYIHHEl9YiH87WlD2i8ZBbK4cVggnTQOuygqUMczCt36ZWjdCW0xMAl-ne5lOXETqyE_2PE1iW5gpQQ/s1600/quadtree2.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/AVvXsEiGae4tVdqarkR9tie0RQH46aHC55NZm6ovuswLLoYoqMkRTjd6uOgLHzaalSlqXYIHHEl9YiH87WlD2i8ZBbK4cVggnTQOuygqUMczCt36ZWjdCW0xMAl-ne5lOXETqyE_2PE1iW5gpQQ/s400/quadtree2.PNG&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/AVvXsEifFJuKhDi451N1ZgC48PpugV8IkAsMqbcAbjLKsjZ0tvmL7G8cWUm467chyphenhyphenNusn5ai-uF-nn6BF-9zPr5tX6u6_2i5V5dx-fBdE8iIgVxMUrSRDdYXfya8fm0ePKIgsh_Og7QOdoLGuNo/s1600/quadtree3.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/AVvXsEifFJuKhDi451N1ZgC48PpugV8IkAsMqbcAbjLKsjZ0tvmL7G8cWUm467chyphenhyphenNusn5ai-uF-nn6BF-9zPr5tX6u6_2i5V5dx-fBdE8iIgVxMUrSRDdYXfya8fm0ePKIgsh_Og7QOdoLGuNo/s400/quadtree3.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Veriyapısı ve algoritma hakkında daha detaylı bilgi için: &lt;a href=&quot;http://en.wikipedia.org/wiki/Quadtree&quot;&gt;http://en.wikipedia.org/wiki/Quadtree&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Amacım algoritmayı tam anlamıyla anlatmak değil, sadece bir gerçekleme örneği sağlamak. Bu sebeple daha fazla detaylandırmak istemiyorum. Gerçekleme için C++ dili ve görselleştirme için OpenGL kütüphanesini kullandım. Performans arttırımı için dar boğaz olan dinamik bellek ayrımı (dynamic memory allocation) için bir iyileştirme gerçekleştirdim, fakat bu iyileştirmenin çalışabilmesi için maksimum nokta sınırının belirlenmesi gerekiyor, bu bilinmiyorsa daha farklı bir usul geliştirilebilir veya bu iyileştirme kaldırılabilir. Eğer kararlılık (stability) sizin için daha önemli ise bu iyileştirmeyi kaldırmanızı veya gözden geçirmenizi tavsiye ederim, zira bazı durumlarda (nokta yoğunlaşması gibi) hatalarla karşılaştım ayrıca aynı anda birden fazla ağaç üretmesine mani oluyor (no multiple instance).&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Not: Nokta tanımında açık kaynak kodlu ve ücretsiz temin edilebilen GTL (&lt;a href=&quot;https://code.google.com/p/geometry/&quot;&gt;https://code.google.com/p/geometry/&lt;/a&gt;) kütüphanesinden istifade ettim.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: cpp&quot;&gt;/*
 * Point.h
 *
 *  Created on: Oct 24, 2013
 *      Author: ramazan
 */

#ifndef POINT_H_
#define POINT_H_

#include &amp;lt;gtl/vec2.hpp&amp;gt;
#include &amp;lt;gtl/vec3.hpp&amp;gt;

#include &quot;Utility.h&quot;
#include &amp;lt;algorithm&amp;gt;

using namespace gtl;

class Point {
public:
 Point() {
  color.setValue(0, 0, 1);
  location.setValue(randomFloat() * SCREEN_WIDTH, randomFloat() * SCREEN_HEIGHT);
 }

 void walk() {
  location += Vec2f(randomSignedFloat() * 30, randomSignedFloat() * 30);
  location[0] = std::max(location[0], 0.f);
  location[0] = std::min(location[0], (float)SCREEN_WIDTH);

  location[1] = std::max(location[1], 0.f);
  location[1] = std::min(location[1], (float)SCREEN_HEIGHT);
 }

 Vec2f location;
 Vec3f color;
};


#endif /* POINT_H_ */
&lt;/pre&gt;
&lt;pre class=&quot;brush: cpp&quot;&gt;/*
 * Utility.h
 *
 *  Created on: Oct 24, 2013
 *      Author: ramazan
 */

#ifndef UTILITY_H_
#define UTILITY_H_

#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;

#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600

#define THREESHOLD 0.000001
#define PARMEQ(x, y) (fabs(x - y) &amp;lt;= THREESHOLD)

static inline float randomFloat() {
 return (float)rand()/(float)RAND_MAX;
}

static inline float randomSignedFloat() {
 const float r = randomFloat();
 return r - 0.5f;
}


#endif /* UTILITY_H_ */

&lt;/pre&gt;
&lt;pre class=&quot;brush: cpp&quot;&gt;#ifndef QUADTREE_H_
#define QUADTREE_H_

#include &amp;lt;assert.h&amp;gt;
#include &amp;lt;vector&amp;gt;

#include &quot;Point.h&quot;

// You can remove all optimization lines together. 

#define MAX_POINT_CAPACITY 1000000 // Optimization line!

class QuadNode {
public:
 QuadNode() {
  leaf = true;
  point = NULL;
  children[0] = children[1] = children[2] = children[3] = NULL;
 }

 ~QuadNode() {
  for (int i = 0; i &amp;lt; 4; i++) {
   QuadNode *child = children[i];
   if (child != NULL)
    delete child;
  }
 }

 void insert(const Point &amp;amp;point) {
  if (leaf &amp;amp;&amp;amp; this-&amp;gt;point == NULL) {
   this-&amp;gt;point = &amp;amp;point;
  }
  else {
   makeChild(-1, -1);
   makeChild(-1, 1);
   makeChild(1, -1);
   makeChild(1, 1);

   QuadNode *node = NULL;

   if (leaf) {
    const Point *thisPoint = this-&amp;gt;point;
    this-&amp;gt;point = NULL;
    node = findChild(*thisPoint);
    node-&amp;gt;insert(*thisPoint);
   }

   node = findChild(point);
   node-&amp;gt;insert(point);

   leaf = false;
  }
 }

 void query(const Vec2f &amp;amp;center, const float radius, std::vector&amp;lt;const Point *&amp;gt; &amp;amp;points) {
  const float absDX = fabs(center[0] - this-&amp;gt;center[0]);
  const float absDY = fabs(center[1] - this-&amp;gt;center[1]);

  if (absDX &amp;lt;= (halfSize[0] + radius) &amp;amp;&amp;amp; absDY &amp;lt;= (halfSize[1] + radius)) {
   if (point != NULL) {
    Vec2f disn = point-&amp;gt;location - center;
    const float dist = disn.length();

    if (dist &amp;lt;= radius)
     points.push_back(point);
   }
   else {
    for (int i = 0; i &amp;lt; 4; i++) {
     QuadNode *child = children[i];
     if (child != NULL)
      child-&amp;gt;query(center, radius, points);
    }
   }
  }
 }

 void render() {
  const Vec2f p0 = center + Vec2f(-halfSize[0], halfSize[1]);
  const Vec2f p1 = center + Vec2f(-halfSize[0], -halfSize[1]);
  const Vec2f p2 = center + Vec2f(halfSize[0], -halfSize[1]);
  const Vec2f p3 = center + Vec2f(halfSize[0], halfSize[1]);

  glColor3f(1, 0, 0);
  glBegin(GL_LINES);
  glVertex2fv(p0.getValue());
  glVertex2fv(p1.getValue());

  glVertex2fv(p1.getValue());
  glVertex2fv(p2.getValue());

  glVertex2fv(p2.getValue());
  glVertex2fv(p3.getValue());

  glVertex2fv(p3.getValue());
  glVertex2fv(p0.getValue());
  glEnd();

  for (int i = 0; i &amp;lt; 4; i++) {
   QuadNode *child = children[i];
   if (child != NULL)
    child-&amp;gt;render();
  }
 }
private:
 int makeChild(const float dX, const float dY) {
  int index = -1;
  float newX = halfSize[0] / 2;
  float newY = halfSize[1] / 2;
  if (dX &amp;lt; 0) {
   newX = -newX;
   if (dY &amp;lt; 0) {
    index = 1;
    newY = -newY;
   }
   else
    index = 0;
  } else {
   if (dY &amp;lt; 0) {
    index = 2;
    newY = -newY;
   }
   else
    index = 3;
  }

  verifyChild(index, center + Vec2f(newX, newY));

  return index;
 }
 QuadNode *findChild(const Point &amp;amp;point) {
  const float dX = point.location[0] - center[0];
  const float dY = point.location[1] - center[1];

  return children[makeChild(dX, dY)];
 }

 void verifyChild(const int index, const Vec2f newCenter) {
  assert(index &amp;gt;= 0 &amp;amp;&amp;amp; index &amp;lt;= 3);

  if (children[index] == NULL) {
   children[index] = new QuadNode();
   assert(children[index] != NULL);
   children[index]-&amp;gt;center = newCenter;
   children[index]-&amp;gt;halfSize = halfSize / 2;
  }
 }

private:
 static char memory[]; // Optimization line!
 static int memoryIndex; // Optimization line!

public:
 void *operator new(size_t size) { // Optimization line!
  assert(memoryIndex &amp;lt; MAX_POINT_CAPACITY); // Optimization line!
  return &amp;amp;memory[memoryIndex++ * size]; // Optimization line!
 } // Optimization line!

 void operator delete(void *p) { // Optimization line!
  p = NULL; // Optimization line!
 } // Optimization line!

public:

 // 0 3
 // 1 2
 QuadNode *children[4];
 const Point *point;
 Vec2f center;
 Vec2f halfSize;
 bool leaf;
};

int QuadNode::memoryIndex = 0; // Optimization line!
char QuadNode::memory[sizeof(QuadNode) * MAX_POINT_CAPACITY] = { }; // Optimization line!

class Quadtree {
public:
 Quadtree(const Vec2f &amp;amp;center, const float w, const float h) {
  root = new QuadNode();
  root-&amp;gt;center = center;
  root-&amp;gt;halfSize.setValue(w / 2, h / 2);
 }

 ~Quadtree() {
  if (root != NULL) {
   delete root;
  }
 }

 void insert(const Point &amp;amp;point) {
  assert(root != NULL);

  root-&amp;gt;insert(point);
 }

 void render() {
  assert(root != NULL);
  root-&amp;gt;render();
 }

 void query(const Vec2f &amp;amp;center, const float radius, std::vector&amp;lt;const Point *&amp;gt; &amp;amp;points) {
  assert(root != NULL);

  root-&amp;gt;query(center, radius, points);
 }

 QuadNode *root;
};


#endif /* QUADTREE_H_ */

&lt;/pre&gt;
&lt;pre class=&quot;brush: cpp&quot;&gt;// main.cpp

#include &amp;lt;iostream&amp;gt;
#include &amp;lt;glut\\glut.h&amp;gt;
#include &amp;lt;time.h&amp;gt;

#include &quot;Quadtree.h&quot;

#define RENDER_WAIT_TIME 25
#define NUMBER_OF_POINTS 30000

using namespace std;

Point *points = NULL;
Quadtree *qt;

Vec2f qCenter(300, 400);
float radius = 100;

void display(void) {
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();

    glBegin(GL_POINTS);
    for (int i = 0; i &amp;lt; NUMBER_OF_POINTS; i++) {
     glColor3fv(points[i].color.getValue());
     glVertex2fv(points[i].location.getValue());
    }
    glEnd();

    glColor3f(0, 1, 0);
    glBegin(GL_LINES);
    for (int i = 0; i &amp;lt; 360; i++) {
     Vec2f p1 = qCenter + Vec2f(cos((i * M_PI / 180.f)) * radius, sin((i * M_PI / 180.f)) * radius);
     Vec2f p2 = qCenter + Vec2f(cos(((i + 1) * M_PI / 180.f)) * radius, sin(((i + 1) * M_PI / 180.f)) * radius);
     glVertex2fv(p1.getValue());
     glVertex2fv(p2.getValue());
    }
    glEnd();

    if (qt != NULL)
     qt-&amp;gt;render();

    //glFlush();
    glutSwapBuffers();
}

void mouse(int btn, int state, int x, int y) {
    //if(btn==GLUT_LEFT_BUTTON &amp;amp;&amp;amp; state == GLUT_DOWN) axis = 0;
}

void search() {
 if (qt == NULL)
  return;
 std::vector&amp;lt;const Point *&amp;gt; qpoints;
    qt-&amp;gt;query(qCenter, radius, qpoints);

    std::cout&amp;lt;&amp;lt;qpoints.size()&amp;lt;&amp;lt;std::endl;
    for (int i = 0; i &amp;lt; NUMBER_OF_POINTS; i++) {
  points[i].color.setValue(0, 0, 1);
     for (unsigned int j = 0; j &amp;lt; qpoints.size(); j++) {
      if (&amp;amp;points[i] == qpoints[j])
       points[i].color.setValue(0, 1, 0);
     }
    }
}

void mainLoop(int value) {
    glutPostRedisplay();
    glutTimerFunc(RENDER_WAIT_TIME, mainLoop, 0);
}

void build() {
 qt = new Quadtree(Vec2f(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2), SCREEN_WIDTH, SCREEN_HEIGHT);
    for (int i = 0; i &amp;lt; NUMBER_OF_POINTS; i++)
     qt-&amp;gt;insert(points[i]);
}

void keyPressed(unsigned char key, int x, int y) {
    if (key == &#39;x&#39;)
        exit(0);

 if (key == &#39;w&#39;)
  qCenter += Vec2f(0, 10);

 if (key == &#39;s&#39;)
  qCenter += Vec2f(0, -10);

 if (key == &#39;a&#39;)
  qCenter += Vec2f(-10, 0);

 if (key == &#39;d&#39;)
  qCenter += Vec2f(10, 0);

 if (key == &#39;r&#39;) {
  for (int i = 0; i &amp;lt; NUMBER_OF_POINTS; i++)
   points[i].walk();
  build();
 }

 search();
}

void myReshape(int w, int h) {
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0f, 800, 0, 600, 1.0f, -1.0f);
    glMatrixMode(GL_MODELVIEW);
}

void keySpecial(int key, int x, int y) {
    if (key == GLUT_KEY_F4)
        exit(0);
}

void init() {
    glShadeModel(GL_FLAT);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glPointSize(3);

    points = new Point[NUMBER_OF_POINTS];
 //points[0].location.setValue(100, 100);
 //points[1].location.setValue(110, 120);
 //points[2].location.setValue(105, 105);
 build();
 search();
}

int main(int argc, char** argv) {
    srand(time(NULL));
    glutInit(&amp;amp;argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowSize(SCREEN_WIDTH, SCREEN_HEIGHT);
    glutCreateWindow(&quot;Quadtree&quot;);
    glutReshapeFunc(myReshape);
    glutDisplayFunc(display);
    glutKeyboardFunc(keyPressed);
    glutSpecialFunc(keySpecial);
    init();
    glutTimerFunc(RENDER_WAIT_TIME, mainLoop, 0);
    glutMouseFunc(mouse);
    glutMainLoop();
    return 0;
}


&lt;/pre&gt;
Bir kaç deneme yapalım:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOWNtoZmRmrIyF91bCHdtvXCvE4RzVKw_MSNsXy5Erbj60SKUvxG7DKwvoYn-Shh2KR__gzTd0AL3c9rxAur75wJMaM6pe_nhlAGuTrcqtoBKDbC2Yyi3LA05IekW5u8LeeFnF33X_Vi4/s1600/quadtree10.PNG&quot; imageanchor=&quot;1&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOWNtoZmRmrIyF91bCHdtvXCvE4RzVKw_MSNsXy5Erbj60SKUvxG7DKwvoYn-Shh2KR__gzTd0AL3c9rxAur75wJMaM6pe_nhlAGuTrcqtoBKDbC2Yyi3LA05IekW5u8LeeFnF33X_Vi4/s640/quadtree10.PNG&quot; /&gt;&lt;/a&gt;&lt;b&gt;10 adet nokta&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX_K6eUAQwWFd7KewmGJTL89oT2S8TQMdk-hz-W8ugoXQ4CxHX6NFGyMRvP8ubIcyun847hTXcXxcB9RSlfhWPWmT_Fb2Vgxs8gwPZAD7381pM6wr4_59zwIGQV6istyqdd0zGWAHFtDE/s1600/quadtree100.PNG&quot; imageanchor=&quot;1&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX_K6eUAQwWFd7KewmGJTL89oT2S8TQMdk-hz-W8ugoXQ4CxHX6NFGyMRvP8ubIcyun847hTXcXxcB9RSlfhWPWmT_Fb2Vgxs8gwPZAD7381pM6wr4_59zwIGQV6istyqdd0zGWAHFtDE/s640/quadtree100.PNG&quot; /&gt;&lt;/a&gt;&lt;b&gt;100 adet nokta&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF3PToq7fPJa1IqIE1bNa0xzQCUMvJGrM7JX4H2vhuMjRSJWkWtBsbQG8uUJ5sYIjP7BFe9c6F-F_OtSbWmws1unrsPpysPj3u7FQrXg1_TMEkdhfkhir8Mr7Ie4_T835EO65EYXn6FBk/s1600/quadtree5000.PNG&quot; imageanchor=&quot;1&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF3PToq7fPJa1IqIE1bNa0xzQCUMvJGrM7JX4H2vhuMjRSJWkWtBsbQG8uUJ5sYIjP7BFe9c6F-F_OtSbWmws1unrsPpysPj3u7FQrXg1_TMEkdhfkhir8Mr7Ie4_T835EO65EYXn6FBk/s640/quadtree5000.PNG&quot; /&gt;&lt;/a&gt;&lt;b&gt;5000 adet nokta&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhujlt1uo4XhOtR5vj0mME2mK9-E7rYFj1glPtNvOtLmCBBPfCQCGVq_r76vwOTDWOteHXcE2hjBC-NF1JmEBcBa5duTKezAL06zrMWf9Obj9Jbkg02tWRVzTWugKXuhkr83kqv4RqWDdk/s1600/quadtree30000.PNG&quot; imageanchor=&quot;1&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;506&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhujlt1uo4XhOtR5vj0mME2mK9-E7rYFj1glPtNvOtLmCBBPfCQCGVq_r76vwOTDWOteHXcE2hjBC-NF1JmEBcBa5duTKezAL06zrMWf9Obj9Jbkg02tWRVzTWugKXuhkr83kqv4RqWDdk/s640/quadtree30000.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;b&gt;30000 adet nokta&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;
&lt;/div&gt;
Bu bölümde 2 boyutlu düzlem üzerindeki geometrik problemlerin çözümünde kullanılan arama işlemini hızlandıran bir veriyapısını inceledik. Aynı veri yapısı 3 boyutlu uzayda da uygulanabilir (Octree - &lt;a href=&quot;http://en.wikipedia.org/wiki/Octree&quot;&gt;http://en.wikipedia.org/wiki/Octree&lt;/a&gt;). Mantık olarak aynı yalnızca 4 yerine 8 eşit parçaya ayrılmaktadır. Performans değerlendirmesini zaman cinsinden değerleri belirterek yapmak istemiyorum, kullandığım bilgisayar üzerinde brute-force yöntemine göre tahmin edebileceğiniz gibi (beklendiği üzere) çok büyük oranda hızlanma sağladı. Bunu kendi probleminize uygulayarak görebilirsiniz. Basit düzeyde anlatmaya çalıştım, umarım işinize yarar.</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/870773906330756231/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/870773906330756231' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/870773906330756231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/870773906330756231'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2013/12/quadtree-ile-hzlandrlms-geometrik-arama.html' title='Quadtree ile Hızlandırılmış Geometrik Arama'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR4qpgg6-xQMXoNzsArQpkNEpkyiWXwY19-cYHO696DOy_a3TjiEalW805LthTW5DRd3Vw6fHAhI-kE2l5WKD3ElPfyL48RYePCJrM5g59iPUX9c3QXVGZg9gJCQNRloPUZKWJRCDni4c/s72-c/calisma_uzayi.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-3006374992423989223</id><published>2012-11-24T16:13:00.000+02:00</published><updated>2012-11-24T16:47:43.820+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="artificial intelligence"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="netbeans"/><category scheme="http://www.blogger.com/atom/ns#" term="yapay zeka"/><title type='text'>Yapay Sinir Ağları İleri Besleme &amp; Geri Yayılım Algoritmaları - XOR Örneği</title><content type='html'>&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/AVvXsEgpF66919zXtxix8a31Hi9qWSZkMUSUSyzg3MKnsmBnoKQltsD5E_HimdLuG995jba96rSwfXOH6k_rbUi328IdcyZtfq9Fof0rE_NkhVfV5ba7KV9MF_Y8jdOIMThP8J4_-NgBvJLwVbg/s1600/A-Network-of-Neurosynaptic-Cores2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpF66919zXtxix8a31Hi9qWSZkMUSUSyzg3MKnsmBnoKQltsD5E_HimdLuG995jba96rSwfXOH6k_rbUi328IdcyZtfq9Fof0rE_NkhVfV5ba7KV9MF_Y8jdOIMThP8J4_-NgBvJLwVbg/s320/A-Network-of-Neurosynaptic-Cores2.png&quot; width=&quot;320&quot; /&gt;&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;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://scitechdaily.com/ibm-supercomputer-simulates-530-billion-neurons-100-trillion-synapses/&quot; target=&quot;_blank&quot;&gt;http://scitechdaily.com/ibm-supercomputer-simulates-530-billion-neurons-100-trillion-synapses/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
IBM&#39;in yapmış olduğu çalışmanın haberini okuduktan sonra yapay zeka meselesi hakkında küçük bir yazı yazmaya karar verdim. Tabiki haberdeki çalışmaya nazaran bizim yapacağımız örnek çok iptidai kalmaktadır. Lakin buradaki maksadım bir şekilde meseleye giriş yapmak bilahare daha gelişmiş örneklerle konuyu izah etmek şeklinde olacaktır.&lt;br /&gt;
&lt;br /&gt;
Yapay zeka çok geniş bir kavram ve bir çok alt dalları bulunmaktadır (bkz: &lt;a href=&quot;http://en.wikipedia.org/wiki/List_of_basic_artificial_intelligence_topics&quot; target=&quot;_blank&quot;&gt;http://en.wikipedia.org/wiki/List_of_basic_artificial_intelligence_topics&lt;/a&gt;). Ben burada giriş mahiyetinde Yapay Sinir Ağları (bkz: &lt;a href=&quot;http://en.wikipedia.org/wiki/Artificial_neural_network&quot; target=&quot;_blank&quot;&gt;http://en.wikipedia.org/wiki/Artificial_neural_network&lt;/a&gt;) hususunda ileri besleme (Feed forward bkz:&amp;nbsp;&lt;a href=&quot;http://en.wikipedia.org/wiki/Feedforward_neural_network&quot; target=&quot;_blank&quot;&gt;http://en.wikipedia.org/wiki/Feedforward_neural_network&lt;/a&gt;) ve geri yayılım (bkz: &lt;a href=&quot;http://en.wikipedia.org/wiki/Back-propagation&quot; target=&quot;_blank&quot;&gt;http://en.wikipedia.org/wiki/Back-propagation&lt;/a&gt;) algoritmalarını kullanarak artık klasikleşmiş ve tabiri caizse bıktırmış olan XOR örneğini gerçekleyeceğim.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Yukarıda verdiğim bağlantılara göz atarsanız algoritmanın nasıl çalıştığını kolayca anlayabilirsiniz. Bu noktada fazla bir teferruat icap etmiyor zira yapacağımız örnekteki XOR problemi 2 neron hidden layer için 1 neron da output layer için kafidir. Mühim bir not; biz bu örnekte BIAS değerini tüm neronlara ayrı ayrı vermek yerine bir kukla neron (dummy neuron, ağırlıkları ve çıktısı değişmeyen) kullanacağız.&lt;br /&gt;
&lt;br /&gt;
Biraz gerçekleme (implementation) detaylarına göz atalım.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Uygulamayı Java ile yapacağız. Aslınca C gibi bir dil ile çok daha basit ve hızlı bir şekilde gerçeklenebilirdi lakin müstakbel uygulamalarımızda yapacağımız muameleler daha karmaşık olacağından bu yapı ileride bize fayda sağlayacaktır, şu anda aksi gibi görünse dahi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Temel olarak Object-Oriented yapı:&lt;br /&gt;
&lt;br /&gt;
Neuron (Class)&lt;br /&gt;
NN (Class)&lt;br /&gt;
IActivation (Interface)&lt;br /&gt;
SigmoidActivation (Class) -&amp;gt; IActivation&lt;br /&gt;
DummyActivation (Class) -&amp;gt; IActivation &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Başlamdan önce belirlenmesi gereken ilk husus neronların ilk ağırlık değerleridir, burada önceden çalıştığı bilinen bir küme de seçilebilir ya da sözde rastgele değerlerde seçilebilir, neticede kötü seçilen değerler sadece sonuca ulaşma süremizi uzatacaktır. Biz rastgele değerler üreteceğiz bu yüzden programı her çalıştırdığınızda farklı bekleme süreleri ile karşılacaksınız. Ayrıca eğitim sürecinde iterasyon sayısını bir hudut koyuyoruz çünkü bazı durumlarda gelen değerler deltaW değeri sıfıra çok yaklaştığı için istenilen değere (desired value) bir türlü yaklaşılamıyor ve çok bekleme yaşanıyor. Bu sebeple azami tekerrür 3.000.000 olarak seçiyoruz, beklenen hata nispetini ise 0.005 olarak seçtim. Bu değerler tamamen keyfi olup siz de istediğiniz gibi değiştirebilirisiniz.&lt;br /&gt;
&lt;br /&gt;
Kaynak kodda herhangi bir dış kütüphane kullanmadım, doğrudan derleyip çalıştırabilisiniz.&lt;br /&gt;
&lt;br /&gt;
Şimdi kaynak kodumuza bir göz atalım:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;// Main.java

package ann.xor;

/**
 *
 * @author ramazan
 */
public class Main {

    public static String quantizeResult(float result) {
        return Integer.toString(Math.round(result)) + &quot; (&quot; + Float.toString(result) + &quot;)&quot;;
    }
    
    public static void main(String[] args) {
        NN nn = new NN(5E-3f, 1.0f, 0.1f);
        SigmoidActivation sa = new SigmoidActivation();
        DummyActivation da = new DummyActivation();
        float BIAS = -1f;

        Neuron input1 = new Neuron(da, 0);
        Neuron input2 = new Neuron(da, 0);
        Neuron input3 = new Neuron(da, 0); // BIAS.
        Neuron hidden1 = new Neuron(sa, 3);
        Neuron hidden2 = new Neuron(sa, 3);
        Neuron hidden3 = new Neuron(da, 3); // Dummy neuron.
        Neuron output1 = new Neuron(sa, 3);

        nn.addInputNeuron(input1);
        nn.addInputNeuron(input2);
        nn.addInputNeuron(input3);

        nn.addHiddenNeuron(hidden1);
        nn.addHiddenNeuron(hidden2);
        nn.addHiddenNeuron(hidden3);

        nn.addOutNeuron(output1);

        hidden3.setDummy(true);
        input3.setOutput(BIAS);

        System.out.println(&quot;All inputs &amp;amp; weights has been set.&quot;);
        System.out.println(&quot;Training has been started.&quot;);
        
        int iteration = 0;
        do {
            iteration++;
            
            input1.setOutput(0);
            input2.setOutput(0);
 
            output1.desired = 0;

            nn.train();

            input1.setOutput(0);
            input2.setOutput(1);

            output1.desired = 1;

            nn.train();

            input1.setOutput(1);
            input2.setOutput(0);

            output1.desired = 1;

            nn.train();

            input1.setOutput(1);
            input2.setOutput(1);

            output1.desired = 0;

            nn.train();
            
            if (iteration % 50000 == 0) {
                System.out.println(&quot;-------------------------------&quot;);
                System.out.println(&quot;Current iteration:&quot; + iteration);
                System.out.println(&quot;Current error:&quot; + nn.getE());
                System.out.println(&quot;-------------------------------&quot;);
            }
        } while(!nn.learnt() &amp;amp;&amp;amp; iteration &amp;lt; 3000000);
        
        System.out.println(&quot;Training has been completed.&quot;);
        System.out.println(&quot;Total iteration: &quot; + iteration + &quot;, accepted error: &quot; + nn.getE());
        System.out.println(&quot;Test cases are in progress...&quot;);
        
        input1.setOutput(1);
        input2.setOutput(0);

        nn.test();

        System.out.println(&quot;1 XOR 0 = &quot; + quantizeResult(nn.getOutput(0).getOutput()));

        input1.setOutput(1);
        input2.setOutput(1);

        nn.test();

        System.out.println(&quot;1 XOR 1 = &quot; + quantizeResult(nn.getOutput(0).getOutput()));

        input1.setOutput(0);
        input2.setOutput(1);

        nn.test();

        System.out.println(&quot;0 XOR 1 = &quot; + quantizeResult(nn.getOutput(0).getOutput()));

        input1.setOutput(0);
        input2.setOutput(0);

        nn.test();

        System.out.println(&quot;0 XOR 0 = &quot; + quantizeResult(nn.getOutput(0).getOutput()));
    }
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;// NN.java

package ann.xor;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author ramazan
 */
public class NN {
   
    private List&amp;lt;neuron&amp;gt; inputLayer;
    private List&amp;lt;neuron&amp;gt; hiddenLayer;
    private List&amp;lt;neuron&amp;gt; outputLayer;
    private float E;
    private float e;
    private float lambda;
    private float nu;
    
    public NN(float E, float lambda, float nu) {
        inputLayer = new ArrayList&amp;lt;&amp;gt;();
        hiddenLayer = new ArrayList&amp;lt;&amp;gt;();
        outputLayer = new ArrayList&amp;lt;&amp;gt;();
        this.E = E;
        e = 0;
        this.lambda = lambda;
        this.nu = nu;
    }
    
    public void addInputNeuron(Neuron neuron) {
        inputLayer.add(neuron);
    }
    
    public void addHiddenNeuron(Neuron neuron) {
        hiddenLayer.add(neuron);
    }
    
    public void addOutNeuron(Neuron neuron) {
        outputLayer.add(neuron);
    }
    
    public Neuron getOutput(int index) {
        return outputLayer.get(index);
    } 
    
    public void train() {
        feedForward();
        calculateError();
        backPropagation();
        //System.out.println(&quot;Error value: &quot; + e);
    }
    
    public void test() {
        feedForward();
    }
    
    protected void feedForward() {
        for (Neuron nH : hiddenLayer) {
            float inputs = 0;
            for (Neuron nI : inputLayer) {
                int i = inputLayer.indexOf(nI);
                inputs += nI.getOutput() * nH.getWeight(i);
            }
            nH.setInput(inputs);
            nH.activate(lambda);
        }
        
        for (Neuron nO : outputLayer) {
            float inputs = 0;
            for (Neuron nH : hiddenLayer) {
                int i = hiddenLayer.indexOf(nH);
                inputs += nH.getOutput() * nO.getWeight(i);
            }
            nO.setInput(inputs);
            nO.activate(lambda);
        }
    }
    
    protected void calculateError() {
        e = 0;
        for (Neuron nO : outputLayer) {
            nO.error = nO.desired - nO.getOutput();
            e += (float) Math.pow(nO.error, 2);
        }
        
        e = (float)Math.sqrt(e); 
    }
    
    protected void backPropagation() {
        for (Neuron nO : outputLayer) {
            nO.calculateDelta(lambda, nO.error);
            for (Neuron nH : hiddenLayer) {
                int i = hiddenLayer.indexOf(nH);
                nH.calculateDelta(lambda, nO.getDelta() * nO.getWeight(i));
                float diff = nu * nO.getDelta() * nH.getOutput();
                nO.setWeight(i, nO.getWeight(i) + diff);
            }
        }
        
        for (Neuron nH : hiddenLayer) {
            for (Neuron nI : inputLayer) {
                int i = inputLayer.indexOf(nI);
                float diff = nu * nH.getDelta() * nI.getOutput();
                nH.setWeight(i, nH.getWeight(i) + diff);
            }
        }
    }

    public float getE() {
        return e;
    }
    
    public boolean learnt() {
        return (e &amp;lt; E);
    }
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;// Neuron.java

package ann.xor;

import java.util.Random;

/**
 *
 * @author ramazan
 */
public class Neuron {

    private float[] weights;
    private float input;
    private float output;
    private IActivation activation;
    private float delta;
    public float desired;
    public float error;
    private boolean dummy;
    private static final Random random = new Random();

    public Neuron(IActivation activation, int weights) {
        this.weights = new float[weights];
        this.activation = activation;
        delta = 0;
        dummy = false;
        error = desired = 0;
        
        for (int i = 0; i &amp;lt; weights; i++) {
            this.weights[i] = getRandomWeight();
        }
    }
    
    protected final float getRandomWeight() {
        final float r = random.nextFloat();
        final float range = 2.4f / weights.length;

        return (r * 2 * range) - range;
    }

    public float getWeight(int index) {
        return weights[index];
    }

    public void setWeight(int index, float weight) {
        if (!dummy) {
            weights[index] = weight;
        }
    }

    public float getInput() {
        return input;
    }

    public void setInput(float input) {
        this.input = input;
    }

    public float getOutput() {
        return output;
    }

    public void setOutput(float output) {
        this.output = output;
    }

    public float getDelta() {
        return delta;
    }

    public boolean isDummy() {
        return dummy;
    }

    public void setDummy(boolean dummy) {
        this.dummy = dummy;
    }
    
    public void activate(float lambda) {
        float value = input;
        if (!dummy) {
            value *= -lambda;
        }
        output = activation.activate(value);
    }

    public void calculateDelta(float lambda, float error) {
        if (!dummy) {
            delta = error * lambda * activation.derivative(output);
        }
    }
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;// IActivation.java

package ann.xor;

/**
 *
 * @author ramazan
 */
public interface IActivation {
    public float activate(float input);
    public float derivative(float input);
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;// SigmoidActivation.java

package ann.xor;

/**
 *
 * @author ramazan
 */
public class SigmoidActivation implements IActivation {

    @Override
    public float activate(float input) {
        return (float) (1. / (1. + Math.exp(input)));
    }

    @Override
    public float derivative(float input) {
        return input * (1 - input);
    }
    
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;// DummyActivation.java

package ann.xor;

/**
 *
 * @author ramazan
 */
public class DummyActivation implements IActivation {

    @Override
    public float activate(float input) {
        return input;
    }

    @Override
    public float derivative(float input) {
        return input;
    }
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
Şimdi örnek bir çıktı üretelim:&lt;br /&gt;
&lt;br /&gt;
run:&lt;br /&gt;
All inputs &amp;amp; weights has been set.&lt;br /&gt;
Training has been started.&lt;br /&gt;
-------------------------------&lt;br /&gt;
Current iteration:50000&lt;br /&gt;
Current error:0.02354227&lt;br /&gt;
-------------------------------&lt;br /&gt;
-------------------------------&lt;br /&gt;
Current iteration:100000&lt;br /&gt;
Current error:0.014160486&lt;br /&gt;
-------------------------------&lt;br /&gt;
-------------------------------&lt;br /&gt;
Current iteration:150000&lt;br /&gt;
Current error:0.011045283&lt;br /&gt;
-------------------------------&lt;br /&gt;
-------------------------------&lt;br /&gt;
Current iteration:200000&lt;br /&gt;
Current error:0.009226563&lt;br /&gt;
-------------------------------&lt;br /&gt;
-------------------------------&lt;br /&gt;
Current iteration:250000&lt;br /&gt;
Current error:0.008103463&lt;br /&gt;
-------------------------------&lt;br /&gt;
-------------------------------&lt;br /&gt;
Current iteration:300000&lt;br /&gt;
Current error:0.0073397583&lt;br /&gt;
-------------------------------&lt;br /&gt;
-------------------------------&lt;br /&gt;
Current iteration:350000&lt;br /&gt;
Current error:0.006666307&lt;br /&gt;
-------------------------------&lt;br /&gt;
-------------------------------&lt;br /&gt;
Current iteration:400000&lt;br /&gt;
Current error:0.00628476&lt;br /&gt;
-------------------------------&lt;br /&gt;
-------------------------------&lt;br /&gt;
Current iteration:450000&lt;br /&gt;
Current error:0.0058559924&lt;br /&gt;
-------------------------------&lt;br /&gt;
-------------------------------&lt;br /&gt;
Current iteration:500000&lt;br /&gt;
Current error:0.0055325483&lt;br /&gt;
-------------------------------&lt;br /&gt;
-------------------------------&lt;br /&gt;
Current iteration:550000&lt;br /&gt;
Current error:0.0051981094&lt;br /&gt;
-------------------------------&lt;br /&gt;
Training has been completed.&lt;br /&gt;
Total iteration: &lt;span style=&quot;color: red;&quot;&gt;586265&lt;/span&gt;, accepted error: &lt;span style=&quot;color: red;&quot;&gt;0.004999997&lt;/span&gt;&lt;br /&gt;
Test cases are in progress...&lt;br /&gt;
&lt;b&gt;1 XOR 0 = 1 (&lt;span style=&quot;color: red;&quot;&gt;0.9973595&lt;/span&gt;)&lt;br /&gt;1 XOR 1 = 0 (&lt;span style=&quot;color: red;&quot;&gt;0.004999945&lt;/span&gt;)&lt;br /&gt;0 XOR 1 = 1 (&lt;span style=&quot;color: red;&quot;&gt;0.9919734&lt;/span&gt;)&lt;br /&gt;0 XOR 0 = 0 (&lt;span style=&quot;color: red;&quot;&gt;0.0039330246&lt;/span&gt;)&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;color: lime;&quot;&gt;BUILD SUCCESSFUL&lt;/span&gt; (total time: &lt;span style=&quot;color: red;&quot;&gt;4 seconds&lt;/span&gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bu basit örnek ile konuyu teorik olarak okuduktan sonra pratik olarak uygulamasını görerek daha iyi anlaşılacağı kanaatindeyim. Bir sonraki yazıda, yine klasikleşmiş olan tanıma (recognition) uygulamalarından bir örnek yapabilirim veyahut farklı bir anlada mesela Multi-agent systems simulation bir çalışma olabilir. Henüz karar vermedim. :)&lt;br /&gt;
&lt;br /&gt;
Umarım faydalı olmuştur, böylelikle uzunca bir aradan sonra yazı yazabilmenin huzuruyla sizlere veda ediyorum, Allah&#39;a emanet olunuz...</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/3006374992423989223/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/3006374992423989223' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/3006374992423989223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/3006374992423989223'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2012/11/yapay-sinir-aglar-ileri-besleme-geri.html' title='Yapay Sinir Ağları İleri Besleme &amp; Geri Yayılım Algoritmaları - XOR Örneği'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpF66919zXtxix8a31Hi9qWSZkMUSUSyzg3MKnsmBnoKQltsD5E_HimdLuG995jba96rSwfXOH6k_rbUi328IdcyZtfq9Fof0rE_NkhVfV5ba7KV9MF_Y8jdOIMThP8J4_-NgBvJLwVbg/s72-c/A-Network-of-Neurosynaptic-Cores2.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-6117332264926982253</id><published>2011-04-14T01:40:00.017+03:00</published><updated>2011-04-14T04:13:26.329+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c++"/><category scheme="http://www.blogger.com/atom/ns#" term="directx"/><category scheme="http://www.blogger.com/atom/ns#" term="game engine"/><category scheme="http://www.blogger.com/atom/ns#" term="opengl"/><category scheme="http://www.blogger.com/atom/ns#" term="oyun motoru"/><title type='text'>IREM Oyun Motoru Çalışması - Rapor 1</title><content type='html'>Herkese merhaba,&lt;br /&gt;&lt;br /&gt;bu yazımda bitirme projesi olarak yaptığımız IREM Oyun Motoru projesinden bahsetmek istiyorum. Bu projeyi üniversite lisans bitirme projesi olarak toplam 4 kişilik bir ekip ile yapıyoruz. Profesyonel düzeyde bir proje olduğunu söyleyemem, fakat elimizden geldiğince gelişime açık bir tasarım ve esnek bir kodlama yapmaya çalışıyoruz. Proje henüz sonuçlanmadı fakat dönem sonuna doğru yaklaştıkça zaman kısıtı yüzünden projeyi bir noktada sınırlayıp nihayete erdirmek zorundayız. Gelin şuan ki aşamaya kadar neler yaptığımıza bir göz atalım.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;font-style:italic; color: #0279ff; font-size:18px&quot;&gt;Teknik Alt Yapı ve Sınırlar&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;C++ programlama dili üzerinden kodlamayı gerçekleştirdik. Grafik arayüzü olarak Microsoft DirectX API kullandık. Proje dahilinde singleton, façade, strategy, abstract factory vb. tasarım desenleri uygulandı. Networking, AI (yapay zeka), 3d sound, shader effects (HLSL) gibi modüllerin yalnızca tanımlaması yapıldı gerçeklenmedi. İleriki aşamalarda mevcut kod değiştirilmeden rahatlıkla bu modüller gerçeklenebilir. Fiziksel etkileşim yalnızca çarpışma testi ve parçacık dinamiği üzerinden gerçeklendi.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;font-style:italic; color: #0279ff; font-size:18px&quot;&gt;Teknik Üst Yapı ve Tasarım&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;Geliştirdiğimiz oyun motorunun temel fikri; yaklaşık olarak %90 seviyesinde nesne yönelimli, kolay programlanabilir, anlaşılır ve çevik (agile) geliştirmeye açık bir tasarım sağlamaktır. Bu yüzden inceledeğim bir çok modern oyun motorlarından da esinlenerek birbiriyle alakası olmayan tüm işlemleri ayırarak kendi aralarında bir yönetici sınıf atadım. Bu yönetici sınıflar singleton tasarım şablonu ile yalnız ve tek bir adet üretilerek çok başlılık sorununa mahal vermeden işlem yapmaktadır. Bu noktada sizlerle daha projenin ilk aşamalarında şekillendirmek adına çıkarttığım sınıf tasarımını paylaşmak istiyorum. İsterseniz tasarıma bir göz atalım, böylelikle kurgu kafamızda biraz daha somutlaşacaktır, daha sonra detaylı incelemeye devam edelim.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ8bIaFvDAirOTVNikiogyHQxX_O9c_3U9BW5MBjhBlnjNypaJaH1jbTiY77G2aY1JI6Z7Go9oejRMFrzBXjWdF2w5vySJFDRRHWfvSmUf9Ka3ckAGGqBF-S-tTSKgNTKfFYeNSxlZuTw/s1600/irem_game_engine_design_uml_2.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 333px; height: 400px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ8bIaFvDAirOTVNikiogyHQxX_O9c_3U9BW5MBjhBlnjNypaJaH1jbTiY77G2aY1JI6Z7Go9oejRMFrzBXjWdF2w5vySJFDRRHWfvSmUf9Ka3ckAGGqBF-S-tTSKgNTKfFYeNSxlZuTw/s400/irem_game_engine_design_uml_2.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5595218661191312066&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Buradaki bazı sınıfın yapısı değişmiş ve yine burada belirtmediğim bir çok yeni sınıf eklenmiş olsa da sistemin genel mantığını ifade ettiğini düşünüyorum.&lt;br /&gt;&lt;br /&gt;Çekirdek uygulamanın yanında ek olarak pencere yöneticisi (window manager) ve arazi üreticisi (terrain generator) gibi araçlar geliştirdik. Bunlar programcıya hız kazandıracak araçlardır.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;font-style:italic; color: #0279ff; font-size:18px&quot;&gt;Son Durum &amp; Karşılaştığımız Sorunlar&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;Gelelim şuanda projenin ne aşamada olduğu ve ne gibi sorunlarla karşılaştığımız kısmına. Projede şu anda çekirdek sınıf vasıtasıyla bir oyun işlemi başlatıp, sahne yöneticisi sınıfı vasıtasıyla istediğimiz sayıda birbirinden bağımsız sahneler üretebiliyoruz. Bu sahneler arasında gecikme olmaksızın anlık geçişler yapabiliyoruz. Çizdirilebilir nesne sayısı çok fazla olduğundan yavaşlayan bir sahne diğer bir sahneyi etkilememektedir. Sahneye eklediğimiz nesneleri kök düğüme ya da alt düğümlerine bağlayabiliyoruz. Böylelikle nesneleri grup olarak hareket ettirebiliyoruz. Kamera, ışık, model ve sabit nesneler sahneye eklebilmektedir. Uygulama başlatılmadan önce ayar penceresi gösterilerek seçilen ayarlar bir akış üzerinden kaydedilip okunabilmektedir.&lt;br /&gt;&lt;br /&gt;Bir kaç model ile oyun motorunun işlevsel sınamalarından bir kare.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnoU0_aMtua0a_lSXKloqM4WDzaXjSeQKRMTrXvxSoa29qhCSOu8JNIgwnVm5JpJLB8_vraUJ7A0mRNCBEtiEDRcTQ7HzUxAxYVUHsAcSuhLNUHcw4XDzO1Bzf6U3fZcuEc4gGLmhFws8/s1600/irem_ss2.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnoU0_aMtua0a_lSXKloqM4WDzaXjSeQKRMTrXvxSoa29qhCSOu8JNIgwnVm5JpJLB8_vraUJ7A0mRNCBEtiEDRcTQ7HzUxAxYVUHsAcSuhLNUHcw4XDzO1Bzf6U3fZcuEc4gGLmhFws8/s400/irem_ss2.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5595228418128345346&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Karşılaştığımız başlıca teknik sorun kurduğumuz yapıyı sürekli yeniden değiştirme gereği duymamızdır. Daha önce tecrübe edinmediğimiz için modern yapıları inceledikçe yeni yöntemler keşfedip, kendi projemizdeki eski yapıları atma ihtiyacı duyuyoruz. Sosyal açıdan en büyük sorun ekip çalışmasının getirdiği zorluklar olarak tarif edebilirim.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;font-style:italic; color: #0279ff; font-size:18px&quot;&gt;Geleceğe Dair Planlar&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;Projeye ileriki aşamalarda yapmak istediğim eklemeleri şu şekilde sıralayabilirim:&lt;br /&gt;&lt;br /&gt;- OpenGL desteği ile platform bağımsız tasarıma geçerek MacOS X, Linux, BSD, iPhone OS, PlayStation 3 gibi sistemlerde çalışmasını sağlamak.&lt;br /&gt;- Çok kanallı programlama desteği sağlamak&lt;br /&gt;- Shader desteği&lt;br /&gt;- Gerçek zamanlı 3D model ve sahne düzenleme aracı&lt;br /&gt;vs..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bir sonraki yazımda da projemizdeki yenilikleri ve gelişmeleri sizlerle paylaşmaya devam edeceğim. Esen kalın efendim...</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/6117332264926982253/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/6117332264926982253' title='3 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/6117332264926982253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/6117332264926982253'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2011/04/irem-oyun-motoru-calsmas-rapor-1.html' title='IREM Oyun Motoru Çalışması - Rapor 1'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ8bIaFvDAirOTVNikiogyHQxX_O9c_3U9BW5MBjhBlnjNypaJaH1jbTiY77G2aY1JI6Z7Go9oejRMFrzBXjWdF2w5vySJFDRRHWfvSmUf9Ka3ckAGGqBF-S-tTSKgNTKfFYeNSxlZuTw/s72-c/irem_game_engine_design_uml_2.png" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-5318589145032561141</id><published>2011-03-16T21:39:00.004+02:00</published><updated>2011-03-16T22:28:46.725+02:00</updated><title type='text'>Güvenlik ve Güvenilirlik Kavramları</title><content type='html'>Bilişim dünyasında genellikle karıştırılarak birbiri yerine kullanılan bu iki terimden kısaca bahsetmek istiyorum.&lt;br /&gt;&lt;br /&gt;- &lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;Güvenlik (Security) Nedir?&lt;/span&gt;&lt;br /&gt;Bilişimde güvenlik terimi, bir sistemin ihtiva ettiği bilginin veyahut sahip olduğu yetkilerin sistemin izni olmadan yetkisiz bir kişi ya da sistem tarafından kullanılmasının önüne geçilmesi olarak tarif edilebilir. Bunu sağlayamayan programlarda &quot;Güvenlik açığı vardır&quot; denir.&lt;br /&gt;&lt;br /&gt;- &lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;Güvenilirlik (Reliability) Nedir?&lt;/span&gt;&lt;br /&gt;Bilişimde güvenilirlik terimi, bir sistemin sürekliğinin ve kararlılığının her koşulda ve zamanda mutlak suretle sağlanmasıdır. Bunu sağlayamayan programlarda &quot;güvenilirlik sorunu vardır&quot; denir.&lt;br /&gt;&lt;br /&gt;Bu terimleri açıklamak istememin sebebi birbirine çok karıştırılıyor olmasıdır. Bir sistemi geliştirmek sistemli çalıştırmayı gerektirir, sistemli çalışmanın şartı da bireylerin birbirini doğru ve tam olarak anlamasından geçer. En basit örnek olarak bu iki terimi birbirine karıştıran bir programcı, &quot;programda güvenlik sorunu var!&quot; dediği zaman gizli bilgi ihlali olasılığından mı bahsediyor yoksa (beklenmeyen) ölümcül bir hata ile programın sonlanması ihtimali ile istikrar sorunundan mı bahsediyor doğrudan anlamak malesef mümkün değildir. &lt;br /&gt;&lt;br /&gt;Son olarak, güvenliği sağlamak için güvenilirliği sağlamak şarttır. Güvenilir olmayan (hata verme olasılığı olan) bir sistemin güvenlikli olması beklenemez. Güvenliğin temel şartı güvenilirliktir. Fakat tam tersini söylemek her zaman doğru değildir. Güvenliği sağlanmamış bir program yıllar boyunca istikrarlı bir şekilde (beklenmeyen) ölümcül bir hata vermeden çalışabilir. Çünkü güvenlik ihlalleri kişi ya da sistemler tarafından bilinçli olarak yapılan ve doğal olmayan eylemlerdir.&lt;br /&gt;&lt;br /&gt;Güvenirlir sistemler geliştirip güvenliğini sağlamanız dileğiyle...</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/5318589145032561141/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/5318589145032561141' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/5318589145032561141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/5318589145032561141'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2011/03/guvenlik-ve-guvenilirlik-kavramlar.html' title='Güvenlik ve Güvenilirlik Kavramları'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-1727170662935187800</id><published>2011-02-19T23:15:00.016+02:00</published><updated>2011-02-20T01:35:55.486+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cryptography"/><title type='text'>Şifrelemenin Kanunları - Bölüm 1.2</title><content type='html'>&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;1.3 Kümeler&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bir küme, herhangi iki elemandan eşsiz bir üçüncü elemanı türetmek için bir ikili işleme (binary operation) sahip bir takım küme elemanlarıdır. Eğer küme işlemini # işareti ile gösterecek olursak, yukarıda söylenen herhangi bir küme elemanı olan a ve b için, a#b tanımlıdır ve hatta bir kümenin elemanıdır. Ayrıca kümeler çağrışımsaldır yani a, b ve c kümenin herhangi birer elemanı olsun, a#(b#c) = (a#b)#c&#39;dir. Kümenin herhangi bir elemanı olan a için bir adet birim (etkisiz) eleman (e) olmalıdır, a#e = e#a = a. Son olarak herhangi bir eleman olan a&#39;nın bir tane tersi (a&#39;) olmalıdır, a#a&#39; = a&#39;#a = e.&lt;br /&gt;&lt;br /&gt;Kümenin tüm elemanları olabilen a ve b için eğer a#b = b#a ise bu küme değişme özelliğine sahiptir. Aksi halde değişme özelliği yoktur. Şu noktaya dikkat çekelim, değişme özelliğine sahip olmayan bir küme için bazı durumlarda a#b = b#a eşitliği doğru olabilir - örneğin a ya da b birim eleman olursa.&lt;br /&gt;&lt;br /&gt;Sınırlı sayıda eleman içeren kümeye sınırlı küme, aski durumda sınırsızdır denir.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;Örnekler:&lt;/span&gt;&lt;br /&gt;1. Tam sayılar (tüm sayılar, 0 ve negatif sayılar) adi toplama işlemiyle bir küme oluştursunlar. Birim eleman 0 olur ve a&#39;nın tersi -a olur. Bu sınırsız ve değişebilen bir kümedir.&lt;br /&gt;2. Pozitif rasyonel sayılar (tüm pozitif tam sayılar da dahil olmak üzere tüm pozitif kesirler) adi çarpma işlem olarak bir küme oluştursun. Birim eleman 1 sayısı ve r&#39;nin tersi 1/r = r^-1. Bu da diğer bir sınırsız değişebilen kümedir.&lt;br /&gt;3. Tam sayıların n ile modu, n &gt; 0 herhangi bir tam sayı olmak üzere bir küme oluştursun. Bu küme genelde Z(n) (&lt;span style=&quot;color: #00FF00;&quot;&gt;Çevirmenin yorumu:&lt;/span&gt; asal belgede n, Z&#39;nin sağ altında gösterilmektedir, bu çeviride parantez içerisinde gösterilecektir.) şeklinde gösterilir. Elemanlar 0, 1, 2, ..., n-1 ve işlem toplamanın n ile bölümünden kalan şeklindedir:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSaODa3q7eTBMiv665pjmbl93nTzzawMgZCPSdcELroA-rtyGv7vHV0ZnuWJ2CdgHnhzslZ8sLYwfNwvnyuhE7DDx9DIgkCKMzvbvWUvbVZzj1ERBprGI68tKEGuX2cVuZSKPyUDdtgTY/s1600/groups1.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 312px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSaODa3q7eTBMiv665pjmbl93nTzzawMgZCPSdcELroA-rtyGv7vHV0ZnuWJ2CdgHnhzslZ8sLYwfNwvnyuhE7DDx9DIgkCKMzvbvWUvbVZzj1ERBprGI68tKEGuX2cVuZSKPyUDdtgTY/s400/groups1.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5575522702664497522&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Birim eleman 0 sayısıdır ve a&#39;nın tersi n-a&#39;dır (tersi kendisi olan 0 sayısı hariç).&lt;br /&gt;&lt;br /&gt;4. Değişemeyen kümeye örnek olarak, 2&#39;ye 2 tekil olmayan gerçek (reel) sayılardan (ya da rasyonel sayılardan) oluşan matrisler düşünelim, işlem matris çarpmasıdır:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi775iIhJGEHX8DJxUv00pNfHaL_-LiogCiXRKGrcQYsZp27BlgUK10im81tVCStBT_vhSXnJqlQfljleU7x93Hxg_mfQSNuXJK6f-Y1nwkLozgnbXvBQG0PojpqVdiUoBgRhv6DeilPqY/s1600/groups2.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 115px; height: 71px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi775iIhJGEHX8DJxUv00pNfHaL_-LiogCiXRKGrcQYsZp27BlgUK10im81tVCStBT_vhSXnJqlQfljleU7x93Hxg_mfQSNuXJK6f-Y1nwkLozgnbXvBQG0PojpqVdiUoBgRhv6DeilPqY/s400/groups2.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5575523865189517922&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Buradaki a, b, c ve d gerçek sayılardır (ya da rasyonel) ve ad-bc sıfır değildir. İşlem matris çarpmasıdır. Yukarıdaki matrisin tersi&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDj4bTh4gAosC6Y7s2B_8vxskLlnN4luop3TKUGRBYPoE5PunqaX1LAxmYfojuiL9x3etPCK61LV8jIQ6wrGgC0idnS8udfMm0fNQ7uByXNBtJwShN0N0hKWv1x6AqvL7ajkOeSIMkb1Y/s1600/groups3.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 220px; height: 84px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDj4bTh4gAosC6Y7s2B_8vxskLlnN4luop3TKUGRBYPoE5PunqaX1LAxmYfojuiL9x3etPCK61LV8jIQ6wrGgC0idnS8udfMm0fNQ7uByXNBtJwShN0N0hKWv1x6AqvL7ajkOeSIMkb1Y/s400/groups3.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5575524472105010834&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ve birim elemanı&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZTjZmRoqrctMurkL4PJwyniZEY4zG1n-flbro4-ewp6F2DPH8Z3McZYuQsS44XihOxfdekriQKeA26RDG9sRYgh0kYXPYdXxLaeVfc0LImeIzxrSHl4SXt4Xn_2FHUoIqFHypTiwttko/s1600/groups4.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 119px; height: 71px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZTjZmRoqrctMurkL4PJwyniZEY4zG1n-flbro4-ewp6F2DPH8Z3McZYuQsS44XihOxfdekriQKeA26RDG9sRYgh0kYXPYdXxLaeVfc0LImeIzxrSHl4SXt4Xn_2FHUoIqFHypTiwttko/s400/groups4.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5575524691780455682&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Bu bir sınırsız değişemeyen bir kümedir.&lt;br /&gt;&lt;br /&gt;5. Ondalıklı sayıların bir bölümü sınırlı değişemez kümelere ilginç ve faydalı bir örnek olarak verilebilir: on elemanlı &lt;span style=&quot;color: #FF0000;&quot;&gt;dihedral&lt;/span&gt; (&lt;span style=&quot;color: #00FF00;&quot;&gt;Çevirmenin yorumu:&lt;/span&gt; kelime aslı gibidir, kısaca uçak kanatlarının yatay düzlemle yaptığı açıya denir, detaylı bilgi için bkz: [1] &lt;a href=&quot;http://en.wikipedia.org/wiki/Dihedral_group&quot;&gt;http://en.wikipedia.org/wiki/Dihedral_group&lt;/a&gt;, [2] &lt;a href=&quot;http://tr.wikipedia.org/wiki/Dihedral&quot;&gt;http://tr.wikipedia.org/wiki/Dihedral&lt;/a&gt;) kümesi.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #FF0000;&quot;&gt;KANUN KÜME-1: Şifrecilerin gözde kümesi, tam sayıları n ile mod alandır, Z(n).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;n = 10&#39;a özel olarak, Z(10)&#39;da toplama işlemi (x+y) mod 10 şeklinde tanımlanabilir, bu, 10&#39;a böl ve kalanını al demektir. Tablo 1.3 nasıl olduğunu göstermektedir ve ayrıca 10 sayısı ile mod alınan tam sayıların toplama tablosu olarak da kullanılabilir.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;1.4 Alanlar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bir alan içerisinde bir çok yapıyı bulunduran bir nesnedir ki bu bölüm yalnızca bir özet niteliğindedir. Bir alan iki işleme sahiptir, bunları + ve * (adi toplama ve çarpma olmak zorunda olmamasına rağmen) olarak adlandıralım. +&#39;yı kullanırsak, alanın tüm elemanları değişebilen bir küme kuracaktır. Bu kümenin birim elemanını 0 olarak ve a&#39;nın tersini -a olarak gösterelim. *&#39;yı kullanırsak, 0 hariç alanın tüm elemanları, birim elemanı 1 ile ve a&#39;nın tersi a^-1 ile gösterilen başka bir değişebilen küme oluşturacaktır. (0 elemanının * işlemi altında tersi yoktur.) Ayrıca bir de dağılma özelliğine sahiptir, + ya da * ile bağlandığında: a*(b+c) = (a*b) + (a*c), a,b ve c tüm elemanlar için. Son olarak birşeyi hariç tutmalıyız, sıfıra bölünenler, bunlar sıfır üreten sıfır olamayan elemanlardır. Bu aşağıdaki fesih neteliğine eşdeğerdir:&lt;br /&gt;eğer c sıfır değilse ve a*c = b*c ise a = b &#39;dir. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;Örnekler:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. Rasyonel sayıları (kesirler) Q olarak düşünelim, ya da gerçek sayıları R olarak, ya da karmaşık sayıları C olarak, bunlarda adi toplama ve çarpma işlemi kullanmak ( son durumda karmaşık sayılar dahil edilmiştir). Bunların tümü sınırsız alanlardır.&lt;br /&gt;&lt;br /&gt;2. Tam sayıların p ile mod alındığını düşünelim, Z(p) olarak gösterilsin, p bir asal sayı olsun (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, ...). Bunu + kullanan bir küme olarak görelim (adi toplamanın ardından p&#39;ye bölümünden kalandır). 0 olan elemanlar * altıda bulunmadığı bir küme oluşacaktır (p&#39;ye bölümünden kalanın ardıdan yapılan adi çarpmadır). Burada birim eleman belirgin olarak 1&#39;dir, ama sıfır olmayan a elemanının tersi açık değildir. Java&#39;da tersi, (x*a)%p==1 olan bir x elemanı olmalıdır. Sayılar teorisinde genişletilmiş Öklit Algotirması olarak bilinen bir algoritma kullanılarak eşsiz bir x elemanı bulmak her zaman mümkündür. Bir sonraki bölümün bu başlığında, özet olarak: p&#39;nin asal sayı olması ve a&#39;nın sıfırdan farklı olması sebebiyle, p ve a&#39;nın en büyük ortak bölenleri 1&#39;dir. Şimdi genişletilmiş Öklit algoritması, x*a + y*p = 1 ya da x*a = 1 - y*p sağlayan x ve y sıradan tam sayılarını verecektir, ve bu bize eğer x*a&#39;yı p&#39;ye bölersen 1 kalanını alırsın demektedir, böylece bu x, a&#39;nın tersi olur. ( Bir tam sayı olarak, x negatif olabilir, ve bu durumda Z(p)&#39;nin bir elemanını alabilmesi için ona p eklenmelidir.)&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #FF0000;&quot;&gt;KANUN ALAN-1: Şifrecilerin gözde alanı p&#39;nin asal olduğu Z(p) ile gösterilen tamsayıların p ile modunu alandır.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Yukarıdaki alan p elemanlı olarak tektir. Diğer bir değişle, alan elemanlarının yeniden adlandırılmasıyla eşsizdir, yani alanın elemanları her zaman için bir başka işaret takımıyla gösterilebilir, fakat temel olarak aynıdır. &lt;br /&gt;&lt;br /&gt;Ayrıca GF(p^n) şeklinde gösterilen, p^n&#39;in elemanlarından herhangi birisi için n&gt;1 geçerli olan eşsiz sınırlı bir alan daha vardır. Bilhassa şifrelemede p=2 özel durumu çok işe yarar. Bu durumda, n&gt;1 olamak üzere 2^n adet eleman vardır. 2^8 = 256 durumu, örnek olarak, yeni Birleşmiş Milletler Gelişmiş Şifreleme Ölçünü&#39;nünde (U.S. Advanced Encryption Standart - AES) kullanılmıştır. Bunu anlatmak Z(p) alanını anlatmaktan daha zordur. AES için çarma işlemi hakkındaki bölüm bu alanı daha detaylı anlatacaktır, fakat burada bazı özelliklerini özetlemek gerekirse: 256 tane elemanı vardır, 8-bitlik olası tüm katarları ifade eder. Bu alanda toplama bitsel özel veya (XOR) ya da yine bitsel olarak toplamanın mod 2 işlemiyle aynıdır. Sıfır elemanı 00000000&#39;dır, ve birim eleman 00000001&#39;dır. Şimdiye kadar iyi gittik, fakat çarma yapmak daha bir sorunlu: bir eleman, Z(p) alanında katsayılar içeren 7. dereceden bir polinomu ifade etmelidir (bir 0 ya da 1)ve bu polinomların özel bir çarpma hali kullanımalıdır. Ayrıntılar AES üzerine olan sonraki bölümde gelecektir.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #FF0000;&quot;&gt;KANUN ALAN-2: Şifrecilerin diğer bir gözde alanı GF(2^n)&#39;dır.&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/1727170662935187800/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/1727170662935187800' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/1727170662935187800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/1727170662935187800'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2011/02/sifrelemenin-kanunlar-bolum-12.html' title='Şifrelemenin Kanunları - Bölüm 1.2'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSaODa3q7eTBMiv665pjmbl93nTzzawMgZCPSdcELroA-rtyGv7vHV0ZnuWJ2CdgHnhzslZ8sLYwfNwvnyuhE7DDx9DIgkCKMzvbvWUvbVZzj1ERBprGI68tKEGuX2cVuZSKPyUDdtgTY/s72-c/groups1.PNG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-3549786294073616040</id><published>2011-01-13T23:25:00.021+02:00</published><updated>2011-01-17T00:49:55.332+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cryptography"/><title type='text'>Şifrelemenin Kanunları - Bölüm 1</title><content type='html'>&lt;span style=&quot;font-weight:bold; font-size:20px; color: #0279ff;&quot;&gt;Şifrecilerin Gözdeleri&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;1.1 Özel Veya (XOR)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Özel veya olarak bilinen bu fonksiyon aynı zamanda xor olarak ya da bir daire içerisindeki artı işareti (+) olarak da gösterilebilir. a (+) b demek a ya da b fakat ikisi birden değil demektir. Matematikte normal veya (or) demek biri ya da diğeri veyahut ikisi birden demektir. Özel veya işlevi (function) C/C++/Java dillerinde mevcut olup şapka karakteri ^ ile ifade edilmektedir. (Dikkatli olun: şapka karakteri sık sık üstel ifadeler için kullanılır, fakat Java, C ve C++ dillerinde herhangi bir üstel operatör yoktur.) Java&#39;da ayrıca özel veya mantıksal değişkenlerde de (boolean) kullanılabilmektedir. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #FF0000;&quot;&gt;KANUN XOR-1: Şifrecilerin gözde işlevi özel veyadır.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Özel veya şifrelemede devamlı olarak kullanılır. Bu işlev tek-seferlik şifrelemede, akış şifrelemesinde ve Gelişmiş Şifreleme Ölçünü (AES) ve bir çok yerde kullanılmaktadır.&lt;br /&gt;&lt;br /&gt;Hatırlayalım, mantıksal sabit doğru (true) genellikle 1 olarak yanlış (false) ise 0 olarak yazılır. Özel veya toplama işlemi sonucunda mod 2 işlemini yapmakla aynıdır, yani sıradan bir toplama işlemini yaptıktan sonra sonucu 2 sayısına bölüp kalanı alma işlemidir. 0 ve 1 bit değerleri için aşağıdaki tabloda özel veya işlemi sonuçları verilmiştir.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj37yO5_3QU0cDqb62jZgV1E5Vny0yKXPNPVMcbYRy7Pv20U0e5CZPPgsXCtM1ICpoJ-a07fSPyaChu3_I6Xrvwv1eAhsCg2lXidUqEBVfeBS0GTl2jL6CkmkBioJNM6o64Pk_6RcaUDn0/s1600/xor1.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 317px; height: 231px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj37yO5_3QU0cDqb62jZgV1E5Vny0yKXPNPVMcbYRy7Pv20U0e5CZPPgsXCtM1ICpoJ-a07fSPyaChu3_I6Xrvwv1eAhsCg2lXidUqEBVfeBS0GTl2jL6CkmkBioJNM6o64Pk_6RcaUDn0/s400/xor1.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5561794029305857810&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Özel veya işlevinin bir çok ilginç özelliği vardır, a,b ve c bit değerlerini ya da dizilerini tutsun:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5HU-e3fT2dGl_E-7e4DTf_Q5JUhCJURqglpOHaIPimvqayTDSfabDhCRouX6lVWSrfKbwkmcRClBRS4hegDKoQzRK1ZllNRVBApBuI6iK2n4ENj5aT-mwMrAbzPS-1-gfoLprFWup_QE/s1600/xor2.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 272px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5HU-e3fT2dGl_E-7e4DTf_Q5JUhCJURqglpOHaIPimvqayTDSfabDhCRouX6lVWSrfKbwkmcRClBRS4hegDKoQzRK1ZllNRVBApBuI6iK2n4ENj5aT-mwMrAbzPS-1-gfoLprFWup_QE/s400/xor2.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5562893574019288658&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Yeni başlayan programcılar iki değişkenin değerini değiş tokuş yapmak için üçüncü bir geçici değişkene atama yaparak öğrenirler:&lt;br /&gt;&lt;br /&gt;temp = a;&lt;br /&gt;a = b;&lt;br /&gt;b = temp;&lt;br /&gt;&lt;br /&gt;Aynı sonucu xor işlevini kullanarak ek olarak üçüncü bir geçici alan ayırmadan gerçekleştirilebilir. a ve b değerlerinin bit dizileri olsun.&lt;br /&gt;&lt;br /&gt;a = a xor b;&lt;br /&gt;b = a xor b;&lt;br /&gt;a = a xor b;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;border-color: #0279ff; border-width:thin; border-style:solid; padding:0px;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:italic; color: #00DD00; font-size:14px;&quot;&gt;Çevirmenin yorumu:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2bIl9WUp5Wwd9QIBkKUL0e_haugYBTSeo8IC7bsBYNfF3uzKt5jTwQ-6Vx5rgrAyjf0m3Fu7pv20hg3nNBNALhEN4ifUaoEKLLsDiOy2hwJVuugyWxeGQdiM9woqLq8U7Hn2X-juL8IM/s1600/xor3.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 282px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2bIl9WUp5Wwd9QIBkKUL0e_haugYBTSeo8IC7bsBYNfF3uzKt5jTwQ-6Vx5rgrAyjf0m3Fu7pv20hg3nNBNALhEN4ifUaoEKLLsDiOy2hwJVuugyWxeGQdiM9woqLq8U7Hn2X-juL8IM/s400/xor3.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5562897285540052290&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Özel veya işlevinin şifrelemede kullanımına örnek verecek olursak, xor işlevi sözde rastgele bit akışı olan ri ile şifrelenecek mesajımızın bitlerini içeren mi akışını alsın ve şifrelenmiş halinin ci akışı olarak çıkartsın ci = ri (+) mi. Şifrelenmiş veriyi çözümlemek için aynı sözde rastsal bit akışını (yani ri) ci&#39;ye vererek mi akışını elde ederiz. ri (+) ci = ri (+) ri (+) mi = 0 (+) mi = mi, Şekil 1.1 (Figure 1.1) bu işlem gösterilmiştir.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #FF0000;&quot;&gt;KANUN XOR-2: Şifreciler özel veya işlevini çok sever çünkü ivedi bir şifreleme mekanizması sağlar.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;1.2 Logaritma&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tanım olarak, y = logb(x) demek b^y = x (b üssü y eşittir x). Bir başka değişle: &quot;y, b tabanında x&#39;in logaritmasıdır&quot; ya da &quot;y, x&#39;in taban b&#39;deki logaritmasıdır&quot; denir. Aynı zamanda logb(x) (yani y) ifadesinin b üssü şeklinde yazılarak x değeri elde edilebilir, b^(logb(x)) = x. Daha matematiksel bir ifadeyle logaritma, üssel işlevin (exponential) tersi bir işlevdir.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #FF0000;&quot;&gt;KANUN LOG-1: Şifrecilerin gözde logaritma işlevi 2 tabanında logaritmadır.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Şifrelemede logaritma 2 tabanındanın kullanılmasının bir sebebi de (çoğunlukla bilgisayar biliminde) bu alanda ikili (binary) sayı düzenine yoğunlaşılmış olmasıdır.&lt;br /&gt;Öyle ise y = log2(x) demek 2^y=x demekle aynı ve logaritma 2 tabanında x&#39;in 2 üssü şeklinde yazımından x&#39;i elde ederiz. Şekillerle ifade edersek: eğer y = log2(x) ise o zaman x = 2^y = 2^(log2(x)). Öyle ise 2^10 = 1024 demek log2(1024)=10 demekle aynı. Fark ettiyseniz tüm y değerleri için 2^y&gt;0 ve tersten gidersek log2(x) x&lt;=0 olduğunda tanımsızdır.&lt;br /&gt;&lt;br /&gt;Logaritmayı içeren bir kaç formül:&lt;br /&gt;&lt;br /&gt;log2(ab) = log2(a) + log2(b), her a,b &gt; 0&lt;br /&gt;log2(a/b) = log2(a) - log2(b), her a,b &gt; 0&lt;br /&gt;log2(1/a) = log2(a^(-1)) = - log2(a), her a &gt; 0&lt;br /&gt;log2(a^r) = r log2(a), her a &gt; 0, r&lt;br /&gt;log2(a+b) = (Ups! Bunun için basit bir formül yok.)&lt;br /&gt;Tablo 1.2 log2 için bir kaç örnek vermektedir.&lt;br /&gt;&lt;br /&gt;Bazı hesap makineleri, Java gibi diller de dahil, doğrudan log2 işlevini desteklemiyorlar. Java 10 tabanından logaritmayı da desteklemiyor yalnızca e tabanında logaritmayı destekliyor ki buna &quot;doğal&quot; logaritma diyoruz. Logaritma 2 tabanında a ile logaritma e tabanında a çarpımının sonucu bir sabit olduğu için eğer &quot;sihirli&quot; sabiti biliyorsanuz bu sonucu hesaplamak çok kolay olacaktır. Formül şöyle:&lt;br /&gt;&lt;br /&gt;log2(x) = loge(x) / loge(2) (matematik)&lt;br /&gt; = Math.log(x)/Math.log(2.0); (Java)&lt;br /&gt;&lt;br /&gt;Sihirli sabit: loge(2) = 0.69314 71805 59945 30941 72321, yada 1/loge(2) = 1.44269 50408 88963 40735 99246. (Benzer şekilde, log2(x) = log10(x)/log10(2) ve log10(2) = 0.30102999566398114.)&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihqSmwK9yLlVIZkp5SJkYC4qoGH3awKHSjBpNLR4B793ReccedEBBE249oU1FYuMbFGI04iHgXITCm_o2D3iBYZ2rtjFzdO2-zX0HNpl54Jdz6kudiTPseYqoa4dAuQp6oJTilR7BwWJM/s1600/log1.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 230px; height: 400px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihqSmwK9yLlVIZkp5SJkYC4qoGH3awKHSjBpNLR4B793ReccedEBBE249oU1FYuMbFGI04iHgXITCm_o2D3iBYZ2rtjFzdO2-zX0HNpl54Jdz6kudiTPseYqoa4dAuQp6oJTilR7BwWJM/s400/log1.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5562912627328484338&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Yukarıdaki formülün ispatı şöyle:&lt;br /&gt;&lt;br /&gt;2^y = x, ya da y = log2(x)  -&gt; her iki tarafında e tabanında logaritmasını alalım&lt;br /&gt;loge(2^y) = loge(x)&lt;br /&gt;y loge(2) = loge(x)&lt;br /&gt;y = loge(x) / loge(2)&lt;br /&gt;log2(x) = loge(x) / loge(2)&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #FF0000;&quot;&gt;KANUN LOG-2: Bir tam sayının 2 tabanında logaritmasını almak, bize o sayıyı ikili düzende (binary) kaç tane bit ile ifade edebileceğimizi söyler.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Buna göre log2(10000) = 13.28771238, yani iki düzende bu sayıyı ifade etmek için 14 tane bit gereklidir. (Gerçektende, 10000(10) = 10011100010000(2).) İkinin tam katlarının özel bir durumu vardır: log2(1024) = 10 fakat bu sayıyı ikili düzende ifade etmek için 11 adet bit gerekmektedir. 10000000000(2).&lt;br /&gt;&lt;br /&gt;Benzer şekilde, log10(x) bize onluk sistemde bu sayıyı ifade etmek için kaç tane raka kullanmamız gerektiğini söyleyecektir.</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/3549786294073616040/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/3549786294073616040' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/3549786294073616040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/3549786294073616040'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2011/01/sifrelemenin-kanunlar-bolum-1.html' title='Şifrelemenin Kanunları - Bölüm 1'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj37yO5_3QU0cDqb62jZgV1E5Vny0yKXPNPVMcbYRy7Pv20U0e5CZPPgsXCtM1ICpoJ-a07fSPyaChu3_I6Xrvwv1eAhsCg2lXidUqEBVfeBS0GTl2jL6CkmkBioJNM6o64Pk_6RcaUDn0/s72-c/xor1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-5866503572517139649</id><published>2011-01-12T01:17:00.003+02:00</published><updated>2011-01-12T01:50:06.245+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cryptography"/><title type='text'>The Laws of Cryptography</title><content type='html'>Hi, this is my first translation project in cryptography. I am very glad to say that I started to translate the masterpiece of Mr. Neal R. Wagner (&lt;a href=&quot;http://www.cs.utsa.edu/~wagner/&quot;&gt;http://www.cs.utsa.edu/~wagner/&lt;/a&gt;) who is Retired as Assoc. Prof. from UTSA ( The University of Texas at San Antonio - &lt;a href=&quot;http://www.cs.utsa.edu/&quot;&gt;http://www.cs.utsa.edu/&lt;/a&gt;) which is called The Laws of Cryptography (&lt;a href=&quot;http://www.cs.utsa.edu/~wagner/lawsbookcolor/laws.pdf&quot;&gt;http://www.cs.utsa.edu/~wagner/lawsbookcolor/laws.pdf&lt;/a&gt;) into Turkish. I asked him for the permission to translate his book into Turkish by a personal email conversation. It is an honor for me to do this important job. My purpose is making people who live in Turkey as an computer engineer paying attention to cryptography a little. Although, he emphasized on importance of English in cryptograpy, I would like to translate a part of the book. Because somebody has to trigger it. I hope I will succeed.&lt;br /&gt;&lt;br /&gt;Thank you again Mr. Neal R. Wagner.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;Merhaba, bu benim şifreleme alanındaki ilk çeviri projem. Şunu söylemekten çok mutluyum ki Texas Üniversitesinde görev almış emekli Profesör Sayın Neal R. Wagner&#39;ın şaheseri diyebileceğimiz Şifrelemenin Kanunları isimli kitabını Türkçe&#39;ye çevirmeye başladım. Kendisinden kişisel bir eposta görüşmesiyle kitabının Türkçe&#39;ye çevirilme iznini istedim. Bu çeviriyi gerçekleştirmek benim için bir onurdur. Amacım Türkiye&#39;de yaşayan bilgisayar mühendisi arkadaşlarımın ilgilisini biraz olsun şifreleme alanına çekebilmektir. Kendisinin bana şifrelemede İngizce&#39;nin önemini vurgulamasına rağmen, kitabının bir kısmını çevirmek istiyorum. Çünkü birileri bu işi başlatmalı. Umarım başarabilirim.&lt;br /&gt;&lt;br /&gt;Sayın Neal R. Wagner&#39;a tekrar teşekkür ederim.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;Not: Çevirileri ilerleme kaydettikçe bölüm bölüm girdi yapacağım. Kendilerinin de izniyle bazı kısımlarda kendi yorum ve eklemelerim olabilir.</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/5866503572517139649/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/5866503572517139649' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/5866503572517139649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/5866503572517139649'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2011/01/laws-of-cryptography.html' title='The Laws of Cryptography'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-3737269601225120595</id><published>2010-12-22T01:34:00.002+02:00</published><updated>2010-12-22T01:36:23.400+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3d"/><category scheme="http://www.blogger.com/atom/ns#" term="assembly"/><category scheme="http://www.blogger.com/atom/ns#" term="c++"/><category scheme="http://www.blogger.com/atom/ns#" term="cpu"/><category scheme="http://www.blogger.com/atom/ns#" term="directx"/><category scheme="http://www.blogger.com/atom/ns#" term="game"/><category scheme="http://www.blogger.com/atom/ns#" term="game engine"/><category scheme="http://www.blogger.com/atom/ns#" term="gpu"/><category scheme="http://www.blogger.com/atom/ns#" term="opengl"/><title type='text'>Oyun Programlama Seminerleri (5. Oturum)</title><content type='html'>&lt;object width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/p/7A45499D2C987748?hl=en_US&amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/p/7A45499D2C987748?hl=en_US&amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;480&quot; height=&quot;385&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;About this playlist&lt;br /&gt;&lt;br /&gt;9 videos&lt;br /&gt;Total length: 1 hour, 26 minutes&lt;br /&gt;&lt;br /&gt;Description: Sakarya Üniversitesi Bilgisayar Mühendisliği 3 Boyutlu Oyun Motoru Programlama Seminerleri 5. Oturumu &lt;br /&gt;Oturum Konusu: OpenGL &lt;br /&gt;Toplam Uzunluk: 01:30:30</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/3737269601225120595/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/3737269601225120595' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/3737269601225120595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/3737269601225120595'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2010/12/oyun-programlama-seminerleri-5-oturum.html' title='Oyun Programlama Seminerleri (5. Oturum)'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-6547764043730324598</id><published>2010-12-21T00:59:00.005+02:00</published><updated>2010-12-22T01:38:06.786+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3d"/><category scheme="http://www.blogger.com/atom/ns#" term="assembly"/><category scheme="http://www.blogger.com/atom/ns#" term="c++"/><category scheme="http://www.blogger.com/atom/ns#" term="cpu"/><category scheme="http://www.blogger.com/atom/ns#" term="directx"/><category scheme="http://www.blogger.com/atom/ns#" term="game"/><category scheme="http://www.blogger.com/atom/ns#" term="game engine"/><category scheme="http://www.blogger.com/atom/ns#" term="gpu"/><category scheme="http://www.blogger.com/atom/ns#" term="opengl"/><title type='text'>Oyun Programlama Seminerleri (4. Oturum)</title><content type='html'>&lt;object width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/p/1B8A3BA4AEBC9D78?hl=en_US&amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/p/1B8A3BA4AEBC9D78?hl=en_US&amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;480&quot; height=&quot;385&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;About this playlist&lt;br /&gt;&lt;br /&gt;9 videos&lt;br /&gt;Total length: 1 hour, 31 minutes&lt;br /&gt;&lt;br /&gt;Description: &lt;br /&gt;Sakarya Üniversitesi Bilgisayar Mühendisliği 3 Boyutlu Oyun Motoru Programlama Seminerleri 4. Oturumu &lt;br /&gt;Oturum Konusu: Sayısal Sistemler ve Sistem Programlama &lt;br /&gt;Toplam Uzunluk: 01:31:46</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/6547764043730324598/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/6547764043730324598' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/6547764043730324598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/6547764043730324598'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2010/12/oyun-programlama-seminerleri-4-oturum.html' title='Oyun Programlama Seminerleri (4. Oturum)'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-2283610660839821568</id><published>2010-12-05T00:30:00.006+02:00</published><updated>2012-04-17T22:27:22.103+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3d"/><category scheme="http://www.blogger.com/atom/ns#" term="c++"/><category scheme="http://www.blogger.com/atom/ns#" term="drawing text"/><category scheme="http://www.blogger.com/atom/ns#" term="glut"/><category scheme="http://www.blogger.com/atom/ns#" term="glutbitmapcharacter"/><category scheme="http://www.blogger.com/atom/ns#" term="opengl"/><category scheme="http://www.blogger.com/atom/ns#" term="rasterpos2i"/><category scheme="http://www.blogger.com/atom/ns#" term="SDL"/><title type='text'>Drawing a Text on Screen in an OpenGL Application</title><content type='html'>&lt;object width=&quot;640&quot; height=&quot;505&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/elE__Nouv54?fs=1&amp;amp;hl=en_US&amp;amp;hd=1&amp;amp;color1=0x234900&amp;amp;color2=0x4e9e00&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/elE__Nouv54?fs=1&amp;amp;hl=en_US&amp;amp;hd=1&amp;amp;color1=0x234900&amp;amp;color2=0x4e9e00&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;640&quot; height=&quot;505&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;Drawing a text on screen is a very general problem when you first start OpenGL. Conversely, it is simple to implement. I tried to make it possible with a little function as I show in the video above. Please note that it is required GLUT library to generate fonts. Do not forget to include to your project. I used SDL to manage Windows but it is optional for you.&lt;br /&gt;&lt;br /&gt;Here is the code:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: cpp&quot;&gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;lt;Windows.h&amp;gt;&lt;br /&gt;#include &amp;lt;SDL.h&amp;gt;&lt;br /&gt;#include &amp;lt;gl\GL.h&amp;gt;&lt;br /&gt;#include &amp;lt;gl\GLU.h&amp;gt;&lt;br /&gt;#include &amp;lt;glut.h&amp;gt;&lt;br /&gt;#include &amp;lt;math.h&amp;gt;&lt;br /&gt;#include &amp;lt;cstring&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#pragma comment(lib,&quot;opengl32.lib&quot;)&lt;br /&gt;#pragma comment(lib,&quot;glu32.lib&quot;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; Drawing text 2D screen.&lt;br /&gt;*/&lt;br /&gt;void drawText(const char *text, int length, int x, int y){&lt;br /&gt; glMatrixMode(GL_PROJECTION); // change the current matrix to PROJECTION&lt;br /&gt; double matrix[16]; // allocate 16-byte in memory (thanks to BlueByteGames about memory-leak warning comment on YouTube)&lt;br /&gt; glGetDoublev(GL_PROJECTION_MATRIX, matrix); // get the values from PROJECTION matrix to local variable&lt;br /&gt; glLoadIdentity(); // reset PROJECTION matrix to identity matrix&lt;br /&gt; glOrtho(0, 800, 0, 600, -5, 5); // orthographic perspective&lt;br /&gt; glMatrixMode(GL_MODELVIEW); // change current matrix to MODELVIDE matrix again&lt;br /&gt; glLoadIdentity(); // reset it to identity matrix&lt;br /&gt; glPushMatrix(); // push current state of MODELVIEW matrix to stack&lt;br /&gt; glLoadIdentity(); // reset it again. (may not be required, but it my convention&lt;br /&gt; glRasterPos2i(x, y); // raster position in 2D&lt;br /&gt; for(int i=0; i&amp;lt;length; i++){&lt;br /&gt;  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, (int)text[i]); // generation of characters in our text with 9 by 15 GLU font&lt;br /&gt; }&lt;br /&gt; glPopMatrix(); // get MODELVIEW matrix value from stack&lt;br /&gt; glMatrixMode(GL_PROJECTION); // change current matrix mode to PROJECTION&lt;br /&gt; glLoadMatrixd(matrix); // reset&lt;br /&gt; glMatrixMode(GL_MODELVIEW); // change current matrix mode to MODELVIEW&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void DrawScreen(SDL_Surface* screen, int h)&lt;br /&gt;{ &lt;br /&gt; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);&lt;br /&gt; &lt;br /&gt; gluLookAt(0,0,-10, 0,0, 3, 0, 1, 0);&lt;br /&gt;&lt;br /&gt; glColor3f(1,0,0);&lt;br /&gt;&lt;br /&gt; glBegin(GL_LINES);&lt;br /&gt; glVertex3f(0,0,0);&lt;br /&gt; glVertex3f(1,0,0);&lt;br /&gt; glEnd();&lt;br /&gt; &lt;br /&gt; std::string text;&lt;br /&gt; text = &quot;This is a simple text.&quot;;&lt;br /&gt; glColor3f(0, 1, 0);&lt;br /&gt; drawText(text.data(), text.size(), 50, 200);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; SDL_GL_SwapBuffers();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static void reshape(int width, int height)&lt;br /&gt;{&lt;br /&gt; GLfloat h = (GLfloat) height / (GLfloat) width;&lt;br /&gt; glViewport(0, 0, (GLint) width, (GLint) height);&lt;br /&gt; glMatrixMode(GL_PROJECTION);&lt;br /&gt; glLoadIdentity();&lt;br /&gt; gluPerspective( 45.0, h, 1.0, 1000.0 ); &lt;br /&gt; glMatrixMode(GL_MODELVIEW);&lt;br /&gt; glLoadIdentity();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;SDL_Surface *surface;&lt;br /&gt;int main(int argc, char **argv)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt; if (SDL_Init(SDL_INIT_VIDEO || SDL_INIT_AUDIO)&amp;lt;0)&lt;br /&gt; {&lt;br /&gt;  return 1;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; surface = SDL_SetVideoMode(800, 600, 32, SDL_OPENGL | SDL_RESIZABLE | SDL_DOUBLEBUF);&lt;br /&gt; glShadeModel(GL_SMOOTH);&lt;br /&gt; glEnable(GL_DEPTH_TEST);&lt;br /&gt; glDepthFunc(GL_LEQUAL);&lt;br /&gt;&lt;br /&gt; glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; glLineWidth(1.5f);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; glMatrixMode(GL_MODELVIEW);&lt;br /&gt;&lt;br /&gt; reshape(800,600);&lt;br /&gt; SDL_Event event;&lt;br /&gt;&lt;br /&gt; int keypress = 0;&lt;br /&gt; int h=0; &lt;br /&gt;&lt;br /&gt; while(!keypress) &lt;br /&gt; {&lt;br /&gt;&lt;br /&gt;  while(SDL_PollEvent(&amp;event)) &lt;br /&gt;  {      &lt;br /&gt;   switch (event.type) &lt;br /&gt;   {&lt;br /&gt;   case SDL_QUIT:&lt;br /&gt;    keypress = 1;&lt;br /&gt;    break;&lt;br /&gt;   case SDL_KEYDOWN:&lt;br /&gt;    switch(event.key.keysym.sym){&lt;br /&gt;    case SDLK_LEFT:&lt;br /&gt;   &lt;br /&gt;     break;&lt;br /&gt;    case SDLK_RIGHT:&lt;br /&gt;   &lt;br /&gt;     break;&lt;br /&gt;    case SDLK_UP:&lt;br /&gt;    &lt;br /&gt;     break;&lt;br /&gt;    case SDLK_DOWN:&lt;br /&gt;    &lt;br /&gt;     break;&lt;br /&gt;    default:&lt;br /&gt;     break;&lt;br /&gt;    }&lt;br /&gt;   default:&lt;br /&gt;    break;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;  DrawScreen(surface,h++);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; SDL_Quit();&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/2283610660839821568/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/2283610660839821568' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/2283610660839821568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/2283610660839821568'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2010/12/drawing-text-on-screen-in-opengl.html' title='Drawing a Text on Screen in an OpenGL Application'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-2796437613547985474</id><published>2010-11-20T00:42:00.020+02:00</published><updated>2011-12-29T20:40:37.186+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c++"/><category scheme="http://www.blogger.com/atom/ns#" term="cpu"/><category scheme="http://www.blogger.com/atom/ns#" term="monte carlo"/><category scheme="http://www.blogger.com/atom/ns#" term="NASA"/><category scheme="http://www.blogger.com/atom/ns#" term="openmp"/><category scheme="http://www.blogger.com/atom/ns#" term="paralel programming"/><category scheme="http://www.blogger.com/atom/ns#" term="pi"/><category scheme="http://www.blogger.com/atom/ns#" term="visual studio"/><title type='text'>Paralel Programlama ile PI Sayısının Hesaplanması</title><content type='html'>PI sayısı küçük yaşımdan beri bana hep gizemli gelmiştir. İrrasyonel yapıda olduğu için tam değeri hesaplanamayışı, bir çok matematiksel ve geometrik hesabın temelini oluşturması, çok eski medeniyetler tarafından kullanılmış olması insanın ister istemez ilgisini çekiyor. İnternetteki bir tanıma göre (bkz: wikipedia) &quot;çapı 1 olan dairenin çevre uzunluğu&quot; dur PI sayısı.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://upload.wikimedia.org/wikipedia/commons/2/2a/Pi-unrolled-720.gif&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 600px; height: 228px;&quot; src=&quot;http://upload.wikimedia.org/wikipedia/commons/2/2a/Pi-unrolled-720.gif&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;center&gt;(bkz: &lt;a href=&quot;http://tr.wikipedia.org/wiki/Dosya:Pi-unrolled-720.gif&quot; target=&quot;_blank&quot;&gt;http://tr.wikipedia.org/wiki/Dosya:Pi-unrolled-720.gif&lt;/a&gt;)&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;PI sayısının önemi hakkında daha fazla yazıp çizmek isterdim fakat bu yazının konusu dışında kalmaktadır. Asıl konumuz bu sayının yaklaşık değerini Paralel Programlama yöntemlerini kullanarak nasıl hesaplarız. Yaklaşık değerini dedim çünkü tam değerini hesaplayamayacağımızı artık biliyoruz. :) Bu sayı için hesaplayacağımız basamak sayısı yapmak istediğimiz işin büyüklüğüyle doğru orantılı. Arka bahçemizdeki havuzunuz kaç m^3 su aldığını hesaplamamız için 3.1415 değeri yeterken, Ay&#39;a bir araç göndermek isteyen NASA mühendisleri için &lt;span style=&quot;font-size:11px&quot;&gt;3.1415926535 8979323846 2643383279 5028841971 6939937510 5820974944 5923078164 0628620899 8628034825 3421170679 8214808651 3282306647 0938446095 5058223172 5359408128 4811174502 8410270193 8521105559 6446229489 5493038196 4428810975 6659334461 2847564823 3786783165 2712019091 4564856692 3460348610 4543266482 1339360726 0249141273 7245870066 0631558817 4881520920 9628292540 9171536436 7892590360 0113305305 4882046652 1384146951 9415116094 3305727036 5759591953 0921861173 8193261179 3105118548 0744623799 6274956735 1885752724 8912279381 8301194912 9833673362 4406566430 8602139494 6395224737 1907021798 6094370277 0539217176 2931767523 8467481846 7669405132 0005681271 4526356082 7785771342 7577896091 7363717872 1468440901 2249534301 4654958537 1050792279 6892589235 4201995611 2129021960 8640344181 5981362977 4771309960 5187072113 4999999837 2978049951 0597317328 1609631859 5024459455 3469083026 4252230825 3344685035 2619311881 7101000313 7838752886 5875332083 8142061717 7669147303 5982534904 2875546873 1159562863 8823537875 9375195778 1857780532 1712268066 1300192787 6611195909 2164201989 3809525720 1065485863 2788659361 5338182796 8230301952 0353018529 6899577362 2599413891 2497217752 8347913151 5574857242 4541506959 5082953311 6861727855 8890750983 8175463746 4939319255 0604009277 0167113900 9848824012 8583616035 6370766010 4710181942 9555961989 4676783744 9448255379 7747268471 0404753464 6208046684 2590694912 9331367702 8989152104 7521620569 6602405803 8150193511 2533824300 3558764024 7496473263 9141992726 0426992279 6782354781 6360093417 2164121992 4586315030 2861829745 5570674983 8505494588 5869269956 9092721079 7509302955 3211653449 8720275596 0236480665 4991198818 3479775356 6369807426 5425278625 5181841757 4672890977 7727938000 8164706001 6145249192 1732172147 7235014144 1973568548 1613611573 5255213347 5741849468 4385233239 0739414333 4547762416 8625189835 6948556209 9219222184 2725502542 5688767179 0494601653 4668049886 2723279178 6085784383 8279679766 8145410095 3883786360 9506800642 2512520511 7392984896 0841284886 2694560424 1965285022 2106611863 0674427862 2039194945 0471237137 8696095636 4371917287 4677646575 7396241389 0865832645 9958133904 7802759009&lt;/span&gt; değeri yetersiz ya da yanıltıcı olabilir. Bu yüzden sıradışı ihtiyaçlar için (fezaya mekik göndermek gibi) sıradışı çözümler sunmamız gerekmektedir. Bir gün NASA mühendisleri için PI sayısı hesaplarmıyız bilemiyorum fakat gelecekte çok fazla paralel işlem bizleri bekliyor. Şimdiden kendimizi hazırlamalıyız.&lt;br /&gt;&lt;br /&gt;Lafı fazla dolandırmadan işe koyulalım. İlk PI hesabımızı Monte Carlo yöntemiyle yapacağız. Bu yöntem oldukça basit bir olasılık hesabına dayanmaktadır. &lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKy7y86ITyTf1yxRH0tJSz77AwUbKSIimAlkj2R2PXZxv3QXZO7_PmrHAhXP4AhC26KmQ9eMKSxfcpmh3ZwzgIj0nGCiF89lRoPj3dqOOEKtdBYAABVgsDnXz9QZd6_KzPI8mZ0t7Cyzs/s1600/pi2.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 191px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKy7y86ITyTf1yxRH0tJSz77AwUbKSIimAlkj2R2PXZxv3QXZO7_PmrHAhXP4AhC26KmQ9eMKSxfcpmh3ZwzgIj0nGCiF89lRoPj3dqOOEKtdBYAABVgsDnXz9QZd6_KzPI8mZ0t7Cyzs/s400/pi2.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5541410090170590562&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Bu olasılık hesabını yapmak için C++ programlama dili üzerinden openMP kütüphanesini kullandım. Paylaşımlı bellek üzerinden paralel programlama yapmak için geliştirilmiş olan bu kütüphane kullanması oldukça basittir. Mevcut kodunuza hiç dokunmadan (elbetteki paylaşımlı bellek paralel program mantığı güdülerek yazılmış kod olamalı) doğrudan programınızı paralel çalıştırabilirsiniz. Bu yazacağımız program dağıtık mimariler için değil tek bir süper bilgisayar için programlanmıştır. Makine üzerindeki çekirdek sayısıyla doğru orantılı olarak performans artışı sağlanacaktır.&lt;br /&gt;&lt;br /&gt;Programımızı yazmadan önce Visual Studio 2010 üzerinden projemizin openMP desteğini açalım. Project -&gt; Properties ... &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(&lt;span style=&quot;font-weight:bold; color: red;&quot;&gt;DÜZELTME&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhQXu-gCzdy4jjSPa5HmTeXdq-KJ6drxdSAurK_MSbj-ppEERs8IGKjNshYelD9ev8MjdZVZd5zqfUmo-h8EEVcuck2lkpOVlKSre7UEGTARaUFNs_GmWDzJmaNywc8Ir4PhKOH2A6aRQ/s1600/pi5.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 285px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhQXu-gCzdy4jjSPa5HmTeXdq-KJ6drxdSAurK_MSbj-ppEERs8IGKjNshYelD9ev8MjdZVZd5zqfUmo-h8EEVcuck2lkpOVlKSre7UEGTARaUFNs_GmWDzJmaNywc8Ir4PhKOH2A6aRQ/s400/pi5.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5691621376815477522&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSAd9DUqcqFKe2Toacx-xmPy4uEnpV6z-5rvHa_ILaSmBDTOcJBLY4mcXyL6sjgxBm-E8422wmKl7ez_fbrUGKCiWERewA87p_ovDPwpfQ-K3s2sPmAzK5ALgg8nvYvq5flOPpkIJHFZI/s1600/pi6.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 259px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSAd9DUqcqFKe2Toacx-xmPy4uEnpV6z-5rvHa_ILaSmBDTOcJBLY4mcXyL6sjgxBm-E8422wmKl7ez_fbrUGKCiWERewA87p_ovDPwpfQ-K3s2sPmAzK5ALgg8nvYvq5flOPpkIJHFZI/s400/pi6.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5691621552452315730&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Şimdi programımızı yazalım. Programda açıklamak istediğim tüm noktaları yorum satırı olarak ekledim. Bir göz atalım sonra sonuçları değerlendirelim.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: cpp;&quot;&gt;&lt;br /&gt;/*&lt;br /&gt; Monte Carlo yöntemiyle PI sayısının yaklaşık değerinin hesaplanması.&lt;br /&gt;&lt;br /&gt; C++ / openMP&lt;br /&gt;&lt;br /&gt; Ramazan Bellek - Kasım 2010&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;lt;ctime&amp;gt;&lt;br /&gt;#include &amp;lt;math.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#define MAX_ITERATION 1000000 // tekrarlama sayısı&lt;br /&gt;#define r 500 // yarıçap&lt;br /&gt;#define R r*2+1 // çap + 1&lt;br /&gt;&lt;br /&gt;int main(int argc, char **argv)&lt;br /&gt;{&lt;br /&gt; srand(time(0));&lt;br /&gt; clock_t start = clock();&lt;br /&gt;&lt;br /&gt; bool iceride[MAX_ITERATION]; // doğruluk tablomuz&lt;br /&gt; double x,y;&lt;br /&gt;&lt;br /&gt; /*&lt;br /&gt;  openMP ile birbirinden bağımsız olan hesaplama kısmını işlemciye paralel olarak işletiyoruz.&lt;br /&gt;  x ve y değişkenleri her bir iş parçacığı için kişisel olarak tanımlandı, böylelikle bir iş parçacığı&lt;br /&gt;  diğerinin konum bilgisini görememektedir. Doğruluk tablosunu belirten değişkeni ise ortak olarak&lt;br /&gt;  kullanacaklardır.&lt;br /&gt; */&lt;br /&gt;#pragma omp parallel for private(x,y) shared(iceride)&lt;br /&gt; for(int i=0;i&amp;lt;MAX_ITERATION; i++)&lt;br /&gt; {&lt;br /&gt;  // uzayda bir noktayı (sözde) keyfi seçiyoruz.&lt;br /&gt;  x = rand()%R;&lt;br /&gt;  y = rand()%R;&lt;br /&gt;&lt;br /&gt;  double fark = sqrt(pow(x-r,2)+pow(y-r,2)); // seçtiğimiz noktanın dairenin merkezine olan uzaklığını alıyoruz.&lt;br /&gt;&lt;br /&gt;  if (fark&amp;lt;=r) // eğer bu uzaklık dairenin yarıçapından küçük ya da eşit ise nokta dairenin içerindedir.&lt;br /&gt;   iceride[i]=true;&lt;br /&gt;  else&lt;br /&gt;   iceride[i]=false;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; long toplamIceride = 0;&lt;br /&gt; // daire içerisine düşen toplam sayı &lt;br /&gt; for(int i=0;i&amp;lt;MAX_ITERATION; i++){&lt;br /&gt;  if (iceride[i]==true)&lt;br /&gt;   toplamIceride++;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /*&lt;br /&gt;  daire_icine_dusen/toplam = (pi*r^2)/(4*r^2)&lt;br /&gt;         =&amp;gt; pi = 4 * daire_icine_dusen/toplam&lt;br /&gt; */&lt;br /&gt;   std::cout&amp;lt;&amp;lt;&quot;PI ~= &quot;&amp;lt;&amp;lt;4*(double)toplamIceride/MAX_ITERATION&amp;lt;&amp;lt;std::endl;&lt;br /&gt;&lt;br /&gt; printf(&quot;Gecen Sure: %f\n&quot;, ((double)clock() - start) / CLOCKS_PER_SEC);&lt;br /&gt; system(&quot;pause&quot;);&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Programımızı çalıştırıyoruz. &lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-teKYWXIJw3vA2k3qunrVycBCG5dYN2MDyKBMLWvQDZk90hab_fuo52-LOojfd3PzBGNAvjB7z12c5j5btoktbFlBNc7QAtD8TEmkfXbq80CdBNDe6hZPudysy_Jkr2oa_BC5QlUgPsY/s1600/pi3.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 202px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-teKYWXIJw3vA2k3qunrVycBCG5dYN2MDyKBMLWvQDZk90hab_fuo52-LOojfd3PzBGNAvjB7z12c5j5btoktbFlBNc7QAtD8TEmkfXbq80CdBNDe6hZPudysy_Jkr2oa_BC5QlUgPsY/s400/pi3.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5541404355161688802&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sonuç aslında pek istediğim gibi çıkmadı. Beklentim en azından ilk 4 basamağı (3.1415) bulmak üzereydi. İterasyonları arttırarak tekrar denenebilir, ayrıca burada ürettiğimiz rastgele sayılar sözde olduğu için bize tam bir sonuç vermesi beklenemez. İterasyonu arttırarak işlemcinin çekirdeklerindeki değişimi göstermek istiyorum. &lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW27gpNJwR9l8-bWFcvF2lbvlnSsjTzNMnaKxLJLnmV9u4nUoGPZDSkxLqRvAu3Se9M9m2SON-V5G5b8kgZCBPmu_ZV5EtMLtGp7axte8jvN2EFF3EE52R9hl8Lj_Mqz0R2vVJSjcxfX8/s1600/pi4.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 392px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW27gpNJwR9l8-bWFcvF2lbvlnSsjTzNMnaKxLJLnmV9u4nUoGPZDSkxLqRvAu3Se9M9m2SON-V5G5b8kgZCBPmu_ZV5EtMLtGp7axte8jvN2EFF3EE52R9hl8Lj_Mqz0R2vVJSjcxfX8/s400/pi4.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5541407112772249490&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Gördüğünüz gibi PI sayısını bir süper bilgisayarda nasıl hesaplayacağımızı basit olarak da olsa görmüş olduk. Daha detaylı görsel uygulama için &lt;a href=&quot;http://www.eveandersson.com/pi/monte-carlo-demo&quot; target=&quot;_blank&quot;&gt;http://www.eveandersson.com/pi/monte-carlo-demo&lt;/a&gt; adresindenki java applete göz atabilirler.&lt;br /&gt;&lt;br /&gt;Bir sonraki paralel programlama yazımda paylaşımsız bellekli dağıtık mimari kullaranak PI sayısını hespalamaya çalışacağım. Küçük bir bilgisayar kümesi kurarak dev işlemleri basitleştirmeye çalışacağız. Gelecekteki bir bilgisayar ordusunun komutanı olmanız ümidiyle. Hoşçakalın...</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/2796437613547985474/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/2796437613547985474' title='2 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/2796437613547985474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/2796437613547985474'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2010/11/paralel-programlama-ile-pi-saysnn.html' title='Paralel Programlama ile PI Sayısının Hesaplanması'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKy7y86ITyTf1yxRH0tJSz77AwUbKSIimAlkj2R2PXZxv3QXZO7_PmrHAhXP4AhC26KmQ9eMKSxfcpmh3ZwzgIj0nGCiF89lRoPj3dqOOEKtdBYAABVgsDnXz9QZd6_KzPI8mZ0t7Cyzs/s72-c/pi2.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-7941149943379682371</id><published>2010-11-15T23:51:00.010+02:00</published><updated>2010-11-16T00:21:19.947+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="algoritma"/><category scheme="http://www.blogger.com/atom/ns#" term="artificial intelligence"/><category scheme="http://www.blogger.com/atom/ns#" term="minimax"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="tic tac toe"/><category scheme="http://www.blogger.com/atom/ns#" term="yapay zeka"/><title type='text'>Tic Tac Toe Oyunu - Yapay Zeka - MiniMax Algo.</title><content type='html'>Yapay zeka konusuna ilk girişi klasik Minimax algoritmasıyla yapıyorum. Algoritma çok basit ve etkili bir yöntem kullanmaktadır. Oyuncu bir hamle yaptıktan sonra diğer tüm oyunları oynayarak bilgisayarın en az kaybettiği en çok kazandığı hamle tespit edilmiş olur. Uygulamayı Python dilinde gerçeklemeye çalıştım. Doğası itibariyle %100 nesne yönelimli programlandı. Görsel arayüz için OpenGL (pyOpenGL) ve GLUT kütüphanelerini kullandım. Algoritma için daha detaylı bilgiyi &lt;a href=&quot;http://en.wikipedia.org/wiki/Minimax&quot;&gt;http://en.wikipedia.org/wiki/Minimax&lt;/a&gt; adresinden edinebilirsiniz. İsterseniz programa ve kodların açıklamasına şöyle bir göz atalım, ardından kaynak kodu vereyim.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_t5kqXBT6KwPrS5YW4tufVvwZsZVfF-uMsCyeWohuNTNi6pbWKwebbFVyolUkhVEz6dYSFZr6r-LBL-1DDWv0MpnnacMK_sNCzTR8fQNxU0q8lIvXWTCGLOhFACX4rvxVv6OJROwSShM/s1600/1.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 313px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_t5kqXBT6KwPrS5YW4tufVvwZsZVfF-uMsCyeWohuNTNi6pbWKwebbFVyolUkhVEz6dYSFZr6r-LBL-1DDWv0MpnnacMK_sNCzTR8fQNxU0q8lIvXWTCGLOhFACX4rvxVv6OJROwSShM/s400/1.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5539899506722592610&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj8sT4bcvd5XT7XVU7RSn3h78YxKFxOY_6KgV2uFYrxIcVg2N03-KbTbLMaOe-jL9lGdjzpa6HkintoJ0y-U8DTYhBxa4m1F6bSr53BnA0g3B99c4cM0M4T13Nm-g26b4nEfuzyI4Qohk/s1600/2.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 313px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj8sT4bcvd5XT7XVU7RSn3h78YxKFxOY_6KgV2uFYrxIcVg2N03-KbTbLMaOe-jL9lGdjzpa6HkintoJ0y-U8DTYhBxa4m1F6bSr53BnA0g3B99c4cM0M4T13Nm-g26b4nEfuzyI4Qohk/s400/2.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5539899508257394498&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGCB7KH1XxXEVPZW0iMlBqdU5Jqzp8csiGG7e_PizzPXaztGDmNeQdj3QA2a13YuqYTO1w-oDITEyjg9C1CvyPjsu-LiAxlC1RGr_GZDOEv7lAlQeGIrNzS95H45hDG-bwLC-UuTZw3Pk/s1600/3.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 313px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGCB7KH1XxXEVPZW0iMlBqdU5Jqzp8csiGG7e_PizzPXaztGDmNeQdj3QA2a13YuqYTO1w-oDITEyjg9C1CvyPjsu-LiAxlC1RGr_GZDOEv7lAlQeGIrNzS95H45hDG-bwLC-UuTZw3Pk/s400/3.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5539899511498973986&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrKRRb5q1nWA6oKiV8ZGCzuu44DR7HT9EyrBr4C7zuz1N4_ClcWwf4ePt7o0c1ATNuiwI5YbwlhQw9AwjhsqonLOyG0-1FstxomSsiAmyajYrF8-hZtbb9iwbaGi3RSduZL6Eg-4zQhcw/s1600/4.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 218px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrKRRb5q1nWA6oKiV8ZGCzuu44DR7HT9EyrBr4C7zuz1N4_ClcWwf4ePt7o0c1ATNuiwI5YbwlhQw9AwjhsqonLOyG0-1FstxomSsiAmyajYrF8-hZtbb9iwbaGi3RSduZL6Eg-4zQhcw/s400/4.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5539899891477997282&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBbFCtalo90fCdiDPjOvZQhkH7gAYCrNXQ-LTmr5Z-KIXHTX8OozX5jjo4iKeYgF3e5uypIm3qYf-AcEK-WuD2F1gn6pRiu5mONFVuzPbAxfEZEQM32H7Pfmhrr-k_v1Dc4HsKNibvMLM/s1600/5.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 308px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBbFCtalo90fCdiDPjOvZQhkH7gAYCrNXQ-LTmr5Z-KIXHTX8OozX5jjo4iKeYgF3e5uypIm3qYf-AcEK-WuD2F1gn6pRiu5mONFVuzPbAxfEZEQM32H7Pfmhrr-k_v1Dc4HsKNibvMLM/s400/5.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5539899903141399442&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_QTeN3v1ldpN7CE9lZRHWwyfiwvl9WidF2JgqUgX-cCer80cRZNRzQFPimZoJOdOTG5umvdCA3A6kBT22eWv8V3_RaLDQpkeuYtfHaJ7cuA6qbFUJ2-dbic-RLj3DjJ60BN5c9R9EKqM/s1600/6.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 307px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_QTeN3v1ldpN7CE9lZRHWwyfiwvl9WidF2JgqUgX-cCer80cRZNRzQFPimZoJOdOTG5umvdCA3A6kBT22eWv8V3_RaLDQpkeuYtfHaJ7cuA6qbFUJ2-dbic-RLj3DjJ60BN5c9R9EKqM/s400/6.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5539899908387696194&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6EWfHVsDiJYPizr9T-ckH89hLeAbZ_3DyP8jHWXKm4fYNj6M252o1Oa2d0P2j5bmZ4TeuyTdh9h6cbcSmh85hoTjDmRSe9-iW5ZdnTJqdBzTwt2gA6wVIgTMW5-lAT953w5_t5bLDMCM/s1600/7.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 313px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6EWfHVsDiJYPizr9T-ckH89hLeAbZ_3DyP8jHWXKm4fYNj6M252o1Oa2d0P2j5bmZ4TeuyTdh9h6cbcSmh85hoTjDmRSe9-iW5ZdnTJqdBzTwt2gA6wVIgTMW5-lAT953w5_t5bLDMCM/s400/7.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5539899915198391538&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrWD2fPtwLBanW6qfK394PALZDQETFjXpcWmUidKBKwEbv9PbuhUIq5J0fGNTWMyML8BRZX5Xvx4BWiVR3yLWuV6dlneIvROzPL6oObyrWIcvc-ZiD4L0wSHK3jnJDaNxg2fQgLHoMj_Q/s1600/8.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 261px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrWD2fPtwLBanW6qfK394PALZDQETFjXpcWmUidKBKwEbv9PbuhUIq5J0fGNTWMyML8BRZX5Xvx4BWiVR3yLWuV6dlneIvROzPL6oObyrWIcvc-ZiD4L0wSHK3jnJDaNxg2fQgLHoMj_Q/s400/8.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5539899932111213218&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:python&quot;&gt;&lt;br /&gt;# -*- coding: cp1254 -*-&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&quot;&quot;&quot;&lt;br /&gt;MiniMax algoritmasını kullanarak Tic Tac Toe oyununun gerçeklenmesi&lt;br /&gt;&lt;br /&gt;Sakarya Üniversitesi Bilgisayar Mühendisliği Bölümü&lt;br /&gt;Yapay Zeka Dersi Ödevi&lt;br /&gt;&lt;br /&gt;Ramazan Bellek - Ekim 2010&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&quot;&quot;&quot;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;from OpenGL.GL import *&lt;br /&gt;from OpenGL.GLUT import *&lt;br /&gt;from OpenGL.GLU import *&lt;br /&gt;import time&lt;br /&gt;import math&lt;br /&gt;import copy&lt;br /&gt;from Tkinter import *&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# MiniMax algoritmasını gerçekleyen sınıf&lt;br /&gt;class MiniMax:&lt;br /&gt;    mevcutDurum = [[]]&lt;br /&gt;    def __init__(self, mevcutDurum): # yapılandırıcı metod&lt;br /&gt;        self.mevcutDurum = copy.deepcopy(mevcutDurum)&lt;br /&gt;&lt;br /&gt;    # bilgisayarın bir sonraki yapacağı en mantıklı hareketi belirler&lt;br /&gt;    def sonrakiHamleyiHesapla(self):&lt;br /&gt;        tahta = self.mevcutDurum&lt;br /&gt;        max = [[0 for satir in range(3)] for sutun in range(3)]&lt;br /&gt;        for x in range(3):&lt;br /&gt;            for y in range(3):&lt;br /&gt;                if tahta[x][y] == 0:&lt;br /&gt;                    tahta[x][y] = 1 # boş alana hamle yap&lt;br /&gt;                    max[x][y] = self.__tara(tahta, 1) # alt ağaçları tara&lt;br /&gt;                    tahta[x][y] = 0 # tarama bitince yapılan hamle geri alınır&lt;br /&gt;                else:&lt;br /&gt;                    max[x][y] = -99&lt;br /&gt;        sonuc = -99&lt;br /&gt;        donusDegeri = [0,0]&lt;br /&gt;        for x in range(3):&lt;br /&gt;            for y in range(3):&lt;br /&gt;                if max[x][y]&gt;sonuc:&lt;br /&gt;                    sonuc=max[x][y]&lt;br /&gt;                    donusDegeri = [x, y]&lt;br /&gt;        return donusDegeri&lt;br /&gt;&lt;br /&gt;    # alt oyun ağaçlarını tarar&lt;br /&gt;    def __tara(self, t, s):&lt;br /&gt;        tahta = copy.deepcopy(t)&lt;br /&gt;        sonEl = copy.deepcopy(s)&lt;br /&gt;        toplam = [[0 for satir in range(3)] for sutun in range(3)]&lt;br /&gt;        for x in range(3):&lt;br /&gt;            for y in range(3):&lt;br /&gt;                if tahta[x][y] == 0:&lt;br /&gt;                    tahta[x][y] = sonEl*-1&lt;br /&gt;                    kontrolSonucu = Hakem.kontrolEt(tahta)&lt;br /&gt;                    if kontrolSonucu != 5: # -&gt; tahta henüz dolu değil!&lt;br /&gt;                        return kontrolSonucu&lt;br /&gt;                    toplam[x][y] = self.__tara(tahta, sonEl*-1)&lt;br /&gt;                    tahta[x][y] = 0&lt;br /&gt;        if sonEl == 1:&lt;br /&gt;            return self.Min(toplam)&lt;br /&gt;        else:&lt;br /&gt;            return self.Max(toplam)&lt;br /&gt;&lt;br /&gt;    # Katardaki azami değeri tespit eder.&lt;br /&gt;    def Max(self, t):&lt;br /&gt;        tahta = copy.deepcopy(t)&lt;br /&gt;        deger = -99&lt;br /&gt;        for x in range(3):&lt;br /&gt;            for y in range(3):&lt;br /&gt;                if tahta[x][y]&gt;deger:&lt;br /&gt;                    deger = tahta[x][y]&lt;br /&gt;        return deger&lt;br /&gt;&lt;br /&gt;    # Katardaki asgari değeri tespit eder.&lt;br /&gt;    def Min(self, t):&lt;br /&gt;        tahta = copy.deepcopy(t)&lt;br /&gt;        deger = 99&lt;br /&gt;        for x in range(3):&lt;br /&gt;            for y in range(3):&lt;br /&gt;                if tahta[x][y]&lt;deger:&lt;br /&gt;                    deger = tahta[x][y]&lt;br /&gt;        return deger&lt;br /&gt;    &lt;br /&gt;class Hakem:&lt;br /&gt;    @staticmethod&lt;br /&gt;    def bosMu(t):&lt;br /&gt;        tahta = copy.deepcopy(t)&lt;br /&gt;        for x in range(3):&lt;br /&gt;            for y in range(3):&lt;br /&gt;                if tahta[x][y] == 0:&lt;br /&gt;                    return True&lt;br /&gt;        return False&lt;br /&gt;    @staticmethod&lt;br /&gt;    def kontrolEt(t):&lt;br /&gt;        tahta = copy.deepcopy(t)&lt;br /&gt;&lt;br /&gt;        # oyuncu hamleleri --------------&lt;br /&gt;&lt;br /&gt;        # yatay kontrol --&lt;br /&gt;        if tahta[0][0] == tahta[1][0] == tahta[2][0] == -1:&lt;br /&gt;            return -1&lt;br /&gt;        elif tahta[0][1] == tahta[1][1] == tahta[2][1] == -1:&lt;br /&gt;            return -1&lt;br /&gt;        elif tahta[0][2] == tahta[1][2] == tahta[2][2] == -1:&lt;br /&gt;            return -1&lt;br /&gt;        # ----------------&lt;br /&gt;&lt;br /&gt;        # dikey kontrol --&lt;br /&gt;        elif tahta[0][0] == tahta[0][1] == tahta[0][2] == -1:&lt;br /&gt;            return -1&lt;br /&gt;        elif tahta[1][0] == tahta[1][1] == tahta[1][2] == -1:&lt;br /&gt;            return -1&lt;br /&gt;        elif tahta[2][0] == tahta[2][1] == tahta[2][2] == -1:&lt;br /&gt;            return -1&lt;br /&gt;        # ----------------&lt;br /&gt;&lt;br /&gt;        # çapraz kontrol --&lt;br /&gt;        elif tahta[0][0] == tahta[1][1] == tahta[2][2] == -1:&lt;br /&gt;            return -1&lt;br /&gt;        elif tahta[2][0] == tahta[1][1] == tahta[0][2] == -1:&lt;br /&gt;            return -1&lt;br /&gt;        # -----------------&lt;br /&gt;&lt;br /&gt;        # ------------------------------------&lt;br /&gt;&lt;br /&gt;        # Bilgisayar hamleleri --------------&lt;br /&gt;&lt;br /&gt;        # yatay kontrol --&lt;br /&gt;        if tahta[0][0] == tahta[1][0] == tahta[2][0] == 1:&lt;br /&gt;            return 1&lt;br /&gt;        elif tahta[0][1] == tahta[1][1] == tahta[2][1] == 1:&lt;br /&gt;            return 1&lt;br /&gt;        elif tahta[0][2] == tahta[1][2] == tahta[2][2] == 1:&lt;br /&gt;            return 1&lt;br /&gt;        # ----------------&lt;br /&gt;&lt;br /&gt;        # dikey kontrol --&lt;br /&gt;        elif tahta[0][0] == tahta[0][1] == tahta[0][2] == 1:&lt;br /&gt;            return 1&lt;br /&gt;        elif tahta[1][0] == tahta[1][1] == tahta[1][2] == 1:&lt;br /&gt;            return 1&lt;br /&gt;        elif tahta[2][0] == tahta[2][1] == tahta[2][2] == 1:&lt;br /&gt;            return 1&lt;br /&gt;        # ----------------&lt;br /&gt;&lt;br /&gt;        # çapraz kontrol --&lt;br /&gt;        elif tahta[0][0] == tahta[1][1] == tahta[2][2] == 1:&lt;br /&gt;            return 1&lt;br /&gt;        elif tahta[2][0] == tahta[1][1] == tahta[0][2] == 1:&lt;br /&gt;            return 1&lt;br /&gt;        # -----------------&lt;br /&gt;&lt;br /&gt;        # ------------------------------------&lt;br /&gt;&lt;br /&gt;        # Eşitlik durumu&lt;br /&gt;        if Hakem.bosMu(tahta) == False:&lt;br /&gt;            return 0&lt;br /&gt;        return 5 # -&gt; tahta henüz dolu değil!&lt;br /&gt;&lt;br /&gt;class Tahta:&lt;br /&gt;    &quot;&quot;&quot;Oyun tahtası sınıfı&quot;&quot;&quot;&lt;br /&gt;    tahta = [ [0 for satir in range(3)] for sutun in range(3)]&lt;br /&gt;    siraBilgisayarda = False&lt;br /&gt;    oyunBitti = False&lt;br /&gt;    &lt;br /&gt;    def __init__(self):&lt;br /&gt;        oyunBitti = False&lt;br /&gt;        self.ilkDefa = True&lt;br /&gt;&lt;br /&gt;    def ciz(self):&lt;br /&gt;        if self.oyunBitti == True:&lt;br /&gt;            glColor(0.9, 0.6, 0.1)&lt;br /&gt;            drawText(&quot;Oyun bitti... :|&quot;, 10 ,5 ,250, 250)&lt;br /&gt;        elif self.ilkDefa == True:&lt;br /&gt;            glColor(0.9, 0.6, 0.1)&lt;br /&gt;            drawText(&quot;Oynamaya hazirim, lütfen bir hamle yapiniz... :)&quot;, 10 ,5 ,250, 250)&lt;br /&gt;        else:&lt;br /&gt;            glColor(0.9, 0.6, 0.1)&lt;br /&gt;            drawText(&quot;Sizin siraniz ?&quot;, 10 ,5 ,250, 250)&lt;br /&gt;            &lt;br /&gt;        if self.ilkDefa == True:&lt;br /&gt;            self.ilkDefa = False&lt;br /&gt;        Tahta.cerceveCiz()&lt;br /&gt;        self.__oyunCiz()&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;    @staticmethod&lt;br /&gt;    def cerceveCiz():&lt;br /&gt;        glLineWidth(2.5)&lt;br /&gt;        glColor(0.0, 0.0, 1.0)&lt;br /&gt;        glBegin(GL_LINES)&lt;br /&gt;        &lt;br /&gt;        # dış çerçeve ------------&lt;br /&gt;        glVertex(-0.9, 0.9, 0.0)&lt;br /&gt;        glVertex(0.9, 0.9, 0.0)&lt;br /&gt;        glVertex(-0.9, 0.9, 0.0)&lt;br /&gt;        glVertex(-0.9, -0.9, 0.0)&lt;br /&gt;        glVertex(-0.9, -0.9, 0.0)&lt;br /&gt;        glVertex(0.9, -0.9, 0.0)&lt;br /&gt;        glVertex(0.9, -0.9, 0.0)&lt;br /&gt;        glVertex(0.9, 0.9, 0.0)&lt;br /&gt;        # -------------------------&lt;br /&gt;&lt;br /&gt;        # ızgaralar ---------------&lt;br /&gt;        glVertex(-0.3, -0.9, 0.0)&lt;br /&gt;        glVertex(-0.3, 0.9, 0.0)&lt;br /&gt;        glVertex(0.3, -0.9, 0.0)&lt;br /&gt;        glVertex(0.3, 0.9, 0.0)&lt;br /&gt;        glVertex(-0.9, -0.3, 0.0)&lt;br /&gt;        glVertex(0.9, -0.3, 0.0)&lt;br /&gt;        glVertex(-0.9, 0.3, 0.0)&lt;br /&gt;        glVertex(0.9, 0.3, 0.0)&lt;br /&gt;        # -------------------------&lt;br /&gt;        glEnd()       &lt;br /&gt;&lt;br /&gt;    def __xCiz(self, x, y):&lt;br /&gt;        x =0.6*x-0.6&lt;br /&gt;        y =-1*(0.6*y-0.6)&lt;br /&gt;        glLineWidth(8.5)&lt;br /&gt;        glColor(0.0, 1.0, 0.0)&lt;br /&gt;        glBegin(GL_LINES)&lt;br /&gt;        glVertex(x-0.175, y-0.175)&lt;br /&gt;        glVertex(x+0.175, y+0.175)&lt;br /&gt;        glVertex(x-0.175, y+0.175)&lt;br /&gt;        glVertex(x+0.175, y-0.175)&lt;br /&gt;        glEnd()&lt;br /&gt;&lt;br /&gt;    def __oCiz(self, x, y):&lt;br /&gt;        x =0.6*x-0.6&lt;br /&gt;        y =-1*(0.6*y-0.6)&lt;br /&gt;        glLineWidth(1.5)&lt;br /&gt;        glColor(1.0, 0.0, 0.0)&lt;br /&gt;        glPushMatrix()&lt;br /&gt;        glTranslate(x, y, 0.0)&lt;br /&gt;        glBegin(GL_LINES)&lt;br /&gt;        for i in range(0, 1080):&lt;br /&gt;            glVertex(math.sin(i)*0.2,math.cos(i)*0.2)&lt;br /&gt;        glEnd()&lt;br /&gt;        glPopMatrix()&lt;br /&gt;&lt;br /&gt;    def __oyunCiz(self):&lt;br /&gt;        for x in range(3):&lt;br /&gt;            for y in range(3):&lt;br /&gt;                if self.tahta[x][y] == -1:&lt;br /&gt;                    self.__xCiz(x, y)&lt;br /&gt;                elif self.tahta[x][y] == 1:&lt;br /&gt;                    self.__oCiz(x, y)&lt;br /&gt;&lt;br /&gt;    &#39;&#39;&#39; tüm hamleler bu metod üzerinden gerçekleştirilir.&lt;br /&gt;        kullanıcı girişleri bu metoda yönlendirilerek kullanıcının hamle yapması&lt;br /&gt;        sağlanırken, her hamleden sonra öz yinelemeli olarak bilgisayar kendi hamlesini yapar.&lt;br /&gt;        Yapacağı hamleyi MiniMax algoritmasınını kullanarak tespit etmeye çalışır.&lt;br /&gt;    &#39;&#39;&#39;&lt;br /&gt;    def oyna(self, x, y):&lt;br /&gt;        try:&lt;br /&gt;            if self.oyunBitti == True:&lt;br /&gt;##                Mesaj.msj(&quot;Oyun bittiği için hamle yapamazsınız.&quot;,&quot;Üzgünüm... :(&quot;)&lt;br /&gt;                return&lt;br /&gt;            if x not in range(40, 760):&lt;br /&gt;                return&lt;br /&gt;            if y not in range(30, 560):&lt;br /&gt;                return&lt;br /&gt;            x = (x-40)/240&lt;br /&gt;            y = (y-30)/176&lt;br /&gt;            if self.tahta[x][y] == 0:&lt;br /&gt;                if self.siraBilgisayarda:&lt;br /&gt;                    self.siraBilgisayarda = ~self.siraBilgisayarda&lt;br /&gt;                    self.tahta[x][y] = 1&lt;br /&gt;                    self.ciz()&lt;br /&gt;                    glFlush ()&lt;br /&gt;                    glutSwapBuffers()&lt;br /&gt;                    self.__kontrolEt()&lt;br /&gt;                else:&lt;br /&gt;                    self.siraBilgisayarda = ~self.siraBilgisayarda&lt;br /&gt;                    self.tahta[x][y] = -1&lt;br /&gt;                    self.ciz()&lt;br /&gt;                    glFlush ()&lt;br /&gt;                    glutSwapBuffers()&lt;br /&gt;                    self.__kontrolEt()&lt;br /&gt;                    if self.oyunBitti == True:&lt;br /&gt;                        return&lt;br /&gt;                    mm = MiniMax(self.tahta)&lt;br /&gt;                    time.sleep(0.5)&lt;br /&gt;                    xy = mm.sonrakiHamleyiHesapla()&lt;br /&gt;                    self.oyna(xy[0]*240+40, xy[1]*176+30)&lt;br /&gt;                    glutPostRedisplay()&lt;br /&gt;        except:&lt;br /&gt;            print &quot;Beklenmeyen bir hata meydana geldi. Lütfen tekrar deneyiniz.&quot;&lt;br /&gt;            raise&lt;br /&gt;        &lt;br /&gt;    def __kontrolEt(self):&lt;br /&gt;        durum = Hakem.kontrolEt(self.tahta)&lt;br /&gt;        if durum == 0:&lt;br /&gt;            self.oyunBitti = True&lt;br /&gt;            Mesaj.msj(&quot;Berabere bitti!&quot;, &quot;Eşitlik durumu&quot;)&lt;br /&gt;            glEnable(GL_LIGHTING)&lt;br /&gt;            glutPostRedisplay()&lt;br /&gt;            return&lt;br /&gt;&lt;br /&gt;        # Bilgisayarın hamleleri --------------&lt;br /&gt;        mesaj = &quot;Bilgisayar kazandı! :/\nBiraz daha dikkatli olmalısınız...&quot;&lt;br /&gt;        if durum == 1:&lt;br /&gt;            self.oyunBitti = True&lt;br /&gt;            Mesaj.msj(mesaj, &quot;Oyun bitti...&quot;)&lt;br /&gt;            glEnable(GL_LIGHTING)&lt;br /&gt;            glutPostRedisplay()&lt;br /&gt;            return&lt;br /&gt;        # ------------------------------------&lt;br /&gt;&lt;br /&gt;        # oyuncu hamleleri --------------&lt;br /&gt;        mesaj = &quot;Tebrikler, siz kazandınız... :)&quot;&lt;br /&gt;        if durum == -1:&lt;br /&gt;            self.oyunBitti = True&lt;br /&gt;            Mesaj.msj(mesaj, &quot;Oyun bitti...&quot;)&lt;br /&gt;            glEnable(GL_LIGHTING)&lt;br /&gt;            glutPostRedisplay()&lt;br /&gt;            return&lt;br /&gt;        # ------------------------------------&lt;br /&gt;        if durum == 5: # -&gt; tahta henüz dolu değil&lt;br /&gt;            return&lt;br /&gt;&lt;br /&gt;# Mesaj sınıfı ----&lt;br /&gt;class Mesaj:&lt;br /&gt;    root = None&lt;br /&gt;    def __init__(self, root):&lt;br /&gt;        self.root = root&lt;br /&gt;    @staticmethod&lt;br /&gt;    def msj(yazi, baslik):&lt;br /&gt;        root = Tk()&lt;br /&gt;        root.title(unicode(baslik, encoding=&quot;cp1254&quot;))&lt;br /&gt;        root.withdraw()&lt;br /&gt;        mesaj = Mesaj(root)&lt;br /&gt;        mesaj.top = Toplevel(root)&lt;br /&gt;        Label(mesaj.top, text=unicode(yazi, encoding=&quot;cp1254&quot;)).pack()&lt;br /&gt;        Button(mesaj.top, text=&quot;OK&quot;, command=mesaj.tamam).pack(pady=5)&lt;br /&gt;        root.wait_window(mesaj.top) # pencere Tamam komutu verene kadar bekler.&lt;br /&gt;        root.destroy()&lt;br /&gt;    def tamam(self):&lt;br /&gt;        self.top.destroy()&lt;br /&gt;# -----------------&lt;br /&gt;&lt;br /&gt;# Yazı yazma fonksiyonu (pyOpenGL - örneğinden alınmıştır!)&lt;br /&gt;def drawText( value, x,y,  windowHeight, windowWidth, step = 18 ):&lt;br /&gt;    value = unicode(value, encoding=&quot;cp1254&quot;)&lt;br /&gt;    glMatrixMode(GL_PROJECTION);&lt;br /&gt;    matrix = glGetDouble(GL_PROJECTION_MATRIX)&lt;br /&gt;    glLoadIdentity();&lt;br /&gt;    glOrtho(0.0, windowHeight or 32, 0.0, windowWidth or 32, -1.0, 1.0)&lt;br /&gt;    glMatrixMode(GL_MODELVIEW);&lt;br /&gt;    glPushMatrix();&lt;br /&gt;    glLoadIdentity();&lt;br /&gt;    glRasterPos2i(x, y);&lt;br /&gt;    lines = 0&lt;br /&gt;    for character in value:&lt;br /&gt;        if character == &#39;\n&#39;:&lt;br /&gt;            glRasterPos2i(x, y-(lines*18))&lt;br /&gt;        else:&lt;br /&gt;            glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ord(character));&lt;br /&gt;    glPopMatrix();&lt;br /&gt;    glMatrixMode(GL_PROJECTION);&lt;br /&gt;    glLoadMatrixd(matrix)&lt;br /&gt;    glMatrixMode(GL_MODELVIEW);&lt;br /&gt;# --------------------------------&lt;br /&gt;            &lt;br /&gt;# uygulama giriş fonsiyonları ---------------&lt;br /&gt;&lt;br /&gt;resX,resY = (800,600 ) # ekran çözünürlüğü&lt;br /&gt;oyunTahtasi = Tahta() # tahta sınıfı&lt;br /&gt;&lt;br /&gt;def goster( ): # openGL render fonksiyonu&lt;br /&gt;    glutSetWindow(window);&lt;br /&gt;    glClearColor (1.0, 1.0, 1.0, 1.0)&lt;br /&gt;    glClear (GL_COLOR_BUFFER_BIT)&lt;br /&gt;    oyunTahtasi.ciz()&lt;br /&gt;    glFlush ()&lt;br /&gt;    glutSwapBuffers()&lt;br /&gt;&lt;br /&gt;def ayarla():&lt;br /&gt;    &#39;&#39;&#39; yumuşak çizim &#39;&#39;&#39;&lt;br /&gt;    glShadeModel(GL_SMOOTH)&lt;br /&gt;    glDisable(GL_LIGHTING)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def fare(button, state, x, y):&lt;br /&gt;    if button == 0 and state == 1:&lt;br /&gt;        oyunTahtasi.oyna(x, y)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if __name__ == &quot;__main__&quot;:&lt;br /&gt;    glutInit([])&lt;br /&gt;    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)&lt;br /&gt;&lt;br /&gt;    glutInitWindowSize(resX, resY) # pencere genişliği&lt;br /&gt;    glutInitWindowPosition(0, 0)&lt;br /&gt;    window = glutCreateWindow(&quot;Tic Tac Toe Oyunu / MiniMax Yapay Zeka Uygulaması - Ramazan Bellek | Ekim 2010&quot;)&lt;br /&gt;    glutMouseFunc(fare)&lt;br /&gt;    ayarla()&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;    glutDisplayFunc(goster)&lt;br /&gt;    glutMainLoop()&lt;br /&gt;&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/7941149943379682371/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/7941149943379682371' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/7941149943379682371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/7941149943379682371'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2010/11/tic-tac-toe-oyunu-yapay-zeka-minimax.html' title='Tic Tac Toe Oyunu - Yapay Zeka - MiniMax Algo.'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_t5kqXBT6KwPrS5YW4tufVvwZsZVfF-uMsCyeWohuNTNi6pbWKwebbFVyolUkhVEz6dYSFZr6r-LBL-1DDWv0MpnnacMK_sNCzTR8fQNxU0q8lIvXWTCGLOhFACX4rvxVv6OJROwSShM/s72-c/1.PNG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-8901663484484176694</id><published>2010-10-30T18:57:00.013+03:00</published><updated>2011-01-24T19:23:00.640+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3d"/><category scheme="http://www.blogger.com/atom/ns#" term="ati"/><category scheme="http://www.blogger.com/atom/ns#" term="c++"/><category scheme="http://www.blogger.com/atom/ns#" term="cpu"/><category scheme="http://www.blogger.com/atom/ns#" term="directx"/><category scheme="http://www.blogger.com/atom/ns#" term="fizik"/><category scheme="http://www.blogger.com/atom/ns#" term="game"/><category scheme="http://www.blogger.com/atom/ns#" term="game engine"/><category scheme="http://www.blogger.com/atom/ns#" term="gpu"/><category scheme="http://www.blogger.com/atom/ns#" term="grafik"/><category scheme="http://www.blogger.com/atom/ns#" term="graphic"/><category scheme="http://www.blogger.com/atom/ns#" term="intel"/><category scheme="http://www.blogger.com/atom/ns#" term="nvidia"/><category scheme="http://www.blogger.com/atom/ns#" term="opengl"/><category scheme="http://www.blogger.com/atom/ns#" term="oyun motoru"/><category scheme="http://www.blogger.com/atom/ns#" term="real-time"/><category scheme="http://www.blogger.com/atom/ns#" term="render"/><title type='text'>Game Engine Programming</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSE6uQ79z0i7Aurgyr8yJxZHVNsUuwq-_VVMGCcF-OvuncXs3eavyUveEzVSiGJgj8SXkxtIV7EmP6fpxfp5R2Clbf8vD0wEHXpBmyghe1dUxbM0Pb_3kyljOn6PGs3VHGEsOJyNOvNCg/s1600/game_engine_logo.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 114px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSE6uQ79z0i7Aurgyr8yJxZHVNsUuwq-_VVMGCcF-OvuncXs3eavyUveEzVSiGJgj8SXkxtIV7EmP6fpxfp5R2Clbf8vD0wEHXpBmyghe1dUxbM0Pb_3kyljOn6PGs3VHGEsOJyNOvNCg/s400/game_engine_logo.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5533869236293216786&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3 Boyutlu Oyun Motoru geliştirme seminerim önümüzdeki Salı günü (2 Kasım 2010) başlayacağını büyük bir mutlulukla duyurmak isterim :) Sau Bilgisayar Topluluğu bünyesinde gerçekleştilecek olan organizasyon için zaman 13:00~15:00 saatleri arası (D8 binası - sınıf henüz bana bildirilmedi) şeklinde düşünüldü. Ders yoğunluğuna bakarak en uygun zaman seçilmeye çalışıldı. Bu aralıkta dersi olan arkadaşlardan özür diliyorum. Eğer bir aksilik çıkmaz ise her salı bu seminerler düzenlenecek. Seminerlerle ilgili her türlü görüş ve eleştirilerinizi yorum olarak bu girdinin peşine bekliyorum.&lt;br /&gt;&lt;br /&gt;Salı günü görüşmek üzere efendim. :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://farm2.static.flickr.com/1369/5139783998_db502c69bc.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 500px; height: 354px;&quot; src=&quot;http://farm2.static.flickr.com/1369/5139783998_db502c69bc.jpg&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;-------02.11.2010------------------------------&lt;br /&gt;İlk eğitimin başarılı geçtiğine inanıyorum. Katılan tüm arkadaşlara teşekkür ederim.&lt;br /&gt;1. hafta sunum dosyasını &lt;a href=&quot;http://www.bellexoft.com/blog_data/presentation1.pdf&quot;&gt;buraya&lt;/a&gt; tıklayarak indirebilirsiniz.&lt;br /&gt;&lt;br /&gt;Eğitimin bundan sonraki haftalarında tüm etkinliğin kameraya çekilmesi düşünülüyor. Ben de faydalı olacağına inanıyorum. &lt;br /&gt;&lt;br /&gt;Haftaya aynı saatte görüşmek üzere.&lt;br /&gt;-----------------------------------------------&lt;br /&gt;&lt;br /&gt;-------09.11.2010------------------------------&lt;br /&gt;İkinci hafta eğitim sunumları için:&lt;br /&gt;&lt;a href=&quot;http://www.bellexoft.com/blog_data/presentation2.pdf&quot;&gt;sunum2&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.bellexoft.com/blog_data/presentation3.pdf&quot;&gt;sunum3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;sunumda kullanılan videolar:&lt;br /&gt;&lt;a href=&quot;http://www.blender.org/features-gallery/feature-videos/?video=game_engine_one&quot;&gt;Blender&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=1Kvl31g77Z8&quot;&gt;Cry Engine 3&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=ErnmP5yjtfo&quot;&gt;UDK&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ayrıca sunumun bir kısmı video kameraya çekilmiştir. Görüntüler henüz elime ulaşmadı. Çekim yapan arkadaştan elde ettiğim zaman paylaşacağım.&lt;br /&gt;&lt;br /&gt;Katılan herkese teşekkür ederim. Bayramdan sonraki hafta görüşmek üzere.&lt;br /&gt;&lt;br /&gt;-------23.11.2010---------------------------------------&lt;br /&gt;&lt;a href=&quot;http://www.bellexoft.com/blog_data/presentation4.pdf&quot;&gt;sunum4&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.youtube.com/view_play_list?p=1B8A3BA4AEBC9D78&quot;&gt;Eğitim Videoları (YouTube)&lt;/a&gt;&lt;br /&gt;&lt;object width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/p/1B8A3BA4AEBC9D78?hl=en_US&amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/p/1B8A3BA4AEBC9D78?hl=en_US&amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;480&quot; height=&quot;385&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Makine dilinde derleyicisiz yazdığımız uygulama.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh568UUCqtoSdJ_8Dcnagt81LDL669LRxGGT2feI6OwGzd0Cp62QJUfrprSzyk5DQ8fPBDyrkG3REUQWiICMqorrtoAqxb8W-wbsKxvaUQVDorTl-P6MAmM3g-5Kw3K7wHXCrbNkEGFiTo/s1600/makine_dili.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 113px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh568UUCqtoSdJ_8Dcnagt81LDL669LRxGGT2feI6OwGzd0Cp62QJUfrprSzyk5DQ8fPBDyrkG3REUQWiICMqorrtoAqxb8W-wbsKxvaUQVDorTl-P6MAmM3g-5Kw3K7wHXCrbNkEGFiTo/s400/makine_dili.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5544654091350419826&quot; /&gt;&lt;/a&gt;&lt;br /&gt;--------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;object width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/p/7A45499D2C987748?hl=en_US&amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/p/7A45499D2C987748?hl=en_US&amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;480&quot; height=&quot;385&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;About this playlist&lt;br /&gt;&lt;br /&gt;9 videos&lt;br /&gt;Total length: 1 hour, 26 minutes&lt;br /&gt;&lt;br /&gt;Description: Sakarya Üniversitesi Bilgisayar Mühendisliği 3 Boyutlu Oyun Motoru Programlama Seminerleri 5. Oturumu &lt;br /&gt;Oturum Konusu: OpenGL &lt;br /&gt;Toplam Uzunluk: 01:30:30</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/8901663484484176694/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/8901663484484176694' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/8901663484484176694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/8901663484484176694'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2010/10/game-engine-programming.html' title='Game Engine Programming'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSE6uQ79z0i7Aurgyr8yJxZHVNsUuwq-_VVMGCcF-OvuncXs3eavyUveEzVSiGJgj8SXkxtIV7EmP6fpxfp5R2Clbf8vD0wEHXpBmyghe1dUxbM0Pb_3kyljOn6PGs3VHGEsOJyNOvNCg/s72-c/game_engine_logo.PNG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-9202792741417387837</id><published>2010-10-15T00:15:00.004+03:00</published><updated>2010-10-15T00:24:31.830+03:00</updated><title type='text'>13. MÜSİAD Fuarı / CNR EXPO</title><content type='html'>2007 yılında Biltronik bilgi teknolojileri yarışmasında ödül kazandığım projemi tanıtmak üzere CNR EXPO 13. MÜSİAD Fuarı&#39;nda kendim için ayrılan standa bulundum. Projemin gelişimini durdurmuş olsam da, standın arkasında olmanın zorluklarını anlama açısından faydalı bir deneyim olduğunu düşünyorum.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyOQpiuUtHwYQVE8h370cxva_cMH2xtoAZzTErOeHHr-4dco9sfDEmYRIfzlPJtHuOvQgMkoFJUKqqcZNlEs5_81T0qSgMDznC3okbIeJ3SKXp49IPYIgFDZ3lSDHprzAuvYF7tGlFMKM/s1600/G%C3%B6r%C3%BCnt%C3%BC108.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 320px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyOQpiuUtHwYQVE8h370cxva_cMH2xtoAZzTErOeHHr-4dco9sfDEmYRIfzlPJtHuOvQgMkoFJUKqqcZNlEs5_81T0qSgMDznC3okbIeJ3SKXp49IPYIgFDZ3lSDHprzAuvYF7tGlFMKM/s400/G%C3%B6r%C3%BCnt%C3%BC108.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5528015098598117778&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ_IHesjwsMe8PvCOGqy3I6aFo3rX_TRP_Zf7vLRDi479NLmKwIsKoXc-PxammfX0TtkfrMZnR-BZ_MsPDfp6Xo-mmHI1-x_XKMBssyoW9cba__C1LynA68xyus9rYQuGoO15QKTGyekw/s1600/G%C3%B6r%C3%BCnt%C3%BC109.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 320px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ_IHesjwsMe8PvCOGqy3I6aFo3rX_TRP_Zf7vLRDi479NLmKwIsKoXc-PxammfX0TtkfrMZnR-BZ_MsPDfp6Xo-mmHI1-x_XKMBssyoW9cba__C1LynA68xyus9rYQuGoO15QKTGyekw/s400/G%C3%B6r%C3%BCnt%C3%BC109.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5528015236553632642&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbvDDXivEyF86L2TsJps_0SwxTRDWDVSeMrXQGrh8Xd08SlUFnsfBOaqyhyquNJcxXisPN1uFWVjXduTylmAucf83DLx4WQ3DURuup3NNgTFTqbPimCfmvnxl3JVDYSaPqbPeJ2hv5wfE/s1600/G%C3%B6r%C3%BCnt%C3%BC112.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 320px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbvDDXivEyF86L2TsJps_0SwxTRDWDVSeMrXQGrh8Xd08SlUFnsfBOaqyhyquNJcxXisPN1uFWVjXduTylmAucf83DLx4WQ3DURuup3NNgTFTqbPimCfmvnxl3JVDYSaPqbPeJ2hv5wfE/s400/G%C3%B6r%C3%BCnt%C3%BC112.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5528015370286915234&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgONUW9ceEiXeEHUwr3wUQrnZ7TRjm-sLA8Ta3e4X3nVy-oG-wbPfYVOtHT2gFj_44EqsBY_rD20PuQOK5kZ9v7wWdNd6LNtIXbAvAdJrq2s9-Eou_gFyCVCJVMv_MsXmrCJlvB7SRy2uU/s1600/G%C3%B6r%C3%BCnt%C3%BC113.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 320px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgONUW9ceEiXeEHUwr3wUQrnZ7TRjm-sLA8Ta3e4X3nVy-oG-wbPfYVOtHT2gFj_44EqsBY_rD20PuQOK5kZ9v7wWdNd6LNtIXbAvAdJrq2s9-Eou_gFyCVCJVMv_MsXmrCJlvB7SRy2uU/s400/G%C3%B6r%C3%BCnt%C3%BC113.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5528015456165848178&quot; /&gt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/9202792741417387837/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/9202792741417387837' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/9202792741417387837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/9202792741417387837'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2010/10/13-musiad-fuar-cnr-expo.html' title='13. MÜSİAD Fuarı / CNR EXPO'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyOQpiuUtHwYQVE8h370cxva_cMH2xtoAZzTErOeHHr-4dco9sfDEmYRIfzlPJtHuOvQgMkoFJUKqqcZNlEs5_81T0qSgMDznC3okbIeJ3SKXp49IPYIgFDZ3lSDHprzAuvYF7tGlFMKM/s72-c/G%C3%B6r%C3%BCnt%C3%BC108.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-1035023503945773001</id><published>2010-09-18T01:11:00.021+03:00</published><updated>2011-01-12T12:42:54.918+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="deserialization"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="serialization"/><category scheme="http://www.blogger.com/atom/ns#" term="serileştirme"/><title type='text'>Java ile Nesneleri Dosyaya Kaydetme ve Okuma (Serialization)</title><content type='html'>Nesne yönelimli programlamada bellekte yüklü nesnelerin dosyaya kaydedilmesi ve tekrar dosyadan okunarak belleğe yüklenmesi olayına Serialization (Serileştirme olarak tercüme edilebilir) denmektedir. &lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGHJBaclyE7JRQb05jwzJakqA0Jvt1RTAhUMOvPnbBshqhwUYZFzJeSQxjdfUdaW8rxnVShRPifANIa6MY_0lzGIgqWjs0a22c6FLZvGaqCejPagMTYcxZtUfQPK8_vIMGT5qUS96Yta8/s1600/serialization.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGHJBaclyE7JRQb05jwzJakqA0Jvt1RTAhUMOvPnbBshqhwUYZFzJeSQxjdfUdaW8rxnVShRPifANIa6MY_0lzGIgqWjs0a22c6FLZvGaqCejPagMTYcxZtUfQPK8_vIMGT5qUS96Yta8/s400/serialization.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5518019489795576466&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Örneğimize geçmeden önce bu yöntem ile neler yapabileceğimizi değerlendirelim. Geliştirdiğimiz programlarda tüm işlemleri nesneler üzerinden gerçekleştiririz. Bazı durumlarda uygulamamızda kullanacağımız bilgileri bir dosya üzerinde saklamak isteyebiliriz. Bu noktada aklımıza veritabanı sistemleri gelebilir, fakat burada bahsettiğimiz veriler programın mantıksal verileri olduğu için genelde büyük boyutta olmazlar. Aynı zamanda nesnelerimizi veritabanında da tutabiliriz. Unutmamız gereken nokta Serialization dediğimiz olay nesnelerin hafızadaki yapısını ikili (binary) olarak saklamaktır. Neler yapılabilir sorusuna çok çeşitli cevaplar veribilir benim aklıma gelen şu başlıklar:&lt;br /&gt;- Uygulamanın ayarlarının kaydedilmesi&lt;br /&gt;- Basit bir veritabanı olarak kullanılması&lt;br /&gt;- Programın çökmesi durumunda en son tutarlı yerden devam etmesi için hafızanın kaydedilmesi...&lt;br /&gt;&lt;br /&gt;Normalde düşündüğümüz zaman bir nesneyi diskte saklamak çok külfetli bir iştir. Nesnenin tüm bilgilerini tek tek toplayıp bir sıraya koyacaksınız, ardından bunları karıştırmadan ve atlamadan (null değişkenler olabilir, ya da String benzeri dinamik genişleyen generic yapılar olabilir) doğru bir şekilde yazmalısınız. Okuma olayına hiç girmiyorum zaten. Ayrıca her nesnenin iç yapısı farklı olacaktır!&lt;br /&gt;&lt;br /&gt;Peki hafızadan direk BYTE dizisi olarak diske yazmak? Java dilinde hafızaya direk erişimimiz olmadığı (işaretçilerin olamaması) için normal şartlar altında mümkün olmaması lazım. Fakat Java bize bu işlemi çok kolay bir şekilde yapacak bir imkan sağlamaktadır.&lt;br /&gt;&lt;br /&gt;Java&#39;da yazılan tüm nesneler Serializable arayüzünden (interface) kalıtım aldığı sürece sorunsuz bir şekilde diske yazılabilmektedir. Aynı rahatlıkla diskten okunabilmektedir. Bunun için özel olarak hazırlanmış yazan ve okuyan sınıfları kullanmaktadır. &lt;br /&gt;&lt;br /&gt;Lafı fazla dolandırmadan örneğimize geçelim. Yorum satırlarını yeterli gördüğüm için tekrardan açıklama gereği duymadım.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkKPMjKmss5kWqUcsMb7KgROBCjC1tMFtRKxa9yK85yiV2L-6djeGMYe13Pb6pQapDUcJ4mESwwrOllC-2RufvOkNFC9Kun9NcG7jEZgVUq9jJ3o8qBcyqTbTv3j5PZoAVKnnWG7FOY9Y/s1600/serialization_src.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 237px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkKPMjKmss5kWqUcsMb7KgROBCjC1tMFtRKxa9yK85yiV2L-6djeGMYe13Pb6pQapDUcJ4mESwwrOllC-2RufvOkNFC9Kun9NcG7jEZgVUq9jJ3o8qBcyqTbTv3j5PZoAVKnnWG7FOY9Y/s400/serialization_src.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5518019624033522802&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre class=&quot;brush:java&quot;&gt;&lt;br /&gt;/*&lt;br /&gt; * Öğrenci Sınıfı&lt;br /&gt; * Ogrenci.java&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;package rbellek.blogspot.com;&lt;br /&gt;&lt;br /&gt;import java.io.Serializable;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author Ramazan&lt;br /&gt; */&lt;br /&gt;public class Ogrenci implements Serializable {&lt;br /&gt;&lt;br /&gt;    private String isim;&lt;br /&gt;&lt;br /&gt;    public String getIsim() {&lt;br /&gt;        return isim;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setIsim(String isim) {&lt;br /&gt;        this.isim = isim;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * Serilazation Örnek&lt;br /&gt; * Main.java&lt;br /&gt; */&lt;br /&gt;package rbellek.blogspot.com;&lt;br /&gt;&lt;br /&gt;import java.io.FileInputStream;&lt;br /&gt;import java.io.FileNotFoundException;&lt;br /&gt;import java.io.FileOutputStream;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.ObjectInputStream;&lt;br /&gt;import java.io.ObjectOutputStream;&lt;br /&gt;import java.util.logging.Level;&lt;br /&gt;import java.util.logging.Logger;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author Ramazan&lt;br /&gt; */&lt;br /&gt;public class Main {&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        Ogrenci o1 = new Ogrenci(); // Yeni bir öğrenci nesnesi oluşturalım.&lt;br /&gt;        o1.setIsim(&quot;Ahmet&quot;); // İsmini verelim.&lt;br /&gt;        System.out.println(o1.getIsim()); // Test edelim.&lt;br /&gt;        try {&lt;br /&gt;            // Nesneyi dosyaya kaydedelim.&lt;br /&gt;            FileOutputStream yazmac = new FileOutputStream(&quot;Ogrenci1.nesne&quot;); // Dosyaya veri aktarım akışı nesnesi oluşturalım.&lt;br /&gt;            ObjectOutputStream nesneYazmac = new ObjectOutputStream(yazmac); // Nesneleri veri akışlarına yazmaya yarayan nesneyi oluşturalım.&lt;br /&gt;            nesneYazmac.writeObject(o1); // Öğrenci nesnemizi dosyaya yazıyoruz.&lt;br /&gt;            nesneYazmac.close(); // akışı kapatalım.&lt;br /&gt;        } catch (FileNotFoundException ex) {&lt;br /&gt;            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);&lt;br /&gt;        } catch (IOException ex) {&lt;br /&gt;            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        o1.setIsim(&quot;Mehmet&quot;); // Öğrenci nesnemizin adını değiştirelim.&lt;br /&gt;        System.out.println(o1.getIsim()); // Test edelim.&lt;br /&gt;&lt;br /&gt;        Ogrenci o2 = null; // Başka bir öğrenci nesnesi referansı. (Henüz bir nesne oluşturmadık!)&lt;br /&gt;&lt;br /&gt;        try {&lt;br /&gt;            FileInputStream okuyucu = new FileInputStream(&quot;Ogrenci1.nesne&quot;); // Dosyadan veri alan akış nesnesi.&lt;br /&gt;            ObjectInputStream nesneOkuyucu = new ObjectInputStream(okuyucu); // Dosyada kayıtlı nesneleri okuyan nesne.&lt;br /&gt;            o2 = (Ogrenci) nesneOkuyucu.readObject(); // Öğrenci nesnemizi okuyalım.&lt;br /&gt;            nesneOkuyucu.close(); // akışı kapatalım.&lt;br /&gt;        } catch (FileNotFoundException ex) {&lt;br /&gt;            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);&lt;br /&gt;        } catch (IOException ex) {&lt;br /&gt;            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);&lt;br /&gt;        } catch (ClassNotFoundException ex) {&lt;br /&gt;            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        System.out.println(o2.getIsim()); // Okunan nesne adı Ahmet olmalı...&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;İyi çalışmalar...</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/1035023503945773001/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/1035023503945773001' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/1035023503945773001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/1035023503945773001'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2010/09/java-ile-nesneleri-dosyaya-kaydetme-ve.html' title='Java ile Nesneleri Dosyaya Kaydetme ve Okuma (Serialization)'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGHJBaclyE7JRQb05jwzJakqA0Jvt1RTAhUMOvPnbBshqhwUYZFzJeSQxjdfUdaW8rxnVShRPifANIa6MY_0lzGIgqWjs0a22c6FLZvGaqCejPagMTYcxZtUfQPK8_vIMGT5qUS96Yta8/s72-c/serialization.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-2689930793281146148</id><published>2010-06-30T23:41:00.008+03:00</published><updated>2010-07-01T00:14:12.748+03:00</updated><title type='text'>Ford OTOSAN - jQuery Sunumu</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi84UVTedonvQgitVYEET7lTuDSVhjW0VX3LO8GOH0wULv9gZoc_5hsuviKWxMKPK9QmkcCySjBhEaetPZWsnodzqah0DWWyX3UX7J0bNIqTrhpCPewthqcyPUES4luxHlraT9lSWAOsU/s1600/ford_logo_2.gif&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 150px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi84UVTedonvQgitVYEET7lTuDSVhjW0VX3LO8GOH0wULv9gZoc_5hsuviKWxMKPK9QmkcCySjBhEaetPZWsnodzqah0DWWyX3UX7J0bNIqTrhpCPewthqcyPUES4luxHlraT9lSWAOsU/s400/ford_logo_2.gif&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5488674341900667826&quot; /&gt;&lt;/a&gt;Bünyesinde çalışmakta olduğum Ford OTOSAN firması Bilgi İşlem merkezinde geçtiğimiz günlerde jQuery JavaScript kütüphanesi hakkında genel bilgi ve tanıtım amacıyla bir sunum yaptım. Sunumda bahsettiğim uygulamaları video olarak hazırladım.&lt;br /&gt; &lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmZEC4xiuj1GHFNoa86DOQudjkUq-BLa3jjcp9PyW1iYPW2qCVj8swwaZLNRm-blSIAkgJJiFpSnS290kPqeCZolzQ07x5hyphenhyphen3OYacnl9hqLaoS2ibsj5ltuLiEy-KL6DTL4blsqEyN9Qk/s1600/2_image001.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmZEC4xiuj1GHFNoa86DOQudjkUq-BLa3jjcp9PyW1iYPW2qCVj8swwaZLNRm-blSIAkgJJiFpSnS290kPqeCZolzQ07x5hyphenhyphen3OYacnl9hqLaoS2ibsj5ltuLiEy-KL6DTL4blsqEyN9Qk/s400/2_image001.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5488674607639337906&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Genel hatlarıyla sunum içeriğinden bahsetmek gerekirse;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;jQuery Nedir?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Kimler Kullanıyor?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Lisans ve Kullanım Koşulları&lt;/li&gt;&lt;br /&gt;&lt;li&gt;jQuery Kullanmak için 3 Temel Sebep&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Kimlere Hitap Ediyor?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Kurulum Aşamaları&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Temel Taşları&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Basit Ajax İşlemleri&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Asp.NET Web Formlar ve Web Servis Entegrasyonu&lt;/li&gt;&lt;br /&gt;&lt;li&gt;jQueryUI ile Etkileşimli Görsel Arayüzler&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Eklenti Desteği&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQjjaTMTPb6AqI-6rik1u3lPgc1Y5W4aiJLb39dvgMLM9AtKMnC6t4hvG1kCD1TMGezEiq9oFIxVtjPhisL_t_DJwJOy7FpZJiFJzYDWwcOg1S9QM1fCQeFVwiPzjgIdoj1vP3vsAKv0o/s1600/Otosan-logo.gif&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 200px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQjjaTMTPb6AqI-6rik1u3lPgc1Y5W4aiJLb39dvgMLM9AtKMnC6t4hvG1kCD1TMGezEiq9oFIxVtjPhisL_t_DJwJOy7FpZJiFJzYDWwcOg1S9QM1fCQeFVwiPzjgIdoj1vP3vsAKv0o/s400/Otosan-logo.gif&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5488674475353713538&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;jQuery Sunum Dosyaları&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;http://www.bellexoft.com/blog_data/jQuery.pdf&quot;&gt;Portable Document File - PDF&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;http://www.bellexoft.com/blog_data/jQuery.ppt&quot;&gt;Microsoft Office PowerPoint File - PPT&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;http://www.bellexoft.com/blog_data/jQuery.odp&quot;&gt;Open Office Presentation File - ODP&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Uygulama Videoları&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;http://www.bellexoft.com/blog_data/jQuery_sunum_video.rar&quot;&gt;Tüm Videolar&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/2689930793281146148/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/2689930793281146148' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/2689930793281146148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/2689930793281146148'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2010/06/ford-otosan-jquery-sunumu.html' title='Ford OTOSAN - jQuery Sunumu'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi84UVTedonvQgitVYEET7lTuDSVhjW0VX3LO8GOH0wULv9gZoc_5hsuviKWxMKPK9QmkcCySjBhEaetPZWsnodzqah0DWWyX3UX7J0bNIqTrhpCPewthqcyPUES4luxHlraT9lSWAOsU/s72-c/ford_logo_2.gif" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-8736810174144840289</id><published>2010-05-20T15:44:00.018+03:00</published><updated>2010-06-30T23:10:01.363+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="controller"/><category scheme="http://www.blogger.com/atom/ns#" term="framework"/><category scheme="http://www.blogger.com/atom/ns#" term="IDE"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="java EE"/><category scheme="http://www.blogger.com/atom/ns#" term="model"/><category scheme="http://www.blogger.com/atom/ns#" term="mvc"/><category scheme="http://www.blogger.com/atom/ns#" term="spring"/><category scheme="http://www.blogger.com/atom/ns#" term="view"/><category scheme="http://www.blogger.com/atom/ns#" term="web"/><title type='text'>Spring Framework - Web MVC / NetBeans 6.8 / Bölüm 2</title><content type='html'>&lt;span style=&quot;font-style:italic; color: #0279ff;&quot;&gt;Not: Bu yazı &lt;a style=&quot;color: #0279ff;&quot; href=&quot;http://rbellek.blogspot.com/2010/05/spring-framework-web-mvc-netbeans-68.html&quot; style=&quot; color: #0279ff;&quot;&gt;Spring Framework - Web MVC / NetBeans 6.8&lt;/a&gt; adlı yazının devamı niteliğindedir.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bir önceki yazımda kaldığım noktadan devame etmeye çalışacağım. Giriş yazımda bir Spring Web MVC projesini NetBeans 6.8 ile oluşturmuştuk. Şimdi yapıyı incelemeye devam edeceğiz. WEB-INF dizini altındaki ayar dosyalarını inceleyerek devam edelim.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8iphIh0tx8vpDWYNcNM4Mlyb7KZ9wk1MlBv-ri4KZieuOKSySXH2h-H7FyosmQFms3bxOXOS9YR01lLW1e9WY7_4Fgncf2lDtogpnete5UuNSi0NfmcTFBuxepXDE6an2JVy2lH1SM88/s1600/s6.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 192px; height: 109px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8iphIh0tx8vpDWYNcNM4Mlyb7KZ9wk1MlBv-ri4KZieuOKSySXH2h-H7FyosmQFms3bxOXOS9YR01lLW1e9WY7_4Fgncf2lDtogpnete5UuNSi0NfmcTFBuxepXDE6an2JVy2lH1SM88/s400/s6.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5473353164411196274&quot; /&gt;&lt;/a&gt;&lt;br /&gt;İlk olarak Web.xml den biraz bahsetmek istiyorum. Bu dosya Java Web projelerinde genel ayarların yapıldığı standart bir dosyadır. Tıpkı Asp.NET projelerindeki Web.config dosyası gibi. Arzu ederseniz içeriğine bir gözatalım.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: xml&quot;&gt;&lt;br /&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;web-app version=&quot;2.5&quot; xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&quot;&amp;gt;&lt;br /&gt;    &amp;lt;context-param&amp;gt;&lt;br /&gt;        &amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;        &amp;lt;param-value&amp;gt;/WEB-INF/applicationContext.xml&amp;lt;/param-value&amp;gt;&lt;br /&gt;    &amp;lt;/context-param&amp;gt;&lt;br /&gt;    &amp;lt;listener&amp;gt;&lt;br /&gt;        &amp;lt;listener-class&amp;gt;org.springframework.web.context.ContextLoaderListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;    &amp;lt;/listener&amp;gt;&lt;br /&gt;    &amp;lt;servlet&amp;gt;&lt;br /&gt;        &amp;lt;servlet-name&amp;gt;dispatcher&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;        &amp;lt;servlet-class&amp;gt;org.springframework.web.servlet.DispatcherServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;        &amp;lt;load-on-startup&amp;gt;2&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;    &amp;lt;/servlet&amp;gt;&lt;br /&gt;    &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;        &amp;lt;servlet-name&amp;gt;dispatcher&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;        &amp;lt;url-pattern&amp;gt;*.htm&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;    &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;    &amp;lt;session-config&amp;gt;&lt;br /&gt;        &amp;lt;session-timeout&amp;gt;&lt;br /&gt;            30&lt;br /&gt;        &amp;lt;/session-timeout&amp;gt;&lt;br /&gt;    &amp;lt;/session-config&amp;gt;&lt;br /&gt;    &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;        &amp;lt;welcome-file&amp;gt;redirect.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;    &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;İlk bakışta göze batan karmaşıklık sizi korkutmasın. Aslında anlaması gayet basit. Burada XML formatında ayarlar mevcut. Şimdilik bu dosya salt okunur gibi olmalı. Buradan herhangi bir ayarı değiştirmeyelim. Aksi takdirde uygulamamız doğru çalışmayabilir. Fakat anlamadan da geçemeyiz. Eğer bu detayları iyi kavramazsak, frameworke tam olarak hakim olamayız. context-param kısmında projemiz için içerik ayarlarının yapıldığı düğümdür. Buraya contextConfigLocation adında bir anahatar ve /WEB-INF/applicationContext.xml şeklinde bir değer girilmiştir. Bu dosya Spring projemizde yapacağımız bazı ayarların (veritabanı bağlantı cümleleri vb.) bulunacağı dosya. listener düğümünde dinleyici sınıfları belirtiyoruz. Değer olarak &lt;span style=&quot;color: #0279ff;&quot;&gt;org.springframework.web.context.ContextLoaderListener&lt;/span&gt; sınıfı eklenmiş. Daha sonra bir servlet tanımlanmış. dispatcher adındaki bu servlet Spring&#39;in temel çözümleme servlet sınıfıdır. Sınıfın yolu &lt;span style=&quot;color: #0279ff;&quot;&gt;org.springframework.web.servlet.DispatcherServlet&lt;/span&gt; şeklinde eklenmiş. servlet-mapping düğümü ile hangi servlet hangi desenle (örüntü - pattern) eşleceği belirtiliyor. dispatcher servleti için *.htm şeklinde bir desen verilmiş. Daha önceki yazımda belirtiğim noktaya geldik. Kullanıcı web tarayıcısıyla web sunucumuza *.htm şeklinde bir sorgu yaptığı zaman web sunucumuz bunu anlayarak ilgili servleta (burada dispatcher oluyor) yönlendirecektir. Son olarak welcome-file-list düğümü ile sitemiz ilk açılışta hangi sayfayı direk gösterecek onu belirtiyoruz. Örneğin Apache web sunucusunda varsayılan karşılama dosyası index.html, index.htm ya da index.php, IIS sunucusunda default.html, default.htm, default.asp ya da default.aspx şeklinde olabilir. NetBeans otomatik olarak redirect.jsp dosyasını seçmiş. Bu kısmı dilediğiniz gibi (desene uygun bir URL ile) edeğiştirebilirsiniz.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4l3lXVa40fnaDXcbi9raGG0xL0wbaNDwfsVdWTTTeq7ShYWZ9T2pfJHnXgehDAv3D05wGfWoGCLB3uBLTcPpPBZLDb4ru8R01W7ETf94uYOOAKFObxe8kEAskNr2TBcd779OBG4Sm0YE/s1600/s21.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 225px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4l3lXVa40fnaDXcbi9raGG0xL0wbaNDwfsVdWTTTeq7ShYWZ9T2pfJHnXgehDAv3D05wGfWoGCLB3uBLTcPpPBZLDb4ru8R01W7ETf94uYOOAKFObxe8kEAskNr2TBcd779OBG4Sm0YE/s400/s21.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5473343580416539394&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;NetBeans Web.xml için görsel ayar penceresi&lt;/span&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;Şimdi gelelim dispatcher-servlet.xml dosyamıza. Bu dosya Web.xml dosyasında belirtiğimiz dispathcer servlet sınıfı için ayar niteliğindedir. Vakit kaybetmeden içeriğine bir göz atalım.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: xml&quot;&gt;&lt;br /&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;&lt;br /&gt;       xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;br /&gt;       xmlns:p=&quot;http://www.springframework.org/schema/p&quot;&lt;br /&gt;       xmlns:aop=&quot;http://www.springframework.org/schema/aop&quot;&lt;br /&gt;       xmlns:tx=&quot;http://www.springframework.org/schema/tx&quot;&lt;br /&gt;       xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&lt;br /&gt;       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd&lt;br /&gt;http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd&quot;&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;bean class=&quot;org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping&quot;/&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;!--&lt;br /&gt;    Most controllers will use the ControllerClassNameHandlerMapping above, but&lt;br /&gt;    for the index controller we are using ParameterizableViewController, so we must&lt;br /&gt;    define an explicit mapping for it.&lt;br /&gt;    --&amp;gt;&lt;br /&gt;    &amp;lt;bean id=&quot;urlMapping&quot; class=&quot;org.springframework.web.servlet.handler.SimpleUrlHandlerMapping&quot;&amp;gt;&lt;br /&gt;        &amp;lt;property name=&quot;mappings&quot;&amp;gt;&lt;br /&gt;            &amp;lt;props&amp;gt;&lt;br /&gt;                &amp;lt;prop key=&quot;index.htm&quot;&amp;gt;indexController&amp;lt;/prop&amp;gt;&lt;br /&gt;            &amp;lt;/props&amp;gt;&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;bean id=&quot;viewResolver&quot;&lt;br /&gt;          class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&lt;br /&gt;          p:prefix=&quot;/WEB-INF/jsp/&quot;&lt;br /&gt;          p:suffix=&quot;.jsp&quot; /&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;!--&lt;br /&gt;    The index controller.&lt;br /&gt;    --&amp;gt;&lt;br /&gt;    &amp;lt;bean name=&quot;indexController&quot;&lt;br /&gt;          class=&quot;org.springframework.web.servlet.mvc.ParameterizableViewController&quot;&lt;br /&gt;          p:viewName=&quot;index&quot; /&amp;gt;&lt;br /&gt;    &lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;İlk baştaki uzun tanımlamaları direk atlıyorum. Şimdilik bu ayarlar konumuz değil. Olduğu gibi bırakıyoruz. &lt;br /&gt;&lt;br /&gt;bean tagıyla başlayan satırda yeni Spring bean sınıfını (&lt;span style=&quot;color: #0279ff;&quot;&gt;org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping&lt;/span&gt;) tanımlıyoruz. Alt satırdaki yorum bu satırları anlamamız için önemli. Yorum satırında bu eklediğimiz sınıfın (&lt;span style=&quot;color: #0279ff;&quot;&gt;ControllerClassNameHandlerMapping&lt;/span&gt;) bir çok kontrollör sınıf tarafından kullanıldığından fakat indexController sınıfı için ParameterizableViewController sınıfının kullanıldığını bu yüzden harici bir rota belirlememiz gerektiğinden bahsetmektedir. &lt;br /&gt;Bir alt satırda &lt;span style=&quot;color: #0279ff;&quot;&gt;org.springframework.web.servlet.handler.SimpleUrlHandlerMapping&lt;/span&gt; sınıfının tanımlanmasıyla görebiliyoruz. Verdiği değerler önemli. index.htm şeklinde gelen bir isteğin indexController nesnesi tarafından yorumlanacağı bu satırda belirtilmektedir. Siz burayı dilediğiniz gibi değiştirebilirsiniz. Örneğin merhaba.htm yapabilirsiniz. Dikkat etmeniz gereken bir nokta olarak dosya uzantısı .htm olaması söylenebilir. Unutmayalım Web.xml dosyasında dispatcher servlet için *.htm şeklinde bir desen belirlemiştik. Buna uymak zorundayız. &lt;br /&gt;Bir sonraki satırda viewResolver sınıfının tanımlandığını görüyoruz. Bu çok önemli özellikle yapıyı idrak etme hususunda.  class=&quot;&lt;span style=&quot;color: #0279ff;&quot;&gt;org.springframework.web.servlet.view.InternalResourceViewResolver&lt;/span&gt;&quot; Spring&#39;in dahili kaynak görüntü çözümleyici sınıfı. p:prefix=&quot;/WEB-INF/jsp/&quot; ve p:suffix=&quot;.jsp&quot; satırları dışardan gelen istekleri uygulamamızın iç yapısında nereye karşılık geldiğini gösterir. prefix (öntakı) değeri ile görüntülerin dizinini suffix(son ek) ile yerel dosyaların uzantısını belirtiyoruz. Yani dışarıdan gelen index.htm şeklindeki bir sorgu dispatcher servleta söylediğimiz *.htm şeklindeki desene uygun olarak parçalanır ve index kelimesi görüntü olarak elde edilir. Bir önceki satırda belirtilen rotaya uyun olarak (index.htm -&amp;gt; indexController), bir sonraki satırda inceleyeceğimiz görüntü&amp;lt;-&amp;gt;kontrollör tanımlaması ile index görüntüsü olduğu karar kılınır. Sonra /WEB-INF/jsp/&lt;span style=&quot;color: #FF0000;&quot;&gt;index&lt;/span&gt;.jsp dosyası (indexController denetiminde) görüntü olarak açılır.&lt;br /&gt;Bir sonraki satırda (az önce de söylediğim gibi) görüntü&amp;lt;-&amp;gt;kontrollör tanımlaması yapılmakta. name=&quot;indexController&quot; ile kontrollör adını, class=&quot;&lt;span style=&quot;color: #0279ff;&quot;&gt;org.springframework.web.servlet.mvc.ParameterizableViewController&lt;/span&gt;&quot; ile kullanılacak sınıfı (burada hazır sınıf kullandık, kendi sınıfımızı oluşturup bu sınıftan kalıtım da alabilirdik),  p:viewName=&quot;index&quot; ile görüntü adını belirtiyoruz.&lt;br /&gt;&lt;br /&gt;Ayarlarla ilgili kısmı burada noktalıyorum. Bir sonraki yazımda görüntü ve kontrollör oluşturma ve kullanma konularına değineceğim inşallah. Anlatımda kusurum varsa affınıza sığınıyorum.&lt;br /&gt;Görüşmek üzere...</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/8736810174144840289/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/8736810174144840289' title='1 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/8736810174144840289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/8736810174144840289'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2010/05/spring-framework-web-mvc-netbeans-68_20.html' title='Spring Framework - Web MVC / NetBeans 6.8 / Bölüm 2'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8iphIh0tx8vpDWYNcNM4Mlyb7KZ9wk1MlBv-ri4KZieuOKSySXH2h-H7FyosmQFms3bxOXOS9YR01lLW1e9WY7_4Fgncf2lDtogpnete5UuNSi0NfmcTFBuxepXDE6an2JVy2lH1SM88/s72-c/s6.PNG" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-139961458828441634</id><published>2010-05-16T00:48:00.008+03:00</published><updated>2011-01-12T12:44:08.200+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="FILO"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="LIFO"/><category scheme="http://www.blogger.com/atom/ns#" term="stack"/><category scheme="http://www.blogger.com/atom/ns#" term="veri yapıları"/><category scheme="http://www.blogger.com/atom/ns#" term="yığın"/><title type='text'>Yığın Veri Yapısı</title><content type='html'>Merhabalar,&lt;br /&gt;Bu yazımda yığın veri yapısından bahsetmek istiyorum. Çalışması LIFO (Last In First Out - Son Giren İlk Çıkar) ilkesine dayanmaktadır. Fiziksel bir örnek vermek gerekirse yalnızca bir tek arabanın geçebileceği kadar genişlikte olan çıkmaz bir sokağa arabaların ard arda girmesi gibidir. Son giren araba ilk çıkmalıdır ki diğer arabalar çıkabilsin. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;Peki Ne İşe Yarar?&lt;/span&gt;&lt;br /&gt;Günümüzde bir çok sistem hafıza yönetiminde bu veri yapısını kullanmaktadır. Özellikle sıranın önemli olduğu durumlarda. Mesela, programlama dillerinde açtığımız parantezlerin kapatılıp kapatılmadığının kontrolü, işletim sistemi düzeyinde fonksiyonların çağrımı sırasında parametrelerin aktarımı, aritmetik işlemlerde işlem önceliğinin sağlanması ( çarpmanın toplamaya üstünlüğü), karakter katarlarının ters çevrilmesi vb. bir çok alanda kullanılmaktadır.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;Teknik olarak açıklamak gerekirse...&lt;/span&gt;&lt;br /&gt;Belirli bir hafıza bölgesini programcıdan soyutluyoruz. Direk erişimi engelliyoruz. Programcıya hafızaya erişmesi için fonksiyonlar veriyoruz. Bunlar push, pop ve isEmpty olabilir. Sırasıyla açıklayalım.&lt;br /&gt;&lt;ul&gt;&lt;li style=&quot;color: #0279ff;&quot;&gt;Push&lt;/li&gt;&lt;/ul&gt;Yığına bir eleman eklemek istediğimizde bu fonksiyonu çağırırız. Fonksiyona veridiğimiz değer yığının en sonuna eklenir. &lt;br /&gt;&lt;ul&gt;&lt;li style=&quot;color: #0279ff;&quot;&gt;Pop&lt;/li&gt;&lt;/ul&gt;Yığından bir eleman çekmek için kullanılır. Bu fonksiyon bize yığının en sonundaki yani son eklediğimiz elemanı yığından alır bize verir. Daha önceki elemanlara erişmek için Pop fonksiyonunu çağırmaya devam etmeliyiz. Bu fonksiyon herhangi bir parametre almaz.&lt;br /&gt;&lt;ul&gt;&lt;li style=&quot;color: #0279ff;&quot;&gt;isEmpty&lt;/li&gt;&lt;/ul&gt;Bu fonksiyon ile yığının boş olup olmadığını kontrol edebiliriz.&lt;br /&gt;Siz fonksiyonlarınıza istediğiniz ismi verebilirsiniz. Korumanız gereken tek şey LIFO ilkesidir. Geri kalan kısmı değiştirmekte özgürsünüz.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;Hemen Java ile bir örnekleme yapalım:&lt;/span&gt;&lt;br /&gt;&lt;pre class=&quot;brush: java;&quot;&gt;&lt;br /&gt;package test;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;&lt;br /&gt;class Stack&lt;br /&gt;{&lt;br /&gt; private ArrayList&amp;lt;Object&amp;gt; objectList; // nesneleri tutacak generic yapımız.&lt;br /&gt; &lt;br /&gt; public Stack()&lt;br /&gt; {&lt;br /&gt;  objectList = new ArrayList&amp;lt;Object&amp;gt;(); // nesnemizi üretelim.&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public boolean isEmpty()&lt;br /&gt; {&lt;br /&gt;  return objectList.isEmpty(); // liste boş ise yığında boştur.&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void Push(Object obj)&lt;br /&gt; {&lt;br /&gt;  objectList.add(obj); // yığına eleman ekleyelim.&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public Object Pop()&lt;br /&gt; {&lt;br /&gt;  if (objectList.isEmpty())&lt;br /&gt;   return null; // yığın boş ise eleman çekemeyiz. Sonuç null değeri.&lt;br /&gt;  Object o = objectList.get(objectList.size()-1); // sondan bir elemanı alalım.&lt;br /&gt;  objectList.remove(objectList.size()-1); // sonra bu elemanı yığından çıkartalım.&lt;br /&gt;  return o; // geriye döndürelim.&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public class Main{&lt;br /&gt;&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;&lt;br /&gt;  Stack s = new Stack();&lt;br /&gt;  if (s.isEmpty())&lt;br /&gt;   System.out.println(&quot;yığın boş.&quot;);&lt;br /&gt;  s.Push(5);&lt;br /&gt;  if (s.isEmpty())&lt;br /&gt;   System.out.println(&quot;bu satırı görmememiz gerekiyor.&quot;);&lt;br /&gt;  s.Push(45);&lt;br /&gt;  System.out.println(s.Pop());&lt;br /&gt;  System.out.println(s.Pop());&lt;br /&gt;  System.out.println(s.Pop());&lt;br /&gt;  System.out.println(s.Pop());&lt;br /&gt;  if (s.isEmpty())&lt;br /&gt;   System.out.println(&quot;yığında eleman yok.&quot;);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En basit haliyle böyle gerçeklenebilirdi sanırım. Veri yapılarını açıklamaya devam edeceğim.&lt;br /&gt;Görüşmek üzere...</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/139961458828441634/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/139961458828441634' title='2 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/139961458828441634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/139961458828441634'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2010/05/ygn-veri-yaps.html' title='Yığın Veri Yapısı'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-8656066613344584557</id><published>2010-05-15T22:34:00.013+03:00</published><updated>2011-01-12T12:41:07.911+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="8085"/><category scheme="http://www.blogger.com/atom/ns#" term="intel"/><category scheme="http://www.blogger.com/atom/ns#" term="mikroişlemci"/><category scheme="http://www.blogger.com/atom/ns#" term="register"/><title type='text'>Intel 8085 Mikroişlemci / Başlangıç</title><content type='html'>Herkese merhaba,&lt;br /&gt;Bu yazımda Intel firması tarafından geliştirilmiş olan 8085 mikroişlemcisi yapısı, çalışma prensibi ve programlanması ile ilgili genel bilgi vereceğim. Başlıkta da belirttiğim gibi bu mikroişlemciler ve micro programlama konusuna girişimin imgesidir. Öncelikle bu basit mikroişlemciyi inceleyip programlamasına değineceğim. Daha sonra yine Intel firmasının 8051 mikrodenetleyicisinden bahsedeceğim. Daha sonraki yazılarımda sayısal sistemleri en başından alıp bir mikroişlemci nasıl çalıştığını anlatacağım. Daha sonra kendi mikroişlemcimi tasarlayacağım. Umarım atlamadan anlaşır bir biçimde anlatabilirim. Siz de üzerinde çalışıp kendi mikroişlemcinizi geliştirebilirsiniz.&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;&lt;br /&gt;Intel 8085 8-bit Microprocessor&lt;/span&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcDLIA0AplJ0HsJEDB0nDB9mWG13nnE0co03Sn0jXs7nLrg0hubfNE6qehAxvmYTinB4mQIKSJMrrwtKgbCzf8kuXq1JfgPNPFhu6xOPKoynZPG22BvZcaxgXmSSmbvOdnifj0wnvs5Z0/s1600/KL_Intel_P8085AH.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 183px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcDLIA0AplJ0HsJEDB0nDB9mWG13nnE0co03Sn0jXs7nLrg0hubfNE6qehAxvmYTinB4mQIKSJMrrwtKgbCzf8kuXq1JfgPNPFhu6xOPKoynZPG22BvZcaxgXmSSmbvOdnifj0wnvs5Z0/s400/KL_Intel_P8085AH.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5471591374534328882&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Her konuda olduğu gibi bu konuda da tarihsel bilgilerle vaktinizi çalmak gibi bir niyetim yok. Merak edenler varsa &lt;a href=&quot;http://en.wikipedia.org/wiki/8085&quot;&gt;http://en.wikipedia.org/wiki/8085&lt;/a&gt; adresinden gerekli bilgileri alabilir. Programlama kısmına geçmeden önce işlemcinin yapısı hakkında bilgi vermek doğru olacaktır. Başlamadan önce belirtmeliyim. Bu yazımda sadece mikroişlemcinin yapısı ve programlamasından bahsedeceğim. Elektronik bir devrede nasıl kullanıldığından vb. diğer işlemlerden bahsetmeyeceğim. Genel olarak soyut sorunlar üzerinden yola çıkacağız. &lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK3QhLagWPmMwIiII-ARQKXhhnVuBEd22vbjJUujwXt9IfwySpcCuACo0M_Y6n54Vy2QVmbVShAYEBLBqm0t2iPOnKR4RkNYoDbXZKPQFT3P9xegOBUsHSwI6Syb5sVJ5Tij0xpOYyapM/s1600/svg2raster.jpeg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 361px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK3QhLagWPmMwIiII-ARQKXhhnVuBEd22vbjJUujwXt9IfwySpcCuACo0M_Y6n54Vy2QVmbVShAYEBLBqm0t2iPOnKR4RkNYoDbXZKPQFT3P9xegOBUsHSwI6Syb5sVJ5Tij0xpOYyapM/s400/svg2raster.jpeg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5471597361637187234&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Yukarıdaki şema mikroişlemcinin iç yapısını göstermektedir. Sırayla açıklayalım...&lt;br /&gt;&lt;ul&gt;&lt;li style=&quot;color: #0279ff;&quot;&gt;8 bit veri yolu&lt;/li&gt;&lt;/ul&gt;İşlemci birimleri arası haberleşmeyi sağlayan ortak kanal olarak tanımlanabilir. Bir seferde 8-bit veri taşıyabilir ve yalnızca tek bir birim kullanabilir. Bu birim kanala veriyi bırakır, veri yolunun bağlı olduğu tüm birimlere veri iletiri fakat yalnızca o anda ona ihtiyacı olan birim o veriyi kullanır. Tıpkı Ethernet (IEEE 802.3) protokolünde olduğu gibi. Burada farklı bir durum olarak veriyi kullanacak birimin aktif diğerlerinin pasif olamasını işlemci ayarlamaktadır. Toparlamak gerekirse, bir broadcast (yayın) tipi iletişim var fakat bu yayına yalnızca ilgili birim aldırış ediyor.&lt;br /&gt;&lt;ul&gt;&lt;li style=&quot;color: #0279ff;&quot;&gt;ALU (Arithmetic Logic Unit)&lt;/li&gt;&lt;/ul&gt;Diğer bir değişle Ardışıl Mantık Birimi. Bu birimde tüm mantıksak ve aritmetik işlemler yapılmaktadır. Toplama, çıkarma, karşılaştırma vb.&lt;br /&gt;&lt;ul&gt;&lt;li style=&quot;color: #0279ff;&quot;&gt;Accumulator (Akümülatör)&lt;/li&gt;&lt;/ul&gt;Temel kaydedici olarak tanımlasam çok yanlış olmaz sanırım. Tüm aritmetik işlem sonuçları bu kaydedicide saklanmaktadır. 8-bit veri saklayabilmektedir. Bir çok işlemde bu kaydedici kullanılmaktadır. Yeri geldikçe detaylandıracağım.&lt;br /&gt;&lt;ul&gt;&lt;li style=&quot;color: #0279ff;&quot;&gt;Instruction Register&lt;/li&gt;&lt;/ul&gt;Bu saklayıcı mikroişlemcinin işleyeceği komutu tutar. 8 bitliktir. Bu mikroişlemcinin 8 bit kelime işlemci olduğunu belirtmiştik. Bir seferde bir tek komutu işleyebilmektedir ve bu komut 8 bit (1 byte) olmak zorundadır. Zaten hafıza birimimizin (RAM / ROM) her bir gözü 1 byte boyutundadır.&lt;br /&gt;&lt;ul&gt;&lt;li style=&quot;color: #0279ff;&quot;&gt;Program Counter&lt;/li&gt;&lt;/ul&gt;İşlemcinin bir sonraki işleyeceği komutun adresini saklayan kaydedicidir. Boyutu 16 bittir. Buradan şu sonucu çıkartabiliriz, 8085 mikroişlemcisi 16 bit ile adreslenebilecek kadar hafıza alanında kod koşturabilmektedir. 2^16 ~= 64 kb hafıza alanı.&lt;br /&gt;&lt;ul&gt;&lt;li style=&quot;color: #0279ff;&quot;&gt;Stack Pointer&lt;/li&gt;&lt;/ul&gt;Yığın hafıza bölgesinin adresini tutar. Buraya FILO (First In Last Out - İlk Giren Son Çıkar) mantığıyla veri ekleyip çıkartabiliyoruz. Boyut 16 bit.&lt;br /&gt;&lt;ul&gt;&lt;li style=&quot;color: #0279ff;&quot;&gt;Flag Register&lt;/li&gt;&lt;/ul&gt;Bazı komutlar sonrasında durum kontrolü yapılması gerekmektedir. Örneğin bir toplama işleminde sonuç saklayıcının boyutunu aşabilir. Bu durumda işlemci kilitlenmez işleme devam eder, fakat programcı bu durumdan haberdar olması gerekmektedir. Programcı böyle bir durumun gerçekleşip gerçekleşmediğini Bayrak Saklayıcısındaki taşma bayrağının 1 - 0 durumunu inceleyerek anlayabilir. Bayraklardan kısaca bahsetmek gerekirse;&lt;br /&gt;Sıfır Bayrağı = çıkarma işleminin sonucu 0 ise,&lt;br /&gt;Taşma Bayrağı = toplama işlemi saklayıcıya sığmıyorsa, ya da çıkarılan çıkandan küçükse,&lt;br /&gt;İşaret Bayrağı = Akümülatördeki sayı negatif ise (yani 8. bit 1 ise)&lt;br /&gt;bu bayraklar 1 değerini alır. Aksi durumda 0 değerindelerdir.&lt;br /&gt;&lt;br /&gt;Yazıma burada ara veriyorum. Bir sonraki yazımda kaldığım yerden tanıtmaya devam edeceğim. Daha sonra programlama kısmına geçeceğiz. Vaktim olursa bellek organizasyonu konusuna da değineceğim.&lt;br /&gt;Görüşmek üzere...</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/8656066613344584557/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/8656066613344584557' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/8656066613344584557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/8656066613344584557'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2010/05/intel-8085-mikroislemci-baslangc.html' title='Intel 8085 Mikroişlemci / Başlangıç'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcDLIA0AplJ0HsJEDB0nDB9mWG13nnE0co03Sn0jXs7nLrg0hubfNE6qehAxvmYTinB4mQIKSJMrrwtKgbCzf8kuXq1JfgPNPFhu6xOPKoynZPG22BvZcaxgXmSSmbvOdnifj0wnvs5Z0/s72-c/KL_Intel_P8085AH.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-8478876267197104613</id><published>2010-05-15T02:50:00.012+03:00</published><updated>2011-01-12T12:45:04.275+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bağlı liste"/><category scheme="http://www.blogger.com/atom/ns#" term="c"/><category scheme="http://www.blogger.com/atom/ns#" term="linked list"/><category scheme="http://www.blogger.com/atom/ns#" term="veri yapıları"/><title type='text'>Bağlı Listeler</title><content type='html'>Merhabalar,&lt;br /&gt;Bu yazımda sizlere bağlı liste veri yapısından bahsedeceğim. Veri yapısı deyince kulağa egzotik gelebilir. Ama inanın bildiğiniz şeylerden farklı bir şey anlatmayacağım. &lt;span style=&quot;font-style:italic; color: #0279ff;&quot;&gt;&quot;Bildiklerimizi bir araya getirerek bilmediğimiz bir yapıyı tanımlama&quot;&lt;/span&gt; şeklinde anlıyorum veri yapılarını...&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;Nedir? Neden gerek duyulmuştur?&lt;/span&gt;&lt;br /&gt;Bağlı liste veri yapısı hafızanın farklı bölgelerinde bulunan verileri birbirine katar şeklinde bağlayan yapıdır.Dizi vb. yapılar zaten bu işi sağlamıyor mu? şeklinde bir soru aklınıza tam bu satırda gelmiş olmalı. Evet sağlıyor ama bir yere kadar. Diziler hafızanın belirli bir noktasında ardışıl olarak gelir. Yani dizinin ilk elemanı hafızanın 100 nolu adresinde bulunuyorsa dizinin ikinci elemanı 101 nolu gözde bulunacaktır. Ayrıca diziler ilk oluşturulduğunda uzunluğu belli olmak zorundadır. Daha sonra genişleme imkanı yoktur. Ancak tekrar boyutlandırma yapılabilir ki bu iş oldukça maliyetlidir. İşte böyle dinamik genişleyen ucuz maliyetli bir yapıya ihtiyaç duyulduğu sırada keşfedilmiş olmalı bağlı listeler.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;Bağlı derken?&lt;/span&gt;&lt;br /&gt;Bağlı listenin her bir elemanı hafızada birbirine bir sonraki elemanın aderesini gösterecek bilgiye sahiptir. Biz yalnızca ilk elemanın adresini biliriz. İkinci elemana ulaşmak için önce birinci elemana gideriz, ondan bir sonraki yani ikinici elemanın adresini alırız daha sonra ikinci elemana ulaşabiliriz. Üç, dört, beş ... hafıza dolana kadar üretilebilir, ulaşım mekanizması hep aynı. Bağlı derken bu mekanizma kastediliyor.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;İhtiyaca göre...&lt;/span&gt;&lt;br /&gt;Sorunlar farklı olunca çözümler, dolayısıyla gereksinimler de farklı oluyor. Bağlı liste veri yapısı iki çeşittir. Tek yönlü ve çift yönlü. İlkinde sadece ileri yönlü haraket yapmak mümkünken ikinci tipde geri gelme de mümkündür. Siz kendi probleminize en uygun tipi seçmelisiniz.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;Bırak gevezeliği de biraz kod yaz!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tek yönlü bağlı liste, C örneği&lt;br /&gt;&lt;pre class=&quot;brush: cpp;&quot;&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&lt;br /&gt;typedef struct _eleman&lt;br /&gt;{&lt;br /&gt; struct _eleman *sornakiEleman; // bir sonraki elemanı işaret eder.&lt;br /&gt; int veri; // yapının sakladığı veri. istenilen tipte istenildiği kadar veri eklenebilir.&lt;br /&gt;} eleman;&lt;br /&gt;&lt;br /&gt;typedef struct&lt;br /&gt;{&lt;br /&gt; eleman *ilkEleman; // bağlı listeyi temsil eden yapı. Yalnızca ilk elemanı işaret ediyor.&lt;br /&gt;} bagliListe;&lt;br /&gt;&lt;br /&gt;bagliListe *bagliListeUret();&lt;br /&gt;void elemanEkle(bagliListe*,int);&lt;br /&gt;void elemanCikart(bagliListe*,int);&lt;br /&gt;void listele(bagliListe*);&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt; bagliListe * bl = bagliListeUret(); // yeni bir bağlı liste ürettik.&lt;br /&gt; elemanEkle(bl,6); // eleman ekleyelim.&lt;br /&gt; elemanEkle(bl,34);&lt;br /&gt; elemanEkle(bl,987);&lt;br /&gt; elemanEkle(bl,5);&lt;br /&gt; elemanEkle(bl,2);&lt;br /&gt; listele(bl); // listele.&lt;br /&gt; system(&quot;pause&quot;);&lt;br /&gt; elemanCikart(bl,3); // 3. elemanı çıkart. ( ilk eleman 0&#39;dan başlar)&lt;br /&gt; listele(bl); // tekrar listele, farkı gör.&lt;br /&gt; system(&quot;pause&quot;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bagliListe *bagliListeUret()&lt;br /&gt;{&lt;br /&gt; bagliListe* bl = (bagliListe*)malloc(sizeof(bagliListe)); // yeni bir bağlı listeyi hafızada oluşturup ilgili adresi alıyoruz.&lt;br /&gt; bl-&amp;gt;ilkEleman = NULL;&lt;br /&gt; return bl;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void elemanEkle(bagliListe* bl,int veri)&lt;br /&gt;{&lt;br /&gt; eleman *e = (eleman*)malloc(sizeof(eleman)); // yeni bir eleman oluşturalım.&lt;br /&gt; e-&amp;gt;sornakiEleman = NULL;&lt;br /&gt; e-&amp;gt;veri = veri;&lt;br /&gt; eleman *son = NULL; // katarın son elemanı.&lt;br /&gt; son = (eleman *)bl-&amp;gt;ilkEleman; // başlangıç elemanını bağlı listeden alalım.&lt;br /&gt; if (son==NULL) // listemiz boş mu?&lt;br /&gt; {&lt;br /&gt;  bl-&amp;gt;ilkEleman = e;&lt;br /&gt;  return;&lt;br /&gt; }&lt;br /&gt; while(son!=NULL) // değilse özyinelemeli olarak son elemana erişmeye çalış.&lt;br /&gt; {&lt;br /&gt;  if (son-&amp;gt;sornakiEleman==NULL)&lt;br /&gt;   break;&lt;br /&gt;  son = (eleman*)son-&amp;gt;sornakiEleman; // düğümler arası atlama.&lt;br /&gt; }&lt;br /&gt; son-&amp;gt;sornakiEleman = e; // nihayet son düğümün işaretçisine kendi adresimizi yazıyoruz.&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void listele(bagliListe* bl)&lt;br /&gt;{&lt;br /&gt; eleman *e = NULL;&lt;br /&gt; e=(eleman *)bl-&amp;gt;ilkEleman;&lt;br /&gt; int i=0;&lt;br /&gt; while(e!=NULL) // özyinelemeli listeleme fonksiyonu.&lt;br /&gt; {&lt;br /&gt;  printf(&quot;%i. eleman verisi = %i\n&quot;,i++,e-&amp;gt;veri);&lt;br /&gt;  e = (eleman*) e-&amp;gt;sornakiEleman;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void elemanCikart(bagliListe * bl, int sira)&lt;br /&gt;{&lt;br /&gt; eleman *e = NULL;&lt;br /&gt; e=(eleman *)bl-&amp;gt;ilkEleman;&lt;br /&gt; eleman *onceki = NULL;&lt;br /&gt; int i=0;&lt;br /&gt; if (e==NULL) // listemiz boş mu?&lt;br /&gt; {&lt;br /&gt;  printf(&quot;Liste bos oldugu icin cikartma yapilamiyor!\n&quot;);&lt;br /&gt;  return;&lt;br /&gt; }&lt;br /&gt; while(e!=NULL)&lt;br /&gt; {&lt;br /&gt;  if (i==sira)&lt;br /&gt;   break;&lt;br /&gt;  i++;&lt;br /&gt;  onceki = e;&lt;br /&gt;  e = (eleman*) e-&amp;gt;sornakiEleman; &lt;br /&gt; }&lt;br /&gt; onceki-&amp;gt;sornakiEleman = e-&amp;gt;sornakiEleman; // silmek istediğimiz elemanın bir önceki düğümü ile bir sonraki düğümü birbirine bağlıyoruz. Böylelikle aradan çekilerek silinmiş izlenimi oluşturuluyor.&lt;br /&gt; free(e); // hafıza sızıntısını önlemek için serbert bıraktığımız elemanı hafızadan silmeyi unutmayalım.&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Diğer yüksek seviyeli dillerde (Java, C# vb.) bu veri yapısını yapmak çok daha kolay. Mantıktan yola çıkarak o dillerde de sorunsuz bir şekilde bağlı liste veri yapısını oluşturabileceğinize inanıyorum.&lt;br /&gt;Görüşmek üzere...</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/8478876267197104613/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/8478876267197104613' title='6 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/8478876267197104613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/8478876267197104613'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2010/05/bagl-listeler.html' title='Bağlı Listeler'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-7456984208392744993</id><published>2010-05-15T01:33:00.011+03:00</published><updated>2011-01-12T12:40:30.814+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="jquery"/><title type='text'>JQuery ve Sanat</title><content type='html'>Tekrar merhaba,&lt;br /&gt;Bu yazımda JQuery ile sanat nasıl yapılır konusuna ışık tutmaya çalışacağım. Sanat yapmak derken belki biraz abartmış olabilirim ama abartı çoğu insanın ilgilini çeken bir olgudur. Klasik, nedir - ne değildir zamazingosunu yapalım. Öncelikle resmi sitesini vererek kaynak belirtebiliriz - &lt;a href=&quot;http://jquery.com/&quot;&gt;http://jquery.com/&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic; color: #0279ff;&quot;&gt;not: indirirken size 2 seçenek sunmaktadır. Production / development şeklinde. Farkı, ilkinde gereksiz boşluk ve satır atlama karakterleri silinerek dosyanın boyutu küçültülmüş, bir nevi sıkıştırma yapılmış. Fakat kodun okunması neredeyse imkansız çünkü herşey birbirine geçmiş durumda. İkinci seçenekte ise kodlar okunaklı bir şekilde yayınlanıyor. Boyutu ilkine göre daha fazla ama bir geliştirici için çok değerli.&lt;/span&gt;&lt;br /&gt;JQuery kütüphane içerisindeki kopyalama hakkı yazısını değiştirmediğiniz sürece ticari uygulamalarda dahi kullanabilirsiniz. Tamamen ücretsiz. Lisans detayları için resmi sitesinden bilgi alabilirsiniz.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;Bu aralar çok duymaya başladım, nedir bu JQuery?&lt;/span&gt;&lt;br /&gt;Özetle javascript yazımını kolaylaştıran kütüphane. İçerisinde bir çok javascript fonksiyonu barındırıyor. En önemli özelliği tarayıcı bağımsız olması. Yani JQuery ile yazdığımız javascript komutları tüm tarayıcılarda aynı şekilde sorunsuz olarak çalışmaktadır. Web ortamında javascript geliştirenler tarayıcı uyumsuzluğu sorununu bilmektedir. JQuery ile bu ortadan kalkmaktadır. Pratikte JQuery bize yeni birşey değil. Normal javascript komutlarıyla yapacaklarımızdan ötesi yok. O bize hızlı, güvenilir ve tarayıcı bağımsız javascript geliştirme imkanı sunmaktadır.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;Hızlı bir giriş&lt;/span&gt;&lt;br /&gt;&lt;pre class=&quot;brush: javascript;&quot;&gt;&lt;br /&gt; $(document).ready(function(){&lt;br /&gt;   $(&quot;a&quot;).click(function(event){&lt;br /&gt;     alert(&quot;Tum linkler bu yaziyi gosterir!&quot;);&lt;br /&gt;   });&lt;br /&gt; });&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Sırayla inceleyelim. Öncelikle $ karakterinden başlamak istiyorum. Bu fark edebileceğiniz gibi bir fonksiyon aslında. Bildiğimiz javascript fonksiyonu. JQuery için temel ifade ediyor. Tüm çağrılarımızı bu fonksiyon üzerinden yapıyoruz. Reguler Expression tanımlamalarını çok iyi kullandıkları için bu fonksiyonun içerisine verebileceğimiz parametrelerin sayısı oldukça fazla. $(document) ile javascript&#39;in çalıştığı dosyayı seçiyoruz. Daha sonra gelen .ready(... ifadesiyle sayfamızın işlem için hazır olduğunu garantiliyoruz. &lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;function() { } neden gerekli?&lt;/span&gt;&lt;br /&gt;.ready olayında çalışmasını istediğimiz kodları direk parantez içerisinde yazsaydık kodumuz çalışmayacaktı. Çünkü JQuery çalışma mantığında bir iş yapmak için o işi yapacak fonksiyonun adını ilgili JQuery fonksiyonuna vermeliyiz. Aynı fonksiyon işaretçileri gibi ya da diğer bir benzetmeyle klasik setTimeout javascript komutunda olduğu gibi.&lt;br /&gt;Şimdi biraz toparlayalım:&lt;br /&gt;$(document)         &lt;span style=&quot;color: #03F900;&quot;&gt;// sayfamız&lt;/span&gt;&lt;br /&gt;.ready(            &lt;span style=&quot;color: #03F900;&quot;&gt;// hazır olunca çalıştır&lt;/span&gt;&lt;br /&gt;function() { ... } &lt;span style=&quot;color: #03F900;&quot;&gt;// yeni bir fonksiyon ürettik ve bağladık&lt;/span&gt;&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;İyi gidiyoruz, ya sonra?&lt;/span&gt;&lt;br /&gt;Yeni oluşturduğumuz fonksiyonun içeriğini inceleyelim. &lt;br /&gt;$(&quot;a&quot;)        &lt;span style=&quot;color: #03F900;&quot;&gt;// a taglı elemanları seç.&lt;/span&gt;&lt;br /&gt;.click(       &lt;span style=&quot;color: #03F900;&quot;&gt;// tıklayınca çalıştır.&lt;/span&gt;&lt;br /&gt;function() { ... } &lt;span style=&quot;color: #03F900;&quot;&gt;// yeni bir fonksiyon ürettik ve bağladık&lt;/span&gt;&lt;br /&gt;);&lt;br /&gt;Burada oluşturduğumuz fonksiyonun içerisine alert komutumuzu yerleştirdik.&lt;br /&gt;Kodumuzu çalıştırdığımızda sayfamızdaki tüm linkler tıklandığında bu mesajı alacaklar.&lt;br /&gt;Giriş olarak bu kadarla yetineceğim. Daha sonraki yazılarımda detaylı incelemeler ve yeni örnekler sunacağım.&lt;br /&gt;Görüşmek üzere...</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/7456984208392744993/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/7456984208392744993' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/7456984208392744993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/7456984208392744993'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2010/05/jquery-ve-sanat.html' title='JQuery ve Sanat'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-3556436582210531694</id><published>2010-05-15T00:10:00.021+03:00</published><updated>2010-05-20T15:44:00.940+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="controller"/><category scheme="http://www.blogger.com/atom/ns#" term="framework"/><category scheme="http://www.blogger.com/atom/ns#" term="IDE"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="java EE"/><category scheme="http://www.blogger.com/atom/ns#" term="model"/><category scheme="http://www.blogger.com/atom/ns#" term="mvc"/><category scheme="http://www.blogger.com/atom/ns#" term="netbeans"/><category scheme="http://www.blogger.com/atom/ns#" term="spring"/><category scheme="http://www.blogger.com/atom/ns#" term="view"/><category scheme="http://www.blogger.com/atom/ns#" term="web"/><title type='text'>Spring Framework - Web MVC / NetBeans 6.8</title><content type='html'>Herkese merhaba,&lt;br /&gt;Bu yazımda sizlerle Spring Framework ile mvc web uygulamalarına giriş yapacağız. Amacım framework altyapısını uzun uzun anlatmak, çıkış hikayesi vb. yazılarla aklınızı karıştırmak değil. Detaylı bilgi almak isteyenler &lt;a href=&quot;http://www.springsource.com/&quot;&gt;http://www.springsource.com/&lt;/a&gt; adresinden ya da arama motorlarını kullanarak bilgi alabilirler. Arama yaptığınızda siz de anlayacaksınız, tüm sitelerde bu konuya giriş yapılmış. Framework alt yapısı çalışma mantığı anlatılmış fakat elle tutulur bir proje yok. En büyük sorun çalışan uygulama eksikliği. Elimden geldiğince sizlere gerçek şartlarda çalışan uygulamalar göstermeye çalışacağım.&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;&lt;br /&gt;Hangi IDE?&lt;/span&gt;&lt;br /&gt;Ben bu örnekte Netbeans 6.8 üzerinden anlatacağım. Bu geliştirme ortamını seçmemin sebebi kolay olması. İçeresinde bir çok gerekli kütüphane hazır olarak geliyor. Olayı kavradıktan sonra Eclipse ile projelerimizi geliştirmeye devam edeceğiz. Buradaki tek amacımız Spring, IDE kaynaklı sorunlarla kafamızı yoramayız.&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;&lt;br /&gt;Ortamın Hazırlanması&lt;/span&gt;&lt;br /&gt;Netbeans 6.8 Web EE içeren bir paketini kurmanız yeterli. Ayrıca Java kodlarının derlenmesi için JDK gerekli konumuz Java olmadığı için bundan bahsetme gereği duymuyorum. &lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;File | New&lt;/span&gt;&lt;br /&gt;Netbeans geliştirme ortamını açtıktan sonra yeni bir Dynamic Web Application projesi oluşturuyoruz.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRAAd_UkiR6WFschf7YK19wSbXnxj8_jk6wcXjYck3PaVvYKxrdKBdQtX5b3g4VkKJHn5Hs-XFZC14WF7IV1_8qs5BwHBcZ_cVaF_bN62fbptHcQqrHS4XeFL1CHn4tZCWTviBhdnVaZU/s1600/s1.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 275px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRAAd_UkiR6WFschf7YK19wSbXnxj8_jk6wcXjYck3PaVvYKxrdKBdQtX5b3g4VkKJHn5Hs-XFZC14WF7IV1_8qs5BwHBcZ_cVaF_bN62fbptHcQqrHS4XeFL1CHn4tZCWTviBhdnVaZU/s400/s1.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5471239518997640402&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Daha sonra dikkat etmeniz gereken tek nokta projemize dahil edeceğimiz kütüphanelerdir. Burada Spring Web MVC 2.5 seçeneğini işaretliyoruz.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYYZhGI8EO2lH88FbPsAU2qWd3vl_kVbpNIDx3Om1OY6iWaKAWnA2EZkOyYhh3nl7SKQOLxcq-vBvcSoZEtR_K_VgFfbJZSywK2IXtOjKRTX9rxuUayc_6CSA8MoHq3Jo_qBVcUBU0uw8/s1600/s2.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 257px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYYZhGI8EO2lH88FbPsAU2qWd3vl_kVbpNIDx3Om1OY6iWaKAWnA2EZkOyYhh3nl7SKQOLxcq-vBvcSoZEtR_K_VgFfbJZSywK2IXtOjKRTX9rxuUayc_6CSA8MoHq3Jo_qBVcUBU0uw8/s400/s2.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5471239975516160066&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Finish diyerek projemizi oluşturuyoruz. Sonra karşınıza şu şekilde bir görüntü çıkmalı.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpDrxwmCqwMfrzqPThHFzbaW6xpP8S8TTsaO4n2H4BcK4D3Whti_do2k-Q-RqTB_zyV54QY9Mb10pRDAEwjSWvtXohomg6e-zX6upynOtTGhsfC6etoiJ4x1au0yxkhy8U5pjEmUlsRQ8/s1600/s3.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 239px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpDrxwmCqwMfrzqPThHFzbaW6xpP8S8TTsaO4n2H4BcK4D3Whti_do2k-Q-RqTB_zyV54QY9Mb10pRDAEwjSWvtXohomg6e-zX6upynOtTGhsfC6etoiJ4x1au0yxkhy8U5pjEmUlsRQ8/s400/s3.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5471241064136111026&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Şimdi projemizi Run menüsünden ya da F6 kısayol tuşu ile çalıştıralım. Karşınıza aşağıdaki gibi bir ekran çıktıysa merak etmeyin doğru yoldasınız :)&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9ufn4YTFNmm7x-bUlT2mVfIXWYF16Tp0aaY0HVWFKUdujbH6uOuTMoSFC7WYBYi3htceAX7P1quYJQbDKt84Qkc6TNKJ4Kb6hRGaDQQVU5HB0P3aQctTmLnK93UfM9ntdb-N6rKUjzS4/s1600/s4.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 264px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9ufn4YTFNmm7x-bUlT2mVfIXWYF16Tp0aaY0HVWFKUdujbH6uOuTMoSFC7WYBYi3htceAX7P1quYJQbDKt84Qkc6TNKJ4Kb6hRGaDQQVU5HB0P3aQctTmLnK93UfM9ntdb-N6rKUjzS4/s400/s4.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5471241867584967378&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;Dur bir dakika! Burada neler oluyor?&lt;/span&gt;&lt;br /&gt;Hemen izah edeyim. Az önce bir Spring Web MVC projesi oluşturduk. Netbeans bizim yerimize varsayılan bazı ayarlamaları ve iskelet yapıyı oluşturdu. Bu Netbeans&#39;in özelliği. Sol taraftaki klasör yapısına bakmamız yapıyı anlamada faydalı olacaktır. Web Pages klasörü altında WEB-INF, META-INF klasörleri ve redirect.jsp dosyası var. WEB-INF ve META-INF dışarıdan erişilemeyen (dışarıdan derken, projeyi siteye yüklediğimizde internetten sitemize giren kullanıcıları kastediyorum) özel ayar klasörleridir. Bu klasörlerden bahsetmeden önce ana dizinde bulunan tek dosya olan redirect.jsp ye bakalım. Bildiğimiz gibi Java Dynamic Web projelerinde bütün JSP dosyaları Web Pages altında olurdu ve biz buradaki dosyalara web tarayıcımız vasıtasıyla erişebiliyorduk. Fakat burada yalnız bir dosya var? Öyle ise hemen merakımızı redirect.jsp dosyasına bakarak giderelim. &lt;br /&gt;&lt;br /&gt;Buyurun efendim:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoBxECrzquuRZFcG74R7l8Lxg08enaVHVFIF9hoB05GE8_iQOB5D_ioPuaAhNNfNyS-J3C0FkGLNjKPgvwpT6AZKUoSvRtR2qL9jIOBRAv6DMZgHdMfPeGqzFULzbNLMKGqv6zRmfVfCM/s1600/s5.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 134px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoBxECrzquuRZFcG74R7l8Lxg08enaVHVFIF9hoB05GE8_iQOB5D_ioPuaAhNNfNyS-J3C0FkGLNjKPgvwpT6AZKUoSvRtR2qL9jIOBRAv6DMZgHdMfPeGqzFULzbNLMKGqv6zRmfVfCM/s400/s5.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5471246388086351890&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;Hiçbir şey anlamadım?&lt;/span&gt;&lt;br /&gt;Kesinlikle çok saçma! index.htm nerede? Olmayan bir dosyaya yönlendirme mi yapılıyor? Burada bir gariplik var sanki. Evet durum biraz garip ama biraz incelediğimizde ve detaylara dikkat ettiğimizde aslında ne kadar güzel bir yapı olduğunu daha iyi anlayacağız. Burada index.htm dosyasına yönlendirerek aslında index.htm dosyasını açmıyoruz, index adındaki görüntüyü çağırıyoruz.&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;Görüntü mü? Nasıl yani?&lt;/span&gt;&lt;br /&gt;MVC tasarım şablonunun (Model View Controller) ortasındaki View olayından bahsediyoruz. Bu tasarım desenini anlamak biraz sancılı olabilir ama anladıktan sonra hele bir de nimetlerinden faydalandıktan sonra ne kadar güzel bir şey olduğunu siz de anlayacaksınız. Görüntü dediğimiz kavram, önceden hazırlanmış tasarım dosyalarıdır. Herbiri bir controller nesnesine bağlıdır. Onun yetkisi olamadan ilgili görüntüye erişmek mümkün değildir.&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;İyice karıştı, Controller derken?&lt;/span&gt;&lt;br /&gt;Controller sınıflar görüntüleri kullanıcıdan gelen talepler doğrultusunda göstermek ve şekillendirmek adına geliştirilmiştir. Daha detaylı bilgiyi ilerleyen kısımlarda vereceğim. &lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;&lt;br /&gt;Tamam ama hâlâ olmayan bir index.htm dosyasını nasıl açtığımızı anlayamadım?&lt;/span&gt;&lt;br /&gt;Sır perdesi WEB-INF klasörünü açmamızla aralanacaktır. Bildiğimiz gibi WEB-INF klasörü özel bir ayar klasörü.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTGSMLimNoVbRZAW6srfJdfS9h-WXYU-vHrWqiPDCiVYwqzzcpibn__6qGQoW2vwNvZTP1o7yJMaDiWcV1h_9nPheMo3f45jZnXPWYwIBIprkSG-Mno1wWI_sH5xR25kUCvw3ACOuVy5g/s1600/s6.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 192px; height: 109px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTGSMLimNoVbRZAW6srfJdfS9h-WXYU-vHrWqiPDCiVYwqzzcpibn__6qGQoW2vwNvZTP1o7yJMaDiWcV1h_9nPheMo3f45jZnXPWYwIBIprkSG-Mno1wWI_sH5xR25kUCvw3ACOuVy5g/s400/s6.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5471249945934408434&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;xml uzuntılı dosyalar ayarlama için gerekli dosyalar. Sorumuzun cevabı ise jsp klasörü altında gizli. Evet haklısınız, index.jsp :D&lt;br /&gt;Görüntü dosyalarımızı bu klasör altına atmamızın sebebi dış dünyadan soyutlamak. Yalnızca controller nesnesi tarafından erişilmesini sağlamak için yapılmış bir sarmalama mekanizması. Zekice! &lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;Hmm.. Peki ya uzantı?&lt;/span&gt;&lt;br /&gt;Sizden de hiçbir şey kaçmıyor :) ama yine de dikkatsizsiniz. Projemizi ilk oluşturduğumuz zamana geri dönelim. Orada Spring Web MVC 2.5 kütüphanesini seçerken &lt;span style=&quot;font-style:italic; color: #0279ff;&quot;&gt;Dispatcher Mapping: *.htm&lt;/span&gt; şeklinde bir desen girmiştik. İşte bu *.htm şeklinde gelen istekleri .jsp uzantılı görüntülere aktarılmasını sağlıyor. Bu desen çok farklı şekilde olabilir bunları daha sonra inceleyeceğiz. Tüm bu ayarlar WEB-INF altındaki xml uzantılı dosyalarda tanımlanıyor. Bu konuya da daha sonra değineceğim.&lt;br /&gt;&lt;span style=&quot;font-weight:bold; color: #0279ff;&quot;&gt;Kafam karıştı, böylece bırakıp gidemezsin!&lt;/span&gt;&lt;br /&gt;Bu yazımı burada noktalayacağım. Amacım çalışan örneklerle bu konuya değinmekti. Tam olarak hedefime ulaştığım söylenemez, fakat parça parça anlatmak daha faydalı olacak gibi. Konu hakkında yazmaya kaldığım yerden devam edeceğim. &lt;br /&gt;Görüşmek üzere...</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/3556436582210531694/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/3556436582210531694' title='1 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/3556436582210531694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/3556436582210531694'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2010/05/spring-framework-web-mvc-netbeans-68.html' title='Spring Framework - Web MVC / NetBeans 6.8'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRAAd_UkiR6WFschf7YK19wSbXnxj8_jk6wcXjYck3PaVvYKxrdKBdQtX5b3g4VkKJHn5Hs-XFZC14WF7IV1_8qs5BwHBcZ_cVaF_bN62fbptHcQqrHS4XeFL1CHn4tZCWTviBhdnVaZU/s72-c/s1.PNG" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-3585639259606024785</id><published>2010-04-27T23:53:00.020+03:00</published><updated>2011-01-12T12:40:19.237+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="assembly"/><category scheme="http://www.blogger.com/atom/ns#" term="c"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="c++"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="Java Native Access"/><category scheme="http://www.blogger.com/atom/ns#" term="microsoft"/><category scheme="http://www.blogger.com/atom/ns#" term="windows"/><title type='text'>Dynamic-Link Library (DLL) / Giriş</title><content type='html'>DLL dosyaları Microsoft&#39;un Windows ve OS/2 işletim sistemleri için gerçeklediği kütüphane paylaşım konsepti olarak tanımlanabilir. Bu kütüphaneler genellikle DLL, OCX ya da DRV uzuntasındadır.&lt;br /&gt;&lt;br /&gt;DLL dosyaları aynen EXE dosyaları gibi kod, veri ve kaynak bölümlerine (ve bunların herhangi bir kombinasyonunda) olabilir.&lt;br /&gt;&lt;br /&gt;Windows işletim sisteminin ilk sürümlerinde tüm programlar tek bir bellek bölgesinde koşturuluyordu. İşletim sistemi düzeyindeki tüm işlemler MS-DOS tarafından gerçekleştirilirken yüksek seviyeli hizmetler Windows DLL leri tarafından sağlanıyordu. Çizim API&#39;leri yani GDI.EXE, kullanıcı arayüzü işlemleri USER32.EXE adlı kütüphane dosyasında gerçeklenmiştir.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Günümüzde daha farklı bir yaklaşım kullanılmaktadır. Sistem tarafından sunulan kütüphaneler uygulamalara ayrı ayrı yüklenmektedir. Korumalı modda olduğu için bir program başka bir programın hafıza alanına doğrudan bir müdehalede bulunamıyor.&lt;br /&gt;&lt;br /&gt;Assembly dilinde basit bir mesaj gösteren DLL uygulaması şu şekilde olabilir:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: c-sharp;&quot;&gt;&lt;br /&gt;.386 ; intel x86 architecture&lt;br /&gt;.model flat,stdcall ; use flat memory management&lt;br /&gt;option casemap:none ; ignore letter case&lt;br /&gt;&lt;br /&gt;include \masm32\include\windows.inc &lt;br /&gt;include \masm32\include\user32.inc ; for MessageBox func.&lt;br /&gt;include \masm32\include\kernel32.inc&lt;br /&gt;&lt;br /&gt;includelib \masm32\lib\user32.lib&lt;br /&gt;includelib \masm32\lib\kernel32.lib&lt;br /&gt;&lt;br /&gt;.data&lt;br /&gt;message db &quot;Test message...&quot;,0 ; content of our simple message&lt;br /&gt;&lt;br /&gt;.code&lt;br /&gt;DllEntry proc hInstance:HINSTANCE, reason:WORD, reserved1:WORD ; DLL entry point function&lt;br /&gt;mov eax,TRUE&lt;br /&gt;ret&lt;br /&gt;DllEntry Endp&lt;br /&gt;&lt;br /&gt;SimpleMessage proc&lt;br /&gt;invoke MessageBox,NULL,addr message,NULL,MB_OK ; win32 MessageBox func.&lt;br /&gt;ret&lt;br /&gt;SimpleMessage Endp&lt;br /&gt;&lt;br /&gt;End DllEntry&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bu programı derlemek için birde def dosyası oluşturmalıyız. Bu dosyada 2 satır bilgi gerekiyor. Birinci satırda kütüphanenin ismini ikinci satırda ise kütüphaneden dışarı aktarılacak yani diğer programların hizmetine sunuculacak olan fonksiyonların isimleri.&lt;br /&gt;&lt;br /&gt;örnek olarak&lt;br /&gt;&lt;pre class=&quot;brush: c-sharp;&quot;&gt;&lt;br /&gt;LIBRARY Simple&lt;br /&gt;EXPORTS SimpleMessage&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Projemizi derlemek için komut satırına bazı komutlar girmemiz gerekecek. Bu işlemin otomasyonu için şöyle bir batch dosya oluşturabiliriz.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: c-sharp;&quot;&gt;&lt;br /&gt;c:\masm32\bin\ml.exe /c /coff /Cp &quot;%CD%\Simple.asm&quot;&lt;br /&gt;c:\masm32\bin\link.exe /DLL /DEF:&quot;%CD%\Simple.def&quot; /SUBSYSTEM:WINDOWS /LIBPATH:c:\masm32\lib &quot;%CD%\Simple.obj&quot;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Not:&lt;/span&gt; Bu uygulamayı derleyebilmeniz için sisteminizde Masm32 derleyicisi yüklü durumda olmalıdır.&lt;/span&gt; &lt;a href=&quot;http://www.masm32.com/&quot;&gt;http://www.masm32.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Şimdi oluşturduğumuz bu DLL dosyasını başka bir programdan çağıralım. Bunun için çağırı yapacak programımızı derlerken DLL dosyamızın yapısını bildirmek üzere bir .lib dosyası vereceğiz. Bu dosya DLL projemizi derlerken derleyici tarafından otomatik olarak oluşturulmaktadır.&lt;br /&gt;&lt;br /&gt;Kısa basit bir örnek:&lt;br /&gt;&lt;pre class=&quot;brush: c-sharp;&quot;&gt;&lt;br /&gt;.386&lt;br /&gt;.model flat,stdcall&lt;br /&gt;option casemap:none&lt;br /&gt;include \masm32\include\windows.inc&lt;br /&gt;include \masm32\include\kernel32.inc&lt;br /&gt;includelib Simple.lib ; lib file of Simple.dll to inform linker &lt;br /&gt;includelib \masm32\lib\kernel32.lib&lt;br /&gt;&lt;br /&gt;SimpleMessage PROTO ; name of the function in DLL&lt;br /&gt;&lt;br /&gt;.code&lt;br /&gt;start:&lt;br /&gt;        invoke SimpleMessage ; invoke the function in DLL&lt;br /&gt;        invoke ExitProcess,NULL ; terminate process&lt;br /&gt;end start&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Şimdi benzer bir çağırı programını C++ dilinde dinamik çağırma yöntemiyle yapalım.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: cpp&quot;&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;&lt;br /&gt;typedef void (WINAPI *SimpleMessage)(); // type defination to call dll function.&lt;br /&gt;&lt;br /&gt;int main(int argc, char **argv)&lt;br /&gt;{&lt;br /&gt; HINSTANCE hDLL = LoadLibrary(L&quot;simple.dll&quot;); // loads our DLL into application memory section.&lt;br /&gt; SimpleMessage sm = (SimpleMessage)GetProcAddress(hDLL,&quot;SimpleMessage&quot;); // gets address of our function in the dll.&lt;br /&gt; if (!sm) // function address validation.&lt;br /&gt; {&lt;br /&gt;  printf(&quot;Couldn&#39;t load library!\n&quot;);&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  sm(); // simple call.&lt;br /&gt; }&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C# tarafında işler çok daha kolay:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: c-sharp;&quot;&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Runtime.InteropServices;&lt;br /&gt;&lt;br /&gt;namespace SimpleCall&lt;br /&gt;{&lt;br /&gt;    class Program&lt;br /&gt;    {&lt;br /&gt;        [DllImport(&quot;simple.dll&quot;)]&lt;br /&gt;        static extern void SimpleMessage();&lt;br /&gt;&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            SimpleMessage();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Java tarafında direk bir erişim şekli mevcut değil. Bunun yerine bazı 3. parti kütüphaneleri kullabiliriz. Bunlar JNI (Java Native Interface) tabanlı kütüphaneler. Biz bu örnekte JNA (Java Native Access) kullanacağız.&lt;br /&gt;&lt;br /&gt;Bu kütüphanenin açıklamasını daha önceki bir yazımda (Bkz: &lt;a href=&quot;http://rbellek.blogspot.com/2010/04/java-native-access-basit-ornek.html&quot;&gt;http://rbellek.blogspot.com/2010/04/java-native-access-basit-ornek.html&lt;/a&gt;) bahsettiğim için burada yüzeysel geçiyorum.&lt;br /&gt;&lt;br /&gt;Örnek uygulama:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: java;&quot;&gt;&lt;br /&gt;//Main.java&lt;br /&gt;package simple;&lt;br /&gt;&lt;br /&gt;import com.sun.jna.Native;&lt;br /&gt;&lt;br /&gt;public class Main {&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args)&lt;br /&gt;    {&lt;br /&gt;        Simple simpleDLL = (Simple)Native.loadLibrary(&quot;e:\\Simple.dll&quot;, Simple.class);&lt;br /&gt;        simpleDLL.SimpleMessage();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: java;&quot;&gt;&lt;br /&gt;//Simple.java&lt;br /&gt;package simple;&lt;br /&gt;&lt;br /&gt;import com.sun.jna.Library;&lt;br /&gt;&lt;br /&gt;public interface Simple extends Library {&lt;br /&gt;    void SimpleMessage();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;DLL dosyasının aynı EXE dosyaları gibi bir giriş noktları mevcuttur. Bu noktanın adı DllEntry adlı bir fonksiyondur. Ve giriş parametreleri olarak şu 4 değerden birini almaktadır.&lt;br /&gt;&lt;br /&gt;DLL_PROCESS_ATTACH&lt;br /&gt;DLL_PROCESS_DETACH&lt;br /&gt;DLL_THREAD_ATTACH&lt;br /&gt;DLL_THREAD_DETACH&lt;br /&gt;&lt;br /&gt;Basit bir toplama kütüphanesi:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: cpp;&quot;&gt;&lt;br /&gt;.386&lt;br /&gt;.model flat,stdcall&lt;br /&gt;option casemap:none&lt;br /&gt;include \masm32\include\windows.inc&lt;br /&gt;include \masm32\include\user32.inc&lt;br /&gt;include \masm32\include\kernel32.inc&lt;br /&gt;includelib \masm32\lib\user32.lib&lt;br /&gt;includelib \masm32\lib\kernel32.lib&lt;br /&gt;&lt;br /&gt;.data&lt;br /&gt;AppName db &quot;Simple 2&quot;,0&lt;br /&gt;HelloMsg db &quot;Hello, you&#39;re calling a function in this DLL&quot;,0&lt;br /&gt;LoadMsg db &quot;The DLL is loaded&quot;,0&lt;br /&gt;UnloadMsg db &quot;The DLL is unloaded&quot;,0&lt;br /&gt;ThreadCreated db &quot;A thread is created in this process&quot;,0&lt;br /&gt;ThreadDestroyed db &quot;A thread is destroyed in this process&quot;,0&lt;br /&gt;&lt;br /&gt;.code&lt;br /&gt;DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD&lt;br /&gt; .if reason==DLL_PROCESS_ATTACH&lt;br /&gt;  invoke MessageBox,NULL,addr LoadMsg,addr AppName,MB_OK&lt;br /&gt; .elseif reason==DLL_PROCESS_DETACH&lt;br /&gt;  invoke MessageBox,NULL,addr UnloadMsg,addr AppName,MB_OK&lt;br /&gt; .elseif reason==DLL_THREAD_ATTACH&lt;br /&gt;  invoke MessageBox,NULL,addr ThreadCreated,addr AppName,MB_OK&lt;br /&gt; .else        ; DLL_THREAD_DETACH&lt;br /&gt;  invoke MessageBox,NULL,addr ThreadDestroyed,addr AppName,MB_OK&lt;br /&gt; .endif&lt;br /&gt; mov  eax,TRUE&lt;br /&gt; ret&lt;br /&gt;DllEntry Endp&lt;br /&gt;&lt;br /&gt;Addition proc param1:DWORD, param2:DWORD&lt;br /&gt; mov ebx,param1&lt;br /&gt; mov eax,param2&lt;br /&gt; add eax,ebx&lt;br /&gt; ret &lt;br /&gt;Addition endp&lt;br /&gt;End DllEntry&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bu toplama fonksiyonunu (parametreli) çağıran C++ uygulaması:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: cpp&quot;;&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;&lt;br /&gt;typedef int (WINAPI* Addition)(int,int); // two DWORD (32-bit integer) in parameters&lt;br /&gt;           // WINAPI same as __stdcall&lt;br /&gt;              // __stdcall gives order of parameters in stack&lt;br /&gt;int main(int argc, char **argv)&lt;br /&gt;{&lt;br /&gt; HINSTANCE hDLL = LoadLibrary(L&quot;calculator.dll&quot;);&lt;br /&gt; Addition addition = (Addition)GetProcAddress(hDLL,&quot;Addition&quot;);&lt;br /&gt; if (!addition)&lt;br /&gt; {&lt;br /&gt;  printf(&quot;Couldn&#39;t load library!&quot;);&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  printf(&quot;5 + 9 = %i&quot;,addition(5,9)); // simple two parameter call&lt;br /&gt; }&lt;br /&gt; return EXIT_SUCCESS;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Şimdilik basit bir girişle yetiniyorum. Umarım devamında detaylandırabilirim...</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/3585639259606024785/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/3585639259606024785' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/3585639259606024785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/3585639259606024785'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2010/04/dynamic-link-library-dll-giris.html' title='Dynamic-Link Library (DLL) / Giriş'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-4312174478615328987</id><published>2010-04-04T16:04:00.014+03:00</published><updated>2011-01-12T12:41:49.726+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="c++"/><category scheme="http://www.blogger.com/atom/ns#" term="delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="JNA"/><category scheme="http://www.blogger.com/atom/ns#" term="JNI"/><title type='text'>Java Native Access Basit Örnek</title><content type='html'>Java ile program geliştirmek çok rahat ve güvenilir olabilir. Fakat diğer tüm yorumlamaya dayalı diller gibi(C# vs.) Java&#39;da doğrudan makine diline çevrilen programlama dilleri kadar hızlı değildir. Hız söz konusu değilse tabiki hiç bir sorun yok. Fakat bizim için hız önemli olduğunda ne yapacağız?&lt;br /&gt;a)Java vb. dilleri bırak, C/C++ ya da Delphi gibi dilleri kullan.&lt;br /&gt;b)Kullandığın dillerden vazgeçme gerekli bölgeyi soyutla.&lt;br /&gt;&lt;br /&gt;Ben b şıkkını seçiyorum :) Peki b şıkkında anlatamak istediğim nedir? &lt;br /&gt;&lt;br /&gt;Örneğin bir program geliştreceğiz. Bu programda çok ağır matematiksek işlemler var. Bunları Java ile yaptığımız zaman istediğimiz sürede istediğimiz verimlilikte sonuçlar alamıyoruz. Öyle ise bize sıkıntı çıkartan kısmı alıp, C/C++, Delphi ya da bir başka donanıma yakın olan bir dil ile yazıyoruz. Bu yazdığımız bölümü DLL olarak oluşturuyoruz. Artık tek yapmamız gereken Java projemizden bu DLL içerisindeki gerekli fonksiyonları zamanı geldiğinde çağırmak.&lt;br /&gt;&lt;br /&gt;Bunu yapmamız için Sun Microsystems tarafından yazılmış bir kütüphane mevcut. JNA (Java Native Access). Bu kütüphane ile sabit disk üzerideki (başka bir dil ile yazılmış) DLL dosyalarındaki fonksiyınları çağırabiliyoruz.&lt;br /&gt;&lt;br /&gt;Şimdi yamamız gereken temel adımlardan bahsedeyim.&lt;br /&gt;&lt;br /&gt;1) Bir java projesi oluşturalım. &lt;br /&gt;2) &lt;a href=&quot;https://jna.dev.java.net/&quot;&gt;https://jna.dev.java.net/&lt;/a&gt; adresinden JAR dosyasını sabit diskimize indirelim.&lt;br /&gt;3) İndirdiğimiz kütüphaneyi projemize ekleyelim.&lt;br /&gt;(NetBeans 6.8 için ekleme)&lt;br /&gt;Libraries (sağ tık) -&gt; Add JAR/Folder...&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnme8mCTyGvahpuaqPrtM828duSuxL7okQWvWpWNetm2dgYZiD8muEegR0xE3oC4Aki93MvUYMFyUZ4u1OTcAgDGSEH5NYK95LdaRYI136ALLrvN-Kcdky5frxD7KHPGxtiVLr17D2d_A/s1600/jna1.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 238px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnme8mCTyGvahpuaqPrtM828duSuxL7okQWvWpWNetm2dgYZiD8muEegR0xE3oC4Aki93MvUYMFyUZ4u1OTcAgDGSEH5NYK95LdaRYI136ALLrvN-Kcdky5frxD7KHPGxtiVLr17D2d_A/s400/jna1.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5456272518727266130&quot; /&gt;&lt;/a&gt;&lt;br /&gt;4) Projemizde bir interface oluşturarak kullanacağımız fonksiyonların tanımlamasını yapmalım.&lt;br /&gt;5) İhtiyacımız olan fonksiyonu çağıralım. :)&lt;br /&gt;&lt;br /&gt;Örnek bir kod parçası:&lt;br /&gt;&lt;pre class=&quot;brush: java;&quot;&gt;&lt;br /&gt;import com.sun.jna.*;&lt;br /&gt;&lt;br /&gt;public class testMessage {&lt;br /&gt;&lt;br /&gt;    public interface Simple extends Library&lt;br /&gt;    {&lt;br /&gt;        public void TestMessage();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args)&lt;br /&gt;    {&lt;br /&gt;        Simple dll = (Simple)Native.loadLibrary(&quot;Simple.dll&quot;, Simple.class);&lt;br /&gt;        dll.TestMessage();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Bu kadar basit. JNA ile yalnızca Windows değil MacOS X, Linux ve Unix platformlarında da çalışabilirsiniz. Yanlız hata kontrolünü çok iyi tutmak gerekiyor. Lakin benim bir kaç denememde JVM (java.exe) çökmesi gibi durumlarla karşılaştım. Çünkü direk düşük seviye işlemleri yapılıyor. Java için son olarak birde JNI (Java Native Interface) var. Kendi yazdığımız C programlarına direk erişim için. Onu kısmet olursa başka bir zaman anlatmayı düşünüyorum.&lt;br /&gt;&lt;br /&gt;C# tarafında da aynı olayın mümkün olduğunu söyleyebilirim. Orada işler biraz daha basit. Herhangi bir kütüphane kullanmanıza gerek yok. Yapı şu şekilde:&lt;br /&gt;&lt;pre class=&quot;brush: c-sharp;&quot;&gt;&lt;br /&gt;[DllImport(&quot;Simple.dll&quot;)]&lt;br /&gt;static extern int TestMessage();&lt;br /&gt;&lt;br /&gt;static void Main(string[] args)&lt;br /&gt;{&lt;br /&gt;     TestMessage();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Sonuç olarak Java, C# vb. dillerin görsellik, güvenilirlik ve diğer mükemmel özelliklerini alıp, hantallık gibi diğer kötü özelliklerini bu sistemle değiştirmiş oluyoruz. Her sistemin güzel özelliğini bir araya getirerek çok kaliteli ürünler ortaya çıkarmak mümkün.</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/4312174478615328987/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/4312174478615328987' title='7 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/4312174478615328987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/4312174478615328987'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2010/04/java-native-access-basit-ornek.html' title='Java Native Access Basit Örnek'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnme8mCTyGvahpuaqPrtM828duSuxL7okQWvWpWNetm2dgYZiD8muEegR0xE3oC4Aki93MvUYMFyUZ4u1OTcAgDGSEH5NYK95LdaRYI136ALLrvN-Kcdky5frxD7KHPGxtiVLr17D2d_A/s72-c/jna1.PNG" height="72" width="72"/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5899416337306467227.post-300352713282481933</id><published>2010-04-04T04:37:00.015+03:00</published><updated>2011-01-12T12:37:32.187+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="encryption"/><category scheme="http://www.blogger.com/atom/ns#" term="güvenlik"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="security"/><title type='text'>Cesar Algoritması Spam Postalara Karşı</title><content type='html'>Herkese merhaba,&lt;br /&gt;&lt;br /&gt;Sanırım herkesin ortak derdidir önemsiz (spam) postalar. En büyük sıkıntı e-posta aderesimizi bir kere kötü insalara kaptırdığımızda artık geri dönüşü olmayan bir gereksiz e-posta yağmuruna tutuluyoruz. Birçok yöntem olmasına karşın ben burada sizlere bir web geliştirici olarak sitemizde yayınlayacağımız e-posta adreslerini spam mail atanlardan nasıl koruyacağımızı basit bir yöntemle anlatmaya çalışacağım.&lt;br /&gt;&lt;br /&gt;Sitemizde yayınladığımız e-posta adresleri özel geliştirilmiş programlar tarafından taranıp toplanıyor. Daha sonra spam listesine yeni bir kurban olarak ekleniyor. Peki bunun önüne nasıl geçilebilir? İlk akla gelen mail adresimizi bir resim olarak yerleştirmek ya da bozuk bir formatta email (at) domain.com gibi kullanmaktır. Böyle yapmak bir çözüm olabilir. Ama biz direk sayfamızda mail adresinimiz görünsün ya da mailto: şeklide link vermek istiyorsak ne yapmalıyız?&lt;br /&gt;&lt;br /&gt;Bilgi Günveliği Seminerinde Huzeyfe Önal&#39;ın bahsettiği bir yöntem vardı. Sayfa üzerinde normal mail adresleri dışında bir de spam@domain.com gibi bir adres daha veriyormuş. Böylelikle normal adreslerin yanında bu adresi de listeye ekleyen spam mesaj gönderici programlar bu adresede reklam içerikli mail atıyorlar. Yalnız şöyle bir sistem geliştirmiş kendileri; o mail hesabına mail atan tüm mail adresleri kara listeye alınıyormuş. Böylelikle diğer adresler en fazla 1 tane spam alıyorlar. Zekice ve etkili bir yöntem olabilir. Ama ben hem maliyetli buluyorum hem de her ne koşulda olursa olsun mail adresimin spam uygulamaları tarafından yakalanmasını istemiyorum.&lt;br /&gt;&lt;br /&gt;Peki ne yapabiliriz? Spam robotları sayfalar üzerinde düz yazıları okurlar. Resim, ses, video ya da çalıştıralabilir kodları (javascript, vb.) okuyamazlar ( en azından şimdilik:) ). Bu noktadan hareket edersek biz e-mail aderesinimizi basit bir Cesar algoritmasıyla şifreleyip istemc tarafında javascript ile çözümlersek hem robotları atlatmış oluruz hem de kullanıcıya korkmadan mail adresimizi sunmuş oluruz. &lt;br /&gt;&lt;br /&gt;Ben bir örneği PHP dilinde vereceğim. Siz istediğiniz dil ile istediğiniz platformda gerçekleyebilirsiniz.&lt;br /&gt;&lt;pre class=&quot;brush: php;&quot;&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;$xor_key = 19;&lt;br /&gt;$email = &#39;&amp;lt;a href=&quot;mailto:epostam@websitem.com&quot;&amp;gt;epostam@websitem.com&amp;lt;/a&amp;gt;&#39;; &lt;br /&gt;  $sonuc =&quot;&quot;;&lt;br /&gt;  for($i=0; $i&amp;lt;strlen($email); $i++)&lt;br /&gt;  {&lt;br /&gt;   $sonuc.= chr(ord($email[$i]) ^ $xor_key);&lt;br /&gt;  }&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class=&quot;brush: js;&quot;&gt;&lt;br /&gt;&amp;lt;script language=&quot;javascript&quot;&amp;gt;&lt;br /&gt;function decrypt()&lt;br /&gt;{&lt;br /&gt; var obje = document.getElementById(&#39;e_pos_ta&#39;);&lt;br /&gt; var text = &quot;&amp;lt;?php echo str_replace(&#39;&quot;&#39;,&#39;\&quot;&#39;, $sonuc); ?&amp;gt;&quot;;&lt;br /&gt; var code=&quot;&quot;;&lt;br /&gt; for(var i=0; i&amp;lt;text.length; i++)&lt;br /&gt; {&lt;br /&gt;  code+=String.fromCharCode(text.charCodeAt(i) ^ &amp;lt;?php echo $xor_key; ?&amp;gt;);&lt;br /&gt; }&lt;br /&gt; obje.innerHTML = code;&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: html;&quot;&gt;&lt;br /&gt;&amp;lt;body onload=&quot;decrypt()&quot;&amp;gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&amp;lt;span id=&quot;e_pos_ta&quot;&amp;gt;&amp;lt;?php echo htmlspecialchars($sonuc); ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ben algoritmayı biraz değiştirdim. Cesar kusura bakmasın :) Harfleri kaydırmak yerine basit XOR işlemi uyguladım. İsterseniz algoritmayı karıştırıp işi daha da zorlaştırabilirsiniz. Spam robotları artık sitenizdeki eposta adreslerini göremeyecekler.</content><link rel='replies' type='application/atom+xml' href='http://rbellek.blogspot.com/feeds/300352713282481933/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5899416337306467227/300352713282481933' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/300352713282481933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5899416337306467227/posts/default/300352713282481933'/><link rel='alternate' type='text/html' href='http://rbellek.blogspot.com/2010/04/cesar-algoritmas-spam-postalara-kars.html' title='Cesar Algoritması Spam Postalara Karşı'/><author><name>Ramazan Bellek</name><uri>http://www.blogger.com/profile/06356402601705075645</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw2Lo9tI5QClrMZgEje7VODAEaLyIFBJOryqHwohiSuWtB6lGkUjFHX1JACTjI0b2RFnAvDWb4SBkm3nNm387fCUiOGTjxZUf0Vs795kpBVKnA9QgN1EpKruFOz1Ced9g/s1600-r/25729_385536179794_640524794_3786186_6572870_n.jpg'/></author><thr:total>0</thr:total></entry></feed>