Aklımda Kalası Kelimeler

* давайте работать вместе
* Zarf ve Mazruf, Zerafet(xHoyratlık) ile aynı kökten(za-ra-fe) gelir
* Bedesten
* Suç subuta ermiştir - Suç sabit olmuştur

26 Kasım 2009 Perşembe

Bu da benim 8 vezir problem çözümüm


Kaynak Kodu

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace waQueen
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private delegate void DelAddQueen(int x, int y);

private DelAddQueen delAddQueen;

private Board board;
private void btnBasla_Click(object sender, EventArgs e)
{
try
{
board = new Board();

#region 1. QUEEN
Queen queen = new Queen(1, 1);

board.f_AddToBoard(queen);
#endregion

btnBasla.Enabled = false;
btnBitir.Enabled = true;

delAddQueen = new DelAddQueen(board.f_AddQueen);
delAddQueen.BeginInvoke(1, 2, null, null);
}
catch (Exception ex)
{
txtMemo.Text = "HATA:" + Environment.NewLine + ex.Message;
}
//board.f_AddQueen(1, 2);
}

private void btnBitir_Click(object sender, EventArgs e)
{
board.M_bBitir = true;
btnBitir.Enabled = false;
btnBasla.Enabled = true;
}

}



class Queen
{
public int X;
public int Y;
public List TehditHucreleri = new List();

public Queen(int _x, int _y)
{
X = _x;
Y = _y;
f_TehditHucreleriniOlustur();
}

public void f_TehditHucreleriniOlustur()
{
// Satırda tehditler...
for (int y = 1; y <= 8; y++)
{
if (!TehditHucreleri.Contains(new Point(this.X, y)))
TehditHucreleri.Add(new Point(this.X, y));
}

// Sutunda tehditler...
for (int x = 1; x <= 8; x++)
{
if (!TehditHucreleri.Contains(new Point(x, this.Y)))
TehditHucreleri.Add(new Point(x, this.Y));
}

// capraz tehditler
for (int x = this.X, y = this.Y; (this.Y > 1 || this.X > 1) && (x > 0 && y > 0); x--, y--)
{
if (!TehditHucreleri.Contains(new Point(x, y)))
TehditHucreleri.Add(new Point(x, y));
}
for (int x = this.X, y = this.Y; x <= 8 && y <= 8; x++, y++)
{
if (!TehditHucreleri.Contains(new Point(x, y)))
TehditHucreleri.Add(new Point(x, y));
}
for (int x = this.X, y = this.Y; (this.Y > 1 || this.X > 1) && (x < 9 && y > 0); x++, y--)
{
if (!TehditHucreleri.Contains(new Point(x, y)))
TehditHucreleri.Add(new Point(x, y));
}
for (int x = this.X, y = this.Y; (this.Y > 1 || this.X > 1) && (x > 0 && y < 9); x--, y++)
{
if (!TehditHucreleri.Contains(new Point(x, y)))
TehditHucreleri.Add(new Point(x, y));
}
}

}

