Saturday, June 26, 2010

OpenCV ve Ubuntu 9.x

Ubuntu 9.04'ten 9.10'a gecis yaptik; Her iki ortamda da OpenCV 2.0 daha sonra 2.1 bazi problemler cikardi. Ilk once standart kurulumu takip ettikten sonra cv.so dosyasi gorulmuyor, bu sebeple import patliyordu. cv.so dosyasini dogru yere koyduk. Soyle:

sudo mv Downloads/OpenCV-2.1.0/lib/cv.so /usr/local/lib/python2.6/dist-packages/cv.so

Bundan sonra OPENCV/samples/python altindaki programlar problem verdi. Hata:

libdc1394 error: Failed to initialize libdc1394

Bunu tamir etmek icin surayi takip ettik, problem duzeldi.

Simdi, OpenCv highgui paketini kullanan orneklere gelelim. OpenCv'yi kullanmanin bir suru degisik yontemi var, habire yapilan degisiklikler aslinda isleri bozuyor. Simdi cv paketine gecildi, orneklerde de buraya dogru bir gidis var. Eger swig uzerinden highgui kullanimina devam etmek istiyorsaniz, "sudo apt-get install python-opencv" ile gerekli kodlari alabilirsiniz, fakat bu halde bile artik tum ornekler isletmiyor, lkdemo.py bunlardan biri. Bizim tavsiyemiz tum kullanimin mumkun oldugu kadar cv paketi uzerinden yapilmasi.

Friday, June 25, 2010

Ubuntu ile CD Yakmak

ISO dosyalarini CD uzerine yakmak icin kullanisli bir arac: cdrecord. Once hangi CDR birimlerinin bagli olduguna bakilir:

cdrecord -scanbus

Suna benzer bir cevap gelir;

scsibus3:
3,0,0 300) 'MATSHITA' 'DVD-RAM UJ-852S ' '1.80' Removable CD-ROM
3,1,0 301) *
3,2,0 302) *
3,3,0 303) *

sudo cdrecord -v dev=3,0,0 dosya.iso

ya da

wodim dev=/dev/cdrw -v -data dosya.iso

Eger elimizde onceden hazir bir iso imaji yoksa, mesela kendi duz dosyalarimizi CD'ye yakmak istiyorsak, once ISO imajini kendimiz yaratiriz:

genisoimage -joliet-long -input-charset utf-8 -r -J -o imaj.iso /falan/filan/dizin

Kaynak

Ubuntu 9.x

Ubuntu 9.04 versiyonu hakkinda bazi notlar:

Daha once bahsettigimiz Caps tusunu Ctrl yapma cozumu yerine, su kullanim yeterli: System | Preferences | Keyboard'dan Layouts tab, oradan USA klavyesi (bizim kullandigimiz) ve o listeden de Ctrl key position seceneginde "make caps lock an additional ctrl".

Wifi adaptoru icin bizim Toshiba Satellite icin ve 9.04 kernel header (kafa!) dosyalari ile uyumlu olan compat-wireless paketi 2.6.33. Ubuntu 9.10 uzerinde compat-wireless paketine gerek yok.

Python versiyonu degismis, 2.5 yerine 2.6; o sebeple Sci/Numpy, ve diger bilimum paketleri tekrar kurmak lazim. Dert degil.

Eger 8 -> 9.04 -> 9.10 gecisini hep guncellemeler uzerinden yaptiysaniz, makina kendini kaybedebilir. Aslinda en iyisi onemli dosyalari yedekleyip 9.10 versionunu diskten sifirdan kurmak.

Ubuntu 9.x versiyonlarinda pil uzerinde calisiyorsaniz, sistem "Battery Discharging" gibi bir mesaji rahatsiz edici bir popup, dialog, vs. icinde surekli ekrana basiyor. Bundan kurtulmak icin gconf-editor komut satirindan baslatilacak. Sonra gconf-editor > apps > gnome-power-manager > notify'a gidip discharging kutusundaki isareti iptal etmek gerekiyor. Sonra "threshold" altindaki percentage_critical ve percentage low degerlerini '0' yapin, "general" altindaki "use_time_for_policy" ve "use_profile_time" kutularini iptal edin.