class Board
{
private int m_iHiz = 0;
public bool M_bBitir;

public Board()
{
Form frm = Form1.ActiveForm as Form1;
try
{
m_iHiz = Convert.ToInt32(((TextBox)frm.Controls.Find("txtHiz", true)[0]).Text);
Thread.Sleep(m_iHiz);
}
catch (Exception ex)
{
((TextBox)frm.Controls.Find("txtMemo", true)[0]).Text += "HATA: " + Environment.NewLine + ex.Message;
}
}
string SBoard = "";
void fYazdir()
{
SBoard = "Bulunan çözüm sayısı: " + iBulunanCozumSayisi + Environment.NewLine;
for (int i = 1; i < 9; i++)
{
for (int j = 1; j < 9; j++)
{
Point p = new Point(i, j);
if (StckQueen.ToArray().Where(k => k.X.Equals(i) && k.Y.Equals(j)).FirstOrDefault() != null)
{
SBoard += " Q ";
continue;
}
if (StckQueen.ToArray().Where(k => k.TehditHucreleri.Contains(p)).FirstOrDefault() != null)
{
SBoard += " 1 ";
continue;
}
SBoard += " 0 ";
}
SBoard += Environment.NewLine;
}
SBoard += Environment.NewLine;
}

public Stack StckQueen = new Stack();

public bool f_Guvenlimi(int _yeniX, int _yeniY)
{
foreach (Queen queen in StckQueen)
{
if (queen.TehditHucreleri.Contains(new Point(_yeniX, _yeniY)))
return false;
}
return true;
}


public void f_RemoveQueen()
{
StckQueen.Pop();
}

public void f_AddQueen(int _i, int _j)
{
// Eğer bitirmemiz istenirse ilerleme...
if (M_bBitir)
{
return;
}

for (int x = _i; x < 9; x++)
{
if (f_Guvenlimi(x, _j))
{
f_AddToBoard(new Queen(x, _j));
//fYazdir();
f_QueenleriGoster();
if (StckQueen.Count == 8)
{
return;
}
else
{
Queen sonQueen = StckQueen.Peek();
f_AddQueen(1, sonQueen.Y + 1);
}
}
else
{
if (x == 8)
{
Queen sonQueen = StckQueen.Peek();
if (sonQueen.X == 8)
{
StckQueen.Pop();
sonQueen = StckQueen.Peek();
}
int i = sonQueen.X + 1;
int j = sonQueen.Y;
StckQueen.Pop();
//fYazdir();
f_QueenleriGoster();

f_AddQueen(i, j);
}
}
}
}

public void f_AddToBoard(Queen _queen)
{
StckQueen.Push(_queen);
}

private int iBulunanCozumSayisi = 0;
public void f_QueenleriGoster()
{
Form frm = Form1.ActiveForm as Form1;
Panel pnl = ((Panel)frm.Controls.Find("panel1", true)[0]);
//frm.Controls.Find()
int iSira = 0;

if (frm.InvokeRequired)
{
frm.Invoke(new MethodInvoker(delegate
{
((PictureBox)pnl.Controls.Find("q1", true)[0]).Location = new Point(-40, -40);
((PictureBox)pnl.Controls.Find("q2", true)[0]).Location = new Point(-40, -40);
((PictureBox)pnl.Controls.Find("q3", true)[0]).Location = new Point(-40, -40);
((PictureBox)pnl.Controls.Find("q4", true)[0]).Location = new Point(-40, -40);
((PictureBox)pnl.Controls.Find("q5", true)[0]).Location = new Point(-40, -40);
((PictureBox)pnl.Controls.Find("q6", true)[0]).Location = new Point(-40, -40);
((PictureBox)pnl.Controls.Find("q7", true)[0]).Location = new Point(-40, -40);
((PictureBox)pnl.Controls.Find("q8", true)[0]).Location = new Point(-40, -40);

}
));
}

foreach (Queen queen in StckQueen)
{
iSira++;

if (frm.InvokeRequired)
{
frm.Invoke(new MethodInvoker(delegate
{
PictureBox q = (PictureBox)pnl.Controls.Find("q" + iSira, true)[0];
q.Location = new Point(((queen.X - 1) * 40) + 16, ((queen.Y - 1) * 40) + 16);
}));
}
}
if (StckQueen.Count == 8)
{
Thread.Sleep(2000);
if (frm.InvokeRequired)
{
frm.Invoke(new MethodInvoker(delegate
{
if (StckQueen.Count == 8)
{
iBulunanCozumSayisi++;
fYazdir();
((TextBox)frm.Controls.Find("txtMemo", true)[0]).Text += SBoard;
}
}));
}
}
else
{
Thread.Sleep(m_iHiz);
}
}
}
}

Form harici bir sınıftan formun kontrollerine erişmek


using System;
using System.Threading;
using System.Windows.Forms;
/**
* Invoke metodu ne iş yapar?
* Invoke işlemi bir thread içinde işlem yaparken başka threaddeki bir control üzerinde işlem yapmamızı sağlar.
* Invoke metodunu kullanmadan bu control'e erişmeye kalkarsak
* "Cross-thread operation not valid"
* gibi bir mesaj alırız.
*
* Eğer runtime da ekledigimiz controller varsa ve thread içerisinde onlara erişmemiz gerekiyorsa
* invoke ve delegate kullanarak bunu yapabiliriz.
**/
namespace waForm
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private delegate void DelFormCalisirkenBizimMetodaErismemizeYardimciOlacakMetotReferansi();