Ubuntu baslayinca calan davul sesini kapatmak icin Preferences -> Startup Applications'a gidin ve Gnome Login Sound secenegini bulun. Bu ogenin sol tarafindaki secenegi iptal edin. Eger bu ise yaramazsa, davul sesinin ses dosyasi /usr/share/sounds/ubuntu/stereo/dialog-question.ogg. Bu dosyayi silip, sonra "sudo touch dialog-question.ogg" komutu ile bos bir dosya yaratabilirsiniz, bu dosyada hicbir ses olmadigi icin login esnasinda hic ses cikmamis olur.

Daha detay cozdukce buraya ekleyecegiz.

Monday, June 21, 2010

Bogazici, Fen Bolumu, Tez, Latex

Basliktaki kelimeler arama motorlari icin yeterli herhalde.. Bogazici'nde lisans ustu tez yazmak icin gerekli dosyalari suradan indirebilirsiniz. Bizim tezin icerigi bu zip icinde, gerekli LaTeX dosyalari vs. hepsi dahil; belki baska mastir / doktora ogrencileri icin faydali olur.

Sunday, June 20, 2010

Cok Cekirdekli Islemciler, Python

Moore kanunda (tek islemci baglaminda) bir duvara carpildi; Islemciler artik cok cekirdekli (multicore) mimariye dogru gidiyor. Dizustunde en az iki olmak uzere, 4, 8, vs. gibi cok cekirdekli islemciler normal hale gelmeye basladi. Buna ek olarak: Cok cekirdekli mimarilerdeki tek bir cekirdek (islemci), sadece bir tane islemci iceren "eski usul" mimarideki tek islemciden daha yavas olacak. Yani programcilar yazdiklari kodu hizlandirmak istiyorlarsa muhakkak cok cekirdekli ortamda calismaya alismali; yoksa eldeki mevcut hizi bile yeni mimaride kaybetmemiz mumkun.

Python baglaminda: birden fazla cekirdegi kullanmak icin tavsiye edilen Thread objesini degil, multiprocessing adli bir paketi kullanmak. Thread objeleri GIL adli bir kilite takiliyor, bu cpython derleyicisi ile ilgili bir durum (imis); bu sebeple cekirdekleri kullanmak icin multiprocessing gibi ayri / farkli bir yaklasim gerekli.

Bu paket baslatilan ilk surec icinde alt surecler (subprocess) baslatiyor, ve bu alt surecler dogru sekilde birden fazla cekirdege yayilabiliyor. Kurmak icin onceki baglantidan zip dosyasini indirin, acin ve "sudo python setup.py install" komutunu isletin.

Ornek bir kod:
from multiprocessing import Process
from pylab import *
import time

def f(name):
while 1:
print 'hello', name
for i in range(10000):
y = cos(i)

if __name__ == '__main__':
p1 = Process(target=f, args=('first',))
p1.start()
p2 = Process(target=f, args=('second',))
p2.start()
Bu ornekte iki surec baslatiyoruz, her surecte matematik cosine islemini yaptiriyoruz ve ekrana o surece ozel bir seyler basiyoruz. Isletince Ubuntu uzerinde System | Administration | System Monitor ile cekirdeklerin durumuna bakabilirsiniz. Bizde mevcut iki cekirdek %100'e yakin kullanim (utilization) rapor ettiler.

Kaynak

Cok Boyutlu Gaussian'dan Orneklemek

Cok boyutlu (multivariate) Gaussian dagilimindan orneklemek icin multivariate_normal cagrisi kullanilabilir.
from pylab import *
from numpy import *

def gen(): return random.multivariate_normal([10,10], [[5,0],[0,5]])

p = gen()
for i in arange(100):
p = vstack((p,gen()))

plot(p[:,0], p[:,1], 'o')
xlim((-10,30))
ylim((-10,30))
show()
Cagriya parametre olarak gecilen degerlerden ilki ortalama (mean) degeri. Yukarida 2 boyutlu kordinatta [10,10] olarak vermisiz, yani dagilimin ortasi x=10, y=10. Ikinci parametre kovaryans (covariance), dagilimin genisligi. Bu deger Gaussian icin tam yuvarlak, kuresel (spherical) olabilir, ya da elipse, morf edilmis kure olabilir, vs.. Bilinmezlik (uncertainty) ne olduguna gore degisir. Mukemmel yuvarlak bilinmezlik icin kovaryans birim (identity) matrisin katlari olur, yani [[1,0],[0,1]]'in katlari. Biz [[5,0],[0,5]] olarak sectik.

Burada ayrica vstack cagrisi ile yatay boyutu birbirine tam uyan matrislerin nasil ust uste konulabilecegini de goruyoruz.

100 kere bu Gaussian'a "zar attirinca" sonuc alttaki grafik:

Wednesday, June 16, 2010

Disco Project

MapReduce paradigmasini temiz bir Python arayuzu uzerinden kullanmak istiyorsaniz, Disco Project uygun bir yaklasim olabilir. MapReduce bilindigi gibi cogunlukla Hadoop uzerinden kullanilir, Disco MapReduce'a alternatif bir yaklasim. Projenin ic kodlamasi, paralel programlama destegi ile unlu olan Erlang dili ile yapilmis. Proje'nin Nokia Arastirma Grubu tarafindan baslatildigi dusunulurse, simdiye kadar devasa boyutlarda veriyi isleyerek kendini ispatlamis oldugunu farz edebiliriz.

Friday, June 11, 2010

Imaj Uzerine Text

OpenCV ile imaj islerken ayni imaj uzerine yazi / metin (text) koymak istiyorsak, su cagriyi kullanabiliriz.
pt1 = cv.cvPoint (100, 120)
font = cv.cvInitFont (CV_FONT_HERSHEY_SIMPLEX, 1.0, 1.0, 0, 1, CV_AA)
cvPutText (image, "Testing text rendering!", pt1, font, CV_RGB(255,0,0))
Font parametresinden sonra gelen her iki 1.0 yazinin buyuklugunu, en sondaki 1 ise kalinligini temsil ediyor. CV_RGB parametresi yazinin rengi icin kullaniliyor (255,0,0 kirmizi rengi).

Thursday, June 10, 2010

kdtree

KDTree arama amacli olarak herhangi boyutlu bir geometrik alani (ve o alandaki noktalari) bolumlere ayirabilen bir algoritmadir. Cok boyutlu noktalari bir alana dagitip / koyup, sonra elimizdeki baska bir noktanin "o noktalarin hangisine daha yakin oldugunu" sorgulamamizi saglar.

KDTree'leri bir tur "cok boyutlu noktalar icin kullanilan bir veri tabani" olarak kabul edebiliriz. Bu taban icinde noktalar oyle dagitiliyor ki, "yakin nokta" arama islevi daha kolay hale geliyor.

Python olarak iyi isleyen bir kod python-kdtree projesinde. Kullanim ornegi altta, ornekte kdtree'ye noktalari verip, sonra bu noktalarin icinden en yakin 2 tanesini bulmasini soyluyoruz.
data = [(2,3), (5,4), (9,6), (4,7), (8,1), (7,2)]
point = (8,5)
tree = KDTree.construct_from_data(data)
nearest = tree.query(point, t=2)
print nearest

Tuesday, June 8, 2010

Python -> C Dizin (Sequence) Gonderimi

Bir Python script icinden C fonksiyonuna dizin gondermek icin
static PyObject* py_dizin(PyObject* self, PyObject* args)
{
PyObject* seq;

if(!PyArg_ParseTuple(args, "O", &seq)) return 0;

seq = PySequence_Fast(seq, "argument must be iterable");
int seqlen = PySequence_Fast_GET_SIZE(seq);
float* dizin = new VL::float[seqlen];

double *dbar = new double[seqlen];
for(int i=0; i < seqlen; i++) {
PyObject *fitem;
PyObject *item = PySequence_Fast_GET_ITEM(seq, i);
fitem = PyNumber_Float(item);
dizin[i] = PyFloat_AS_DOUBLE(fitem);
printf("%f\n",dizin[i]); // ekrana bas
Py_DECREF(fitem);
}
Py_DECREF(seq);

delete[] pic; // is bitince dizin burada silinir

return Py_BuildValue("d", 0); // geri sifir dondur
}

Python icinden test etmek icin dizin([10.,20.,30.]) gibi bir cagri yapilabilir.

Monday, June 7, 2010

Python'dan C Fonksiyonu Cagirmak

Python script icinden C fonksiyonu cagirmak icin sunlar gerekli. Kodun testmod.c dosyasinda oldugunu farzedelim; once bir shared library olusturmamiz lazim. make.sh adinda bir derleme script'i soyle olabilir:
#!/bin/sh
gcc -shared -o testmod.so -I/usr/include/python2.5 -lpython2.5  testmod.c
C fonksiyonu soyle bir dosyada:
#include "Python.h"

static PyObject* py_myFunction(PyObject* self, PyObject* args)
{
 char *s = "Hello from C!";
 return Py_BuildValue("s", s);
}

static PyObject* py_myOtherFunction(PyObject* self, PyObject* args)
{
 double x, y;
 PyArg_ParseTuple(args, "dd", &x, &y);
 return Py_BuildValue("d", x*y);
}

static PyMethodDef myModule_methods[] = {
 {"myFunction", py_myFunction, METH_VARARGS},
 {"myOtherFunction", py_myOtherFunction, METH_VARARGS},
 {NULL, NULL}
};

void inittestmod()
{
 (void) Py_InitModule("testmod", myModule_methods);
}
Usttekileri make.sh ile derledikten sonra, bir Python script icinden sunlar isletilebilir:
from testmod import *

print "Result from myFunction:", myFunction()
print "Result from myOtherFunction(4.0, 5.0):", myOtherFunction(4.0, 5.0)
Kodlarin tamami altta

Not: Eger gcc yerine g++ kullanirsaniz, o zaman tum fonksiyonlarin extern "C" { } ile sarilmasi gerekli, cunku g++ derleyicileri derlerken fonksiyon isimlerini degisime ugratiyorlar (mangling), ve Python yorumlayicisi bekledigi cagri isimlerini bulamayinca hata veriyor. Surada.

Not: Bir .so dosyasi, shared library icindeki sembolleri, fonksiyon cagrilarini listelemek icin "nm dosya.so" komutu kullanilabilir.

Kaynak

make.sh

#!/bin/sh
gcc -shared -o testmod.so -g `pkg-config opencv --cflags --libs glib-2.0` -I/usr/include/python2.5 -lpython2.5  testmod.c

testmod.c

#include "Python.h"

/*
 * Function to be called from Python
 */
static PyObject* py_myFunction(PyObject* self, PyObject* args)
{
char *s = "Hello from C!";
return Py_BuildValue("s", s);
}

/*
 * Another function to be called from Python
 */
static PyObject* py_myOtherFunction(PyObject* self, PyObject* args)
{
double x, y;
PyArg_ParseTuple(args, "dd", &x, &y);
return Py_BuildValue("d", x*y);
}

/*
 * Bind Python function names to our C functions
 */
static PyMethodDef myModule_methods[] = {
{"myFunction", py_myFunction, METH_VARARGS},
{"myOtherFunction", py_myOtherFunction, METH_VARARGS},
{NULL, NULL}
};

/*
 * Python calls this to let us initialize our module
 */
void inittestmod()
{
(void) Py_InitModule("testmod", myModule_methods);
}

testmod.py

from testmod import *

print "Result from myFunction:", myFunction()
print "Result from myOtherFunction(4.0, 5.0):", myOtherFunction(4.0, 5.0)





Scipy.org Parcacik Filtreleri - Particle Filters

Scipy.org sitesindeki kod orneklerinden parcacik filtreleri kodu icin gonderdigimiz duzeltme ana koda dahil edildi. Bizim en son gonderdigimiz kod altta

from numpy import *
from numpy.random import *
from pylab import *
from itertools import izip
import time
  
def resample(weights):
   n = len(weights)
   indices = []
   C = [0.] + [sum(weights[:i+1]) for i in range(n)]
   u0, j = random(), 0
   for u in [(u0+i)/n for i in range(n)]:
     while u > C[j]:
       j+=1
     indices.append(j-1)
   return indices


def particlefilter(sequence, pos, stepsize, n):
   seq = iter(sequence)
   x = ones((n, 2), int) * pos                   # Initial position
   f0 = seq.next()[tuple(pos)] * ones(n)         # Target colour model
   yield pos, x, ones(n)/n                       # Return expected position, particles and weights
   for im in seq:
     x += uniform(-stepsize, stepsize, x.shape)  # Particle motion model: uniform step
     x  = x.clip(zeros(2), array(im.shape)-1).astype(int) # Clip out-of-bounds particles
     f  = im[tuple(x.T)]                         # Measure particle colours
     w  = 1./(1. + (f0-f)**2)                    # Weight~ inverse quadratic colour distance
     w /= sum(w)                                 # Normalize w
     yield sum(x.T*w, axis=1), x, w              # Return expected position, particles and weights
     if 1./sum(w**2) < n/2.:                     # If particle cloud degenerate:
       x  = x[resample(w),:]                     # Resample particles according to weights

if __name__ == "__main__":
  ion()
  seq = [im for im in zeros((20,240,320), int)]      # Create an image sequence of 20 frames long
  x0 = array([120, 160])                              # Add a square with starting position x0 moving along trajectory xs
  xs = vstack((arange(20)*3, arange(20)*2)).T + x0
  for t, x in enumerate(xs):
    xslice = slice(x[0]-8, x[0]+8)
    yslice = slice(x[1]-8, x[1]+8)
    seq[t][xslice, yslice] = 255

  for im, p in izip(seq, particlefilter(seq, x0, 8, 100)): # Track the square through the sequence
    pos, xs, ws = p
    position_overlay = zeros_like(im)
    position_overlay[tuple(pos)] = 1
    particle_overlay = zeros_like(im)
    particle_overlay[tuple(xs.T)] = 1
    #clf()
    hold(True)
    draw()    
    time.sleep(0.3)
    imshow(im,cmap=cm.gray)                         # Plot the image
    spy(position_overlay, marker='.', color='b')    # Plot the expected position
    spy(particle_overlay, marker=',', color='r')    # Plot the particles
    
  show()
     

Wednesday, June 2, 2010

Dizine Eklemek, Bolmek

Iki dizini ust uste dizmek (stacking) icin Python vstack (dikey) ve hstack (yatay) fonksiyonlari var. Bu fonksiyonlar ilginc sekillerde kullanilabiliyor: Mesela [100,100] 2 boyutlu baslangic noktasindan x-kord. ikiser ikiser, y-kord. ucer ucer buyuyecek sekilde 5 tane veri noktasi uretmek istesek:
x0 = array([100, 100])
xs = vstack((arange(5)*3, arange(5)*2)).T + x0
yeterli. arange(N) O..N-1 arasinda sayilari uretir. Bu sayilarin hepsini 3 ile carpiyoruz. Sonra aynisini yapip 2 ile carpiyoruz. Bu iki dizini ust uste "yigiyoruz", ve .T cagrisi ile devrigini (transpose) aliyoruz, boylece [5,2] boyutlu veri noktalarini elde ediyoruz. Tum bunlara x0 baslangic degerini ekleyince istedigimiz sonuc geliyor.
[[100 100]
[103 102]
[106 104]
[109 106]
[112 108]]
Bir dizini "kesmek" icin slice() fonksiyonu var.
a = [1,2,3,4,5,6,7,8,9]
sl = slice(2,8,2)
Ustteki slice tanimi 2. oge ile 8. oge (haric olmak uzere) arasindaki tum elemanlari geri getirir. Eger son 3. parametre "2" verilirsek, bu "ikiser ikiser git" anlamina geliyor, yani bir oge surekli atlanir. print a[sl] cagrisi bize [3, 5, 7] sonucunu dondurecek.

Ayni cagri print a[2:8:2] seklinde de gerceklestirilebilir. Bazen degiskenler kullanilarak slice() objeleri yaratmak gerekebiliyor, bu durumlarda slice() cagrisi tercih edilmekte.

Pur Javascript ile Flash Dosyalarini Gostermek

Alttaki baglantida pur Javascript ve HTML5 ozellikleri kullanilarak bir SWF (flash) dosyasinin icerigi gosterilmekte... Animasyon oldukca iyi isliyor.

http://smokescreen.us/demos/lyrisdemo.html

izip

Python gezinme (iteration) araclarindan izip, birden fazla dizinin ayni anda gezilmesini saglar. Her dizinde yapilan gezinme hareketi, otekilerde ayni sekilde yapilir.
from itertools import izip

aa = [1,2,3]
bb = [5,6,7]

for a, b in izip(aa, bb):
print a, b
programi su sonucu verir:
1 5
2 6
3 7

Tuesday, June 1, 2010

John Resig Roportaji

jQuery kutuphanesinin programcisi John Resig ile bir roportaj [mp3] yayQuery sitesinde yayinlandi. Resig jQuery'yi pek cok degisik tarayicida isler hale sokabilmenin zorlugundan bahsediyor. Ona gore icinde Webkit olan tarayicilar calismasi en rahat olan tarayicilar, ki iPhone ve Android bu yonde gidiyorlar (pek cok kisinin gidisati bu yonde). Su anda Nokia Symbian uzerinde tarayici kuranlar genellikle Opera Mini kuruyorlar ve bu Resig'e gore bir tarayici bile degil, pek cok Javascript cagrisi dogru olarak desteklenmiyor.

Pek cok platformda (ozellikle Android) gorsel arayuzu iPhone arayuzu gibi gostermeyi amaclayan ve bizim seminerde bahsettigimiz jqTouch kutuphanesinden de bahsedildi.

Resig su anda ozellikle mobil uzerine odakli.

Yaklasim

Suradaki prezentasyonda belirttigimiz gibi cozum yelpazemizin en son sekli soyle: HTML5 / Javascript / jQuery gorsel kodlari icinden Ajax cagrilari kullanarak JSON uzerinden Google App Engine Python servisine baglanilip, BigTable, memcache gibi servisler uzerinden bilgi alisverisi yapilmasi. Bulut (GAE) isin servis tarafini hallediyor, HTML5 ve diger teknolojiler baglanan (client) tarafinda. jQuery / Javascript / JSON uclusu gorsel katman icin oldukca populer, pek cok eklenti, cetrefil veri temsili bu sekilde kullanilabilir. jQuery, HTML5 DOM yapisini cok esnek bir sekilde gezip degistirebilme yetenegine sahip (Javascript / ya da servis tarafinda "string parcalarini birlestirerek html uretimi" yapmiyoruz yani, direk, tekil HTML birimlerine erisiyoruz).

Gidisat, cok onceleri gundeme getirilen (Oracle, Sun tarafindan) Net Bilgisayari yonunde sanki, ama fark surada: Artik baglanan da, servis tarafi da kuvvetli ve bol bol is yapiyor. Blogger, Gmail, Google Docs gibi uygulamalara dikkat edersek, Javascript kodlari hep is basinda, Internet baglantimiz kesilse bile bu programlari kismen kullanabiliyoruz.

Yelpazenin servis tarafinda Python yerine baska diller kullanilabilir, HTTP POST / GET gibi son derece basit bir protokolu destekleyen her servis is gorur. Bulut yerine kendi servisimizi de kullanabiliriz.

jQuery Grafikleme Eklentisi - Flot

Bir liste icindeki x-y kordinati uzerinden verilmis sayi degerlerinin grafigini (plot) gostermek icin jQuery eklentisi Javascript kutuphanesi Flot iyi isliyor. Pur zaman bazli olan Y degerlerini grafiklemek istesek mesela (diyelim ki bir hisse senetinin fiyatlari), Y bazli dizine ekleme yaparak, 1'den baslayarak birer birer artacak x degerlerini de eklemek zorundayiz. Google App Engine servis Python tarafi:
class Aksiyon(webapp.RequestHandler):
def get(self):
prices = ... # fiyatlar
res = []
for index, stock in enumerate(prices):
res.append( [index, stock.price] )
self.response.out.write(simplejson.dumps( res ))
Dizin prices icinde pur Y kordinatindaki fiyatlar var. Biz bu listeyi alip, 2 birimli listelerin listesi haline getiriyoruz, [[1,44], [2,55], ..] gibi. Sonra JSON ile bu liste Javascript'e donuluyor.

Not: enumerate() cagrisinin kullanilmasinin sebebi "index" degiskenini kullanabilmek; bu degisken bir listede gezilen her oge icin onun numerik (indis) yerini raporlayabilen bir cagridir.

HTML icinde grafigin gosterilecegi yeri bos bir div olarak birakmak yeterli. CSS stili "display:none" ile ilk yuklendiginde gorulmez halde birakilabilir.
<div id="placeholder"></div>
jQuery cagrisi ise soyle
function grafik() {
$("#placeholder").show();
$.getJSON('/aksiyon',
{ ... },
function (data) {
$.plot($("#placeholder"), [data]);
}
);
}
[data] kullanimi "liste icinde liste icinde liste" haline gelmis oluyor.

jQuery ile Girdi Tamamlamak (Auto Complete)

Form uzerinde metin bazli alanlarda girilecek birkac harf sonrasi seceneklerin bize bir listede gosterilmesini istiyorsak (suggest, autocomplete), suradaki jQuery plug-in ise yarayacaktir. Indirip jquery.autocomplete.js ve jquery.autocomplete.css dosyalarini dizin yapiniza ekleyin ve HTML dosyalari icinden "link href" ve "script src" ile dahil edin. Kod kullanimi oldukca basit, form uzerindeki tipi text olan input alaninin kimligini (id) alip, autocomplete koduna geciyoruz. Eger id "kimlik1" olsaydi, jQuery ile
$().ready(function() {
var liste = ...;
$("#kimlik1").setOptions({
max: 20
});
$("#kimlik1").focus().autocomplete(liste);
});
kullanabilirdik. Degisken "liste" bir Javascript dizinidir; JSON ile servis tarafindan alinmis olabilir, ya da yerel olarak gomulu (hardcoded) bir liste olabilir, vs.