private void button1_Click(object sender, EventArgs e)
{
FormHariciSinif mt = new FormHariciSinif();

DelFormCalisirkenBizimMetodaErismemizeYardimciOlacakMetotReferansi yardimciOlacakMetotReferansi
= new DelFormCalisirkenBizimMetodaErismemizeYardimciOlacakMetotReferansi(mt.f_CalistirmakIstedigimizMetot);

/**
* Formun çalışmasından farklı olarak (Bunun main thread, ilk iş parçacığımız olduğunu unutmayalım)
* Calismasini istediğimiz
* "FormHariciSinif"
* sınıftan türetilen bir objenin
*
* "f_CalistirmakIstedigimizMetot"
* metodu bulunuyor.(Bununda ikinci iş parçacığı olacağını unutmayalım)
*
* Ama metodumuz formun dışında bir sınıfın objesine ait olacağı ve her işlemin sonunda Form daki btn isimli button
* kontrolüne erişeceği için thread ler arası(iş parçacıkları arası) bir iletişime ihtiyacımız var.
**/

// Metodun sonunda, f_InvocationBitti metodu çalışsın
yardimciOlacakMetotReferansi.BeginInvoke(f_InvocationBitti, null);
}

private void f_InvocationBitti(IAsyncResult _ar)
{
if (_ar.IsCompleted)
{
MessageBox.Show("bitti");
}
}
}

public class FormHariciSinif
{
public void f_CalistirmakIstedigimizMetot()
{
Form frm = Form.ActiveForm as Form1;
Button btn = (Button) frm.Controls.Find("btn", true)[0];
for (int i = 0; i < 10; i++)
{
if (btn.InvokeRequired) // btn nesnesine başvuru farklı iş parçacığından mı? yani invoke gerekli mi?
{ // Gerekiyorsa, yeniden bir metodun referansına Invoke ile gideriz.
btn.Invoke(new MethodInvoker(delegate
{
btn.Text = i.ToString();
}));
}

Thread.Sleep(250); // Çalıştığını görelim diye.
}

/** for döngüsünden çıkınca da çalışsın diye buraya konulabilirdi ama
* biz, BeginInvoke(fBitinceCalisacakFonk,null) diye yazdık.

if (btn.InvokeRequired)
{
btn.Invoke(new MethodInvoker(delegate
{
MessageBox.Show("bitti");
}));
}
* */
}
}
}



22 Kasım 2009 Pazar

Java da text dosyaya yazmak


StringBuilder sb = new StringBuilder();
sb.append("yazılan satır 1");
sb.append("diğer satır");

File file = new File("c:\\dosyaAdi.txt");

Writer output = new BufferedWriter(new FileWriter(file));
output.write(sb.toString());
output.close();

21 Kasım 2009 Cumartesi

Java da Tag Handler Oluşturmak 2














































Java da Tag Handler Oluşturmak 1































































Java da Tag Handler Kodu


package tags;

import java.io.StringWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import javax.sql.DataSource;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class DbTag extends SimpleTagSupport {

private String jndiName;

@Override
public void doTag() throws JspException {

try {
JspWriter out = getJspContext().getOut();
/**
* Önce tagımızın bodysini almak için getJspBody i kullanıyoruz. JspFragment
* tipinde dönen nesnenin invoke metoduna içi boş bir StringWriter gönderiyoruz
* ki içi tagın body si ile doldurulsun.
*/
StringWriter swriter = new StringWriter();
JspFragment f = getJspBody();
if (f != null) {
f.invoke(swriter);
}
/* Artık tagın body si elimizde. Body içinde bir SQL sorgum olacak.
* Onu da execute jndi attribute undeki resource ile execute edeceğiz. */
String sQuery = swriter.toString();

/** DB işi için aşağıdaki sırayla nesneler oluşturulup query çalıştırılacak.
* Context
* Datasource
* Connection
* PreparedStatement
* Result
*/
Context ctx = new InitialContext();
DataSource datasource = (DataSource) ctx.lookup(this.jndiName);
Connection con = datasource.getConnection();
PreparedStatement ps = con.prepareStatement(sQuery);
ResultSet result = ps.executeQuery();

// Resultın içindeki tablo hakkında bilgiye ResultSetMeta yı kullanıyoruz
ResultSetMetaData resultMeta = result.getMetaData();
// Kolon bilgilerini tablonun başlığı olarak yazalım.
out.println("<table>");
out.println("<thead><tr>");
for(int i=1;i<resultMeta.getColumnCount()+1;i++){
out.println("<th>"+resultMeta.getColumnName(i)+"</th>");
}
out.println("</tr></thead><tbody>");

// Satır satır result içeriğini tabloya yazalım.
while(result.next()){
out.println("<tr>");
for(int i=1;i<resultMeta.getColumnCount()+1;i++){
out.print("<td>"+result.getString(i)+"</td>");
}
out.println("</tr>");
}
out.println("</tbody></table>");

} catch (Exception ex) {
ex.printStackTrace(); // Hatayı tüm detayları ile alt alta yazıyor.
}
}
public void setJndiName(String jndiName) {
this.jndiName = jndiName;
}
}

Java da Veritabanı, Tablo, Kayıt, Connection Pool ve Resource Oluşturulması.

Yapmak istediğimiz şey:
JavaDB içinde
  1. bir veritabanı oluşturmak
  2. ve içine bir tablo
  3. ve bir kaç kayıt ekleyip,
  4. Glass Fish application server ında Connection Pool oluşturup
  5. Resource a bağlamak.
Önce JavaDb servisini başlatalım.

Başladı :)

Bir veritabanı oluşturalım :


VT nin bilgilerini girelim:


Oluştu ama ben yukarıdaki username ve password ile oluşturmadım. Bakın "admin on ADMIN" yazıyor. Kullanıcı adı admin, şifresini de adminadmin olarak oluşturdum. Şimdi bu DB ye bağlanalım.




Bağlandık. İçine bir tablo ekleyelim:



Ekledik:




Bir kaç kayıt ekledik. Insert Into ile. View Data ile içeriğini görelim:

VT mizin özelliklerini görüyoruz:



Glass fish application server ımıza bağlanıyoruz ve yeni bir connection pool oluşturuyoruz :


Adını, kaynağın tipini ve VT yi seçip devam ediyoruz:

Kendi Datasource Classname i gösterdi. Detaylı değişiklikler yapılabilir ama biz yapmıyoruz. Sadece attribute lerini düzenliyoruzki hangi DB yi hangi kullanıcı adı ve şifresi ile hangi URL üzerinden erişebilecek girelim:


İşte o değişiklikler:


Artık Connection Pool eklendi.


Şimd bu poolu gösterecek bir Resource oluşturacağız.



O işte tamamdır. Artık JNDI adını bir test edelim. Ping ile erişebilecek miyiz? A işte oldu :)

İşte bu kadar.

15 Kasım 2009 Pazar

OOP Disadvantages

ref: http://wiki.tcl.tk/13398
Concepts of OOP:
Objects
Classes
Data Abstraction
Encapsulation
Inheritance
Polymorphism

The main difference between procedural and object oriented programming is that the functional programmer try to split function and data (data structures). But object oriented programmers think in objects that hold data and functions (methods) together in one structure.

The problem with polymorphism means that simply finding a function with the right name is not sufficient, you have to also look at the parameters. Trying to read code without a good class browser is almost impossible. It IS impossible once you get into virtual functions where the decision of which function gets called is only determined at runtime.

For example, suppose you're trying to figure out the following line of code
obj.Write(a);
. Which function is being called? Well, if you're lucky and you know what type obj is then you probably only have about 10 different versions of Write() to pick from depending upon what a is. If you're unlucky and obj can be of several types, then you got a lot of work cut out for you.



ref:http://www.macs.hw.ac.uk/~alison/ds98/node47.html
As objects are normally referenced by pointers, with memory allocated dynamically, there is a small space ovearhead to store the pointers, and a small speed overhead to find space on the heap (at run-time) to store the objects. For dynamic methods there is an additional small time penalty, as the method to choose is found at run time, by searching through the object hierarchy (using the class precedence list for the object). These days, these efficiency penalties seem to be of relatively little importance compared with the software engineering benefits.

Java da Filter

Filter neydi dersek:
Requestin, servlete ulaşmadan önce
ya da
responsun servleti terketmesinden sonra
ya da
her iki durumda çalışan ve Filter arayüzünden uyarlanan bir sınıftır. Filter çalıştırılarak, response, request nesneleri incelenebilir, değiştirilebilir ya da durdurulabilir.

Filter eklemedik. Sadece bir önceki makaledeki servletimiz mevcut. Bu servletin ekli haliyle web.xml aşağıdaki gibidir.




ilkServlet
servlets.ilkServlet


ilkServlet
/ilkServet



30



index.jsp




Şimdi filitremizi ekliyoruz: