Thursday, December 23, 2010

Fourier Serileri, Transformu ve DFT

Friday, December 17, 2010

Scan Etmek icin Script

Otomatik olarak numaralandirarak sayfalari scan etmek icin basit bir script. 01'den baslayarak birer birer artirarak scan edip imaj dosyalarini yaratir, her scan sonrasi durur ve [enter] dugmesine basilmasini bekler, kullanici o sirada sayfa degistirebilir. Scanner parametreleri icin scanimage -L, mesela plustek:libusb:005:002 gibi bir sonuc.
import os, re, sys

def run_command(command):
result = []
f = os.popen(command, "r")
sys.stdout.flush()
for l in f.xreadlines():
result.append(l)
return result

def two_digitize(i):
if i < 10: return "0" + str(i)
return str(i)

i = int(sys.argv[1])
while True:
print two_digitize(i)
run_command("scanimage --resolution 200 -x 200 -y 100 -d [SCANNER PARAMETRELERI] \
--format=tiff > " + two_digitize(i) + ".tiff")
i += 1
r = raw_input(">")

Wednesday, December 15, 2010

Bilinen Varyasyonlar ve EM Algoritmasi

Onceki bir yazida 2 boyutlu birkac Gaussian karisimini gosterdik. Bu yazida biri 100 digeri 20 tane olmak uzere iki Gaussian'dan uretilen noktalari nasil modellenebilecegini gosterecegiz. Bu analiz icin genellikle kullanilan yontem EM yani Expectation Maximization algoritmasidir. Uretilen veri icinde "asiri" degerlerin oldugu ama geri kalani normal dagilima sahip bir veriyi modelleyecegiz. Asiri degerler nereden gelebilir? Olcum aletinde bir hata olabilir, arada sirada, yanlislikla asiri degerler kaydedilebilir. EM'e bu asiri degerlerin belli bir alanda odaklanacagini ongorerek o noktalar icin ufak bir kovaryans matrisini verebiliriz, ve o noktalari bir Gaussian altina atarak filtrelenmesini saglayabiliriz.

Not: EM birden fazla Gaussian karisim oranlarini, hem ortalama degerlerini (mu) hem de kovaryans degerlerini veriden hesaplayabilir. Bu ornekte bir kovaryansin bilindigini farz ediyoruz.

Bu algoritmanin neler yaptigina dikkat edelim: Birisi bize bir veri obegi veriyor, biz de diyoruz ki "herhalde bu veri icinde bazi ekstrem noktalar var". Buna gore bir kovaryans ayarliyoruz ve EM'i isletiyoruz, EM pat diye iki Gaussian icin orta noktayi bulup bize veriyor. Kovaryans ta bilmiyor olabilirdik, yine EM isletiyoruz ve bize iki tane Gaussian'i veriden cekip cikartiyor.

Bu onemli bir algoritma. Iteratif olarak isler, detaylar icin literature bakilabilir. Bitis ani log olurluk (likelihood) degerinin artik degismedigi andir.
import numpy as np
from matplotlib import pyplot as plt
import scipy.stats

def gen_data(dim):
sigma_1 = np.eye(dim)*20.0
sigma_2 = np.eye(dim)*2.0

x1 = np.random.multivariate_normal([40.,10.], sigma_1, size=100)
x2 = np.random.multivariate_normal([10.,30.], sigma_2, size=20)
x = np.append(x1, x2, axis=0)

lam_0_1 = np.eye(dim)
lam_0_2 = np.eye(dim)

mu_0_1 = np.array([[1, 1]]).T
mu_0_2 = np.array([[1, 1]]).T
return x.T

def norm_pdf(b,mean,cov):
k = b.shape[0]
part1 = np.exp(-0.5*k*np.log(2*np.pi))
part2 = np.power(np.linalg.det(cov),-0.5)
dev = b-mean
part3 = np.exp(-0.5*np.dot(np.dot(dev.transpose(),np.linalg.inv(cov)),dev))
dmvnorm = part1*part2*part3
return dmvnorm

def EM_known_variance(X, mu, sigma, pi, K, dim, size):
likelihood = -np.Inf
while True:
# E step
for i in range(size):
for k in range(K):
nom = pi[k]*norm_pdf(X[:,i], mu[:,k], sigma[:,:,k])
denom = 0
for j in range(K):
denom += pi[k]*norm_pdf(X[:,i], mu[:,j], sigma[:,:,j])
gamma[k,i] = nom / denom


# M step
N = np.zeros((dim, 1))
for k in range(K):
sum = 0
for i in range(size):
sum += gamma[k, i]
N[k,:] = sum

# new mu
for k in range(K):
sum = 0
for i in range(size):
sum += gamma[k, i]*X[:,i]
mu[:, k] = (1/N[k,:])*sum

# new pi
for k in range(K):
pi[k] = N[k,:] / size

# no estimation of new sigma, we left that one out
# for this example

new_likelihood = 0
for i in range(size):
sum = 0
for k in range(K):
sum += pi[k] * norm_pdf(X[:,i], mu[:,k], sigma[:,:,k])
new_likelihood += np.log(sum)

#print new_likelihood
#print mu[:,0]
#print mu[:,1]

if (np.abs(new_likelihood - likelihood)) < 1e-5: break
likelihood = new_likelihood

print "done"
return mu, pi


K = 2
dim = 2
size = 120
pi = np.ones(dim)*(1.0/K)
X = gen_data(dim)
#mu = np.random.rand(dim, K)*10.0
mu = np.ones((dim, K))*10.0
sigma = np.zeros((dim, dim, K))
gamma = np.zeros((K, size))
sigma[:,:,0] = np.eye(dim)*20.0
sigma[:,:,1] = np.eye(dim)*2.0

mu, pi = EM_known_variance(X, mu, sigma, pi, K, dim, size)
print "EM results"
print "mu", mu
print "pi", pi

Sunday, December 12, 2010

DJVU Numaralari

Kitaplardan scan edilmis imajlarin DJVU formati ile sıkıstırılabilecegini soylemistik. Ek bazi numaralar sunlar:

DJVU icinden bir sayfayi silmek icin (mesela birinci sayfayi silelim):

djvm -d dosya.djvu 1

Ayri bir PDF dosyasini DJVU dosyasinin basina eklemek icin:

Once PDF dosyasini pdf2djvu ile djvu haline getirmek lazim

pdf2djvu ek.pdf -o ek.djvu
djvm -i dosya.djvu ek.djvu 1

Sona eklemek icin

djvm -i dosya.djvu ek.djvu

Thursday, December 9, 2010

2 Boyutlu 2 Gaussian Karisimi, 3D

Iki boyutlu iki Gaussian karisimini alttaki kodlarla hesaplayip grafikliyoruz. Bazi notlar: scipy.stats.norm.pdf cagrisi tek bir skalar olasilik degeri dondurmesi gerekirken, bir matris geriye dondurdu. Bu matris belki ek islemden gecerek dogru sonu elde edilebilirdi, fakat pdf cagrisindan beklenen bu degildir. Bu sebeple pdf kodunu kendimiz yazdik.

Ayrica grafiklerken countour() cagrisi tek Gaussian ile calisti, fakat iki Gaussian problem cikardi. Bu sebeple duz plot() cagrisi kullandik.

Alttaki olasilik alanini hesaplatmak icin her x,y degerini her iki Gauss pdf'e geciyoruz, ve gelen sonuclari 0.5 ile (karistirma / agirlik carpanlari / mixing coefficients) carparak topluyoruz. Elde edilen sonucun kendisi de bir dagilimdir, yani karisimin entegrali alinirsa sonuc 1 gelmelidir.
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import scipy.stats

def norm_pdf(b,mean,cov):
k = b.shape[0]
part1 = np.exp(-0.5*k*np.log(2*np.pi))
part2 = np.power(np.linalg.det(cov),-0.5)
dev = b-mean
part3 = np.exp(-0.5*np.dot(np.dot(dev.transpose(),np.linalg.inv(cov)),dev))
dmvnorm = part1*part2*part3
return dmvnorm

fig = plt.figure()
ax = Axes3D(fig)

M = 100
a = np.linspace(0.,50.,num=M)
b = np.linspace(0.,50.,num=M)

arr = []
X = np.zeros((M, M))
for i in range(M):
for j in range(M):
x1 = norm_pdf(np.array([a[i],b[j]]), np.array([10,10]), np.eye(2)*10)
x2 = norm_pdf(np.array([a[i],b[j]]), np.array([40,40]), np.eye(2)*0.4)
X[i,j] = 0.5*x1 + 0.5*x2
arr.append([i, j, X[i,j]])

arr = np.array(arr)

ax.plot(arr[:,0], arr[:,1], arr[:,2], zs=0, zdir='z', label='zs=0, zdir=z')

plt.show()


3 Boyutlu Normal Dagilim, 3D

3 boyutlu bir normal dagilima (multivariate Gaussian) zar attirip grafiklemek icin su kodlar kullanilabilir. Iki tane 3d Gaussian plot ettik, farkli \mu degerleri var, ve kovaryanslarinda diagonal disinda degerler sifir, yani 3 degiskenin birbiri ile hic korelasyonu yok. Bu sebeple her dagilimin da grafikleri tam yuvarlak halde cikiyor.
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

fig = plt.figure()
ax = Axes3D(fig)

n1 = np.random.multivariate_normal([10,10,10], np.eye(3)*5, size=400)
print n1
n2 = np.random.multivariate_normal([30,30,30], np.eye(3)*0.4, size=40)
print n2

n = np.append(n1, n2, axis=0)

ax.plot(n[:,0], n[:,1], n[:,2], 'o', zs=0, zdir='z', label='zs=0, zdir=z')

plt.show()

Wednesday, December 1, 2010

Google Earth 6

Ubuntu uzerinde en son Google Earth versiyonunu isletmek icin apt-get install lsb-core islemini yapmak lazim. Bu yapildiktan sonra suradan bir bin dosyasi indirilir, uzerinde chmod u+x yapildiktan sonra isletilip kurulum yapilabilir.

Sınırlı Elementler Metodu (Finite Elements Method)


PDF

Saturday, November 27, 2010

IETT Duraklari ve Hatlari

Istanbul IETT durak ve hat verisini yazinin altindaki kaynaktan indirebilirsiniz. Veri iki cesit, duz hat ve durak verisi, bir de Python pickle halinde islenmis veri yapilarinin oldugu .pkl dosyalari. Duz veriyi kullanmaya gerek yok, pickle dosyalari her seyi iceriyor. Veri yapilari, fonksiyonlari "Path-Planning Algorithms for Public Transportation Systems" adli makalede tarif edilen veri yapilaridir.

CS yapisi ortak duraklar (common stops) veri yapisidir; iki hattin ortak, cakistigi duraklarin ismini listeler. K fonksiyonu (verisi) x hatti uzerindeki y duraginin hattin basindan baslayarak sayi olarak "kacinci" oldugunu rapor eder. SR cagrisi bir duraktan gecen hatlar, routestops bir hattin ziyaret ettigi duraklardir.

Python cagrisi olarak bazi ornekler:

59N ve 59R hattinin ortak duraklari

print CS(cs, '59N', '59R')

59N hattindaki L0168A duragi kacinci duraktir (cevap 4).

print K(k, '59N', 'L0168A')

Durak detaylari

print duraklar['L0139J']

Bir hattin gectigi duraklar

print routestops['59N']

Bir duraktan gecen hatlar

print sr['L0168A']

Ustteki cagrilarin hepsi test.py adli dosya icinde.

Bu veriler, veri yapilari kullanilarak iki nokta arasindaki en kisa seyahati bulan kodlar yazilabilir. Hangi hatlara binilecegi, inilecegi gibi.. isin bu kismi ilgilenen okuyuculara odev olsun. Ustteki makalede konu hakkinda guzel detaylar var. Matematiksel olarak kombinatoryel matematik, grafik teorisi (graph theory) gibi konular isin icine giriyor. Tek transfer, iki transfer, vs. hesaplari ayri ayri yapiliyor.

Not: Durak kodlari ayni sayi ama sonunda 'A' ve 'B' gibi eklerle yolun karsilikli taraflarinda, ayni hat uzerinde ama ters yonlere gidecek sekilde konumlandirilmis olabiliyor. Bunu niye soyluyoruz? Eger bir uygulama durak ismini aratarak (mesela "levent" gibi) durak kodu almayi, ve oradan seyahat planlama yapmayi dusunuyorsa birden fazla durak koduyla is yapmaya hazir olmali.

Kodlar

Sunday, November 21, 2010

Ubuntu Server ve Matplotlib

Icinde matplotlib kutuphanesini kullanarak grafik olusturan, mesela plot() kullanan kodlar, gelistirme ortaminda yeni bir pencere acarlar ve grafigi basarlar. Ama Ubuntu Server uzerinde ayni kodlari isletiyorsak, ekran tabii ki acilamaz, ama plot() cagirmiyor olsak bile sadece matplotlib import etmek bile problemli olabiliyor. Su hata gelebilir:

server GtkWarning: could not open display

Bu mesaj ekran olmayan server ortaminda grafik olusturulamiyor demektir.

Tamir icin, Python komut satirina girin
>>> import matplotlib
>>> matplotlib.matplotlib_fname()
Son komut bir dosya ismi verecek. Bu dosyaya sudo uzerinden bir editor ile girin, ve "backend" diyen satirda GTKAgg ibaresini PDF kelimesine degistirin. Bundan sonra gorsel islemler bos gecilecek, ama hesap yapan kodlar hala isleyecek.

Kaynak

Tuesday, November 9, 2010

preview-latex

Emacs icinde tex dosyalari edit ederken, matematik formullu bolgelerinin formulu grafik olarak gostermesini istiyorsak, preview-latex modu kullanilabilir. Kurmak icin Ubuntu uzerinde sudo apt-get install preview-latex ; Bu cagri Emacs ayarlarini otomatik olarak yapar.

Emacs'i baslatinca .tex dosyasi icindeyken menude Preview secenegi gorulecektir. Ustunde oldugunuz noktayi, ya da tum dosyayi grafiklettirmek yani preview yapmak mumkun. Bir tus kombinasyonu grafik bolgeyi tekrar duz tex haline dondurebiliyor, arada hizla gidip gelinebiliyor.

Eger formuller ekran icinde ufak gozukuyorsa, imajlari buyutmenin yolu basit. Ayar dosyasi .emacs icinde

(custom-set-variables
...
'(preview-scale-function 1.2)
)

gibi bir kullanimla imajlar buyutulebilir. 1.2 formulleri "1.2 kat buyut" anlamina geliyor.


Diger ayarlar

'(preview-auto-cache-preamble nil)
'(preview-image-type (quote dvipng))

Kaynak

Wednesday, November 3, 2010

Cython

Python icinden C cagirmanin, Python kodunu C'ye cevirmenin yani daha hizli isler hale getirmenin yollarindan olan Cython'un populerligi artiyor. Bu arac ile Python icinde, Python sozdizimine benzer bir sekilde yazdiginiz kodlardan C kodu uretilmesi mumkun. Bir fark, bu kodu derlemek icin "python" cagrisi yerine "cython" cagrisi kullanmak gerekli. Bu cagri sonrasi .c dosyasi uretilecek, bu dosya gcc ile .o sonra .so dosyasina derlenecek. Elde edilen .so dosyasi artik pur Python tarafindan "import" edilebilir bir modul olacaktir.

Kurmak icin

http://cython.org/#download

Bildigimiz unzip, ve python setup.py install.

Bizim ornek kodlar bu yazinin altinda. Dosya p1.py icindeki pur Python, hemen python p1.py ile isletilebilir. c1.pyx icinde cython ile C'ye cevirilebilecek kodlar var. Bunlar "sh make.sh" ile hemen .o ve .so yapilabilir. Ardindan "python c1-main.py" ile hizlandirilmis kodlari isletmek mumkun. Zaman her iki koddan rapor edilecektir.

Alttaki baglantida konu hakkinda daha fazla ornek bulunabilir.

Dikkat: Python'a benzer kodlarin bir test.pyx icinde yazildigini varsayalim, derlenince bu kodun test.c dosyasina, ve test.so ile ayni isimdeki so kutuphanesine derlenmesi gereklidir.

Kaynak

c1.pyx

import math

def great_circle(float lon1,float lat1,float lon2,float lat2):
    cdef float radius = 3956.0
    cdef float pi = 3.14159265
    cdef float x = pi/180.0
    cdef float a,b,theta,c

    a = (90.0-lat1)*(x)
    b = (90.0-lat2)*(x)
    theta = (lon2-lon1)*(x)
    c = math.acos((math.cos(a)*math.cos(b)) + (math.sin(a)*math.sin(b)*math.cos(theta)))
    return radius*c


import timeit  

lon1, lat1, lon2, lat2 = -72.345, 34.323, -61.823, 54.826
num = 500000

t = timeit.Timer("p1.great_circle(%f,%f,%f,%f)" % (lon1,lat1,lon2,lat2),
                       "import p1")
print "Pure python function", t.timeit(num), "sec"

c1-main.py

import timeit

lon1, lat1, lon2, lat2 = -72.345, 34.323, -61.823, 54.826
num = 500000

t = timeit.Timer("c1.great_circle(%f,%f,%f,%f)" % (lon1,lat1,lon2,lat2),
                  "import c1")
print "Cython function (still using python math)", t.timeit(num), "sec"

p1.py

import math

def great_circle(lon1,lat1,lon2,lat2):
    radius = 3956 #miles
    x = math.pi/180.0

    a = (90.0-lat1)*(x)
    b = (90.0-lat2)*(x)
    theta = (lon2-lon1)*(x)
    c = math.acos((math.cos(a)*math.cos(b)) +
                  (math.sin(a)*math.sin(b)*math.cos(theta)))
    return radius*c


import timeit  

lon1, lat1, lon2, lat2 = -72.345, 34.323, -61.823, 54.826
num = 500000

t = timeit.Timer("p1.great_circle(%f,%f,%f,%f)" % (lon1,lat1,lon2,lat2),
                       "import p1")
print "Pure python function", t.timeit(num), "sec"

make.sh

cython c1.pyx
gcc -Wall  -I/usr/include/python2.7 -lpython2.7 -c c1.c
gcc -shared c1.o -o c1.so


Saturday, October 30, 2010

Dizin Karsilastirmak, Uyan Elementleri Bulmak

R dilindeki match() cagrisinin karsiligi Numpy'da nedir? Mesela:
a = c(1,2,5,4,3)
b = c(2,3)
print (match(b,a))
Bu cagrida a icinde b elementlerine uyan ogelerin 'indis' degerleri geri getirilir. Sonuc:
[1] 2 5
Python ile sunlari yapabiliriz:
import numpy as np

a = np.array([1,2,5,4,3])
b = np.array([2,3])
match = np.in1d(a, b)
Eger in1d cagrisinin 'match' sonucunu ekrana basarsak,
[False  True False False  True]
Bu dizinde 'a' icinde 'b' ile uyumun oldugu yerler 'True' digerleri 'False' ile isaretli. Simdi indis degerlerini istiyorsak, ufak bir numara ile bunu hallederiz. np.arange(0,len(a)) ile bir 'indis dizini' yaratiriz, 0,1,...,N diye gider (N = len(a)), onun uzerinde in1d()'den gelen sonucu 'filtre' olarak kullanirsak, gerekli indis degerlerini elde ederiz.
print np.arange(0,len(a))[match]
Sonuc
[1 4]
Not: Python indis baslangici olarak 0 aliyor (C gibi), R 1 aliyor, 1,4 ile 2,5 arasindaki bir fark ondan.

Friday, October 29, 2010

PyMC Yerine JAGS ve rpy

Not: MCMC icin en iyi secenek su anda A. Gelman'in Stan ve PyStan paketleri.

Python ile MCMC kodlamasi icin PyMC paketini gozden gecirdik, ne yazik ki performanstan memnun kalmadik, diger yandan WinBUGS'in arayuzu son derece kullanissiz (Windows / Wine gerektiriyor), bu sebeple surekli kullanim icin tek alternatif kaldi: Python icinden rpy2 kullanarak JAGS cagirmak.

JAGS kurulusunu isledik, bu program WinBUGS'in tamamen yerine gecmeye talip bir paket.

Tamamen Unix seviyesinde, komut satirindan calisir, iletisime gecilmesi (interfacing) temiz.

rpy2 kullanimi icin su yazimizdaki ornek koda bakilabilir, JAGS kullanimi icin su yazidaki kod faydali. JAGS WinBUGS ile ayni dosya formatini kullanmakta, yeni bir dil ogrenmeye gerek yok. Andrew Gelman'in tum ornekleri zaten bugs dilini kullaniyor, bu acidan da farklilik olmayacak. Tum rpy2, JAGS, Python orneklerinin bir arada oldugu en iyi kod parcasi surada bulunabilir.

Monday, October 11, 2010

Iki Listeyi Her Turlu Eslesmeye Gore Gezmek

Iki listeyi, bu listedeki elemanlarin her turlu eslesmesinin olusturdugu ikilileri gorerek gezmek istiyorsak itertools paketi iyi isler. Mesela a ve b listelerini soyle gezebiliriz:
import itertools

a = ['foo', 'bar', 'baz']
b = ['x', 'y', 'z', 'w']

for (r,s) in itertools.product(a, b):
print r,s
Ustteki kod su sonucu verecek:

foo x
foo y
foo z
foo w
...
baz y
baz z
baz w

Yani iki listenin her turlu kombinasyonu tek bir satirla gezilebilmis oluyor.

Saturday, October 9, 2010

Objeleri Yazip Okumak - Pickle

Python pickle servisi herhangi bir nesneyi alip dosyaya yazabilmek yetenegine sahip. Bir dictionary objemiz oldugunu dusunelim:

dict = {}
dict['a'] = 33
dict['b'] = 55

Bu nesneyi soyle dosyaya yazariz

import pickle
output = open('dict.pkl', 'wb')
pickle.dump(dict, output)

Geri okumak icin

f = open("dict.pkl")
dict= pickle.load(f)
f.close()

Friday, October 8, 2010

JAGS

Not: MCMC icin en iyi secenek Gelman'in Stan paketi.

R dilinde MCMC hesaplari yapmak icin WinBUGS'a alternatif bir paket JAGS. Once jags, sonra rjags, sonra R2jags paketlerinin kurulmasi tavsiye edilir. jags kaynaklardan kurulur, suradan.

http://www-fis.iarc.fr/~martyn/software/jags/

Bilinen ./configure, sudo make install. Geri kalan paketleri kurmak icin R komut satirindan

install.packages("rjags")
install.packages(R2jags")

Ubuntu uzerinde su hatayi gorurseniz,

libjags.so.2: cannot open shared object file: No such file or directory

O zaman sudo ldconfig ile so kutuphanelerini guncellemek yeterli.

JAGS nasil kullanilir? R icinden ornek bir kullanim Andrew Gelman'in kitabindaki radon ornegidir. Bugs icin yazilmistir ama JAGS'e gecirmek icin bugs() cagrisini jags() yapmak yeterli. Bu sebeple BUGS'dan JAGS'e gecis cok rahat. R kodu basinda
library(R2jags)
..
radon.1 <- jags (radon.data, radon.inits, radon.parameters,
"radon.1.bug", n.chains=3, n.iter=10)


Radon Ornegi

Wednesday, October 6, 2010

Deprem Verisi ve Python (Earthquake Data)

USGS sitesinden aldigimiz centennial (yuz yillik) deprem verisini biraz temizledik, onemli kolonlari sectik ve Python Numpy loadtxt ile yuklenebilecek hale getirdik. Bu veriyi ve onu okuyan ornek Python script'i ekteki zip dosyasinda bulabilirsiniz. Ornek olarak iki veri noktasini ekrana basiyoruz: 1999 Izmit ve 1906 San Fransisco depremleri. Ornek komutlar soyle:
print q[(q[:,0] == 1999) & (q[:,1] == 8) & (q[:,2] == 17)]

print q[(q[:,0] == 1906) & (q[:,1] == 4) & (q[:,2] == 18)]
English: You can find a scrubbed version of the centennial earthquake data (from USGS site) shared below. We also included a sample Python script that shows how to filter based on date. As an example we display two events, one on 1999 Turkey, the other 1906 San Fransisco.

Dosyalar

Saturday, October 2, 2010

Lme4 C Koduna Girmek

Lme4 (ya da herhangi bir R kutuphanesinin) C kodunu degistirip, bu yeni kodlari R'den islettirmek istersek, sunlari yapabiliriz:

C kodunu degistirecegimiz R kutuphanesini herhalde install.packages ile kurmusuzdur, ona tekabul eden kaynak kodlari buluruz. Versiyon no'suna bakalim; home yani ~ altinda R dizini altindaki pakete gidelim. Bizim icin bu ~/R/i486-pc-linux-gnu-library/2.11/lme4. Bu dizin altinda DESCRIPTION dosyasinda hangi versiyon oldugu yaziyordur.

Bu versiyona ait kaynak kodu Internet'ten bulup indiririz. Bu kaynakta istedigimiz degisikligi yapariz. Derlemek icin make.sh icinde sunlari yazdik:

#!/bin/sh
gcc -std=gnu99 -fPIC -g -O2 -c lmer.c -o lmer.o -I/home/burak/R/i486-pc-linux-gnu-library/2.11/Matrix/include/ -I./src -I/usr/share/R/include/
gcc -std=gnu99 -fPIC -g -O2 -c init.c -o init.o -I/home/burak/R/i486-pc-linux-gnu-library/2.11/Matrix/include/ -I./src -I/usr/share/R/include/
gcc -std=gnu99 -fPIC -g -O2 -c local_stubs.c -o local_stubs.o -I/home/burak/R/i486-pc-linux-gnu-library/2.11/Matrix/include/ -I./src -I/usr/share/R/include/
gcc -std=gnu99 -shared -o lme4.so init.o lmer.o local_stubs.o -llapack -lblas -lgfortran -lm -L/usr/lib/R/lib -lR

Kutuphane lme4.so yaratilinca bu dosyayi R altindaki so uzerine kopyalarsak, eski kod yerine bizimki islemeye baslar.

cp lme4.so ~/R/i486-pc-linux-gnu-library/2.11/lme4/libs/

Biz R kodlarini "R -f test.R" seklinde isletiyoruz, yani her cagrida yeni bir process baslatiliyor, degisen so kutuphanesi hemen bir sonraki cagrida isleme konacaktir.

Friday, September 24, 2010

Python ve Alternatif Path

Python paketleri kaynaklardan kurarken ana dizinine gidip "python setup.cfg build install" ile derleyip kurulusunu yapariz. Fakat bazen alternatif bir dizin icinde, ayni paketin ama degisik kaynak kodlari (mesela bir gelistirme branch'i) uzerinde calismamiz gerekirse, ana pakete degil, Python'un bu gelistirme yaptigimiz ikinci dizini isletmesi icin test script icinde en basta su satirlar yeterli:

import sys
sys.path.insert(0, '/benim/gelistirme/dizinim/paket')

Boylece alternatif dizin tum sys.path icindeki dizinlerden "once" gelecek, ve kurulumu yapilan degil belirttigimiz ikinci dizin isleme konacak.

Bu yontemlerden sadece biri, en cabuk ve gecici olani. Degisik yaklasimlar olabilir.

Thursday, September 23, 2010

Kitap Scan Dosyalari ve DJVU

Kitaplarin scan edilmis imaj dosyalarini sıkıstırabilen bir format DJVU. Unix uzerinde cjb2 adli komut bir dosyayi TIFF formatindan alip DJVU formatina cevirebiliyor. Sıkıstırma orani 1/8! Yani bir kitap scan dosyasini sekizde birine indirmek mumkun. Kurmak icin

djvu.sourceforge.net


adresinden kaynak kodlari indirebiliriz. Ek bazi detaylar, cjb2 komutunun siyah / beyaz bir imaj bekledigidir. O zaman "convert -monochrome .." komutu ile bu hazirligi yapabiliriz. Eger tum sayfalar TIFF ve monochrome halinde hazirsa, tek sayfayi kitaba soyle ekleriz:

cjb2 -clean /tmp/mono.tiff /tmp/book.djvu

Yani mono.tiff dosyasini book.djvu dosyasina ekliyoruz.

Bu isi otomize etmek icin; bir dizin altinda 1,2,..9 diye giden bolum (chapter) alt dizinlerinde dosyalarimiz varsa, bu alt dizinlerde scan edilmis sayfalari birlestirmek icin
import os, re, glob, sys, string;

def run_command(command):
result = []
f = os.popen(command, "r")
sys.stdout.flush()
for l in f.xreadlines():
result.append(l)
return result

run_command("convert -monochrome 1/01.tiff /tmp/mono.tiff")
run_command("cjb2 -clean /tmp/mono.tiff /tmp/book.djvu")

for a in range(9):
os.chdir(str(a+1))
for file in sorted(glob.glob("*.tiff")):
print file
run_command("convert -monochrome " + str(file) + " /tmp/mono.tiff")
run_command("cjb2 -clean /tmp/mono.tiff /tmp/page.djvu")
run_command("djvm -i /tmp/book.djvu /tmp/page.djvu")
os.chdir("..")
Bu script tmp altinda bir book.djvu dosyasini yaratmis oluyor.

Saturday, September 18, 2010

Quantile

R dilindeki quantile(x,p) fonksiyonu x verisi uzerinde p olasilik rakamlarina gore o olasiliklara tekabul eden kisimlari alip rapor eder. Mesela quantile(x, probs = c(.20, .80)) cagrisi buna bir ornek.
aa = c(1,2,3,4,5,6,7,8,9,10)
quantile(aa, probs = c(.20, .80))
20% 80%
2.8 8.2
Python uzerinde ayni isi scoreatpercentile cagrisi yapiyor.
x = numpy.array([1,2,3,4,5,6,7,8,9,10])
print stats.scoreatpercentile(x, 20)
print stats.scoreatpercentile(x, 80)
Sonuc yine 2.8 ve 8.2 olarak gelecek.

Sunday, September 12, 2010

Scikits Statsmodels

R dilinin istatistik hesaplamalarinin Python karsiliklari Scikits Statsmodels paketinde bulunabilir. Biz bu paketin kadar genel lineer modelleme ve lojistik regresyon fonksiyonlarina baktik, sonuclar iyi; benzer R kodlarindan gelen sonuclar birbiriyle uyusuyor. Github uzerinde bu eforun kodlari bulunabilir.

Statsmodels sorularli icin Google Groups -- cevaplar hizli geliyor

http://groups.google.com/group/pystatsmodels

Kodlar

https://github.com/statsmodels

Patsy icin (ile) alternatif bir kurulus yontemi

sudo pip install statsmodels
sudo pip install pasty --upgrade

Bazi ornekler icin scikits.timeseries paketi


sudo pip install pytseries

Eger docs altinda mesela "make html" ile dokumanlari urettiremediyseniz, o zaman en son ipython'u kurmak gerekebilir

sudo easy_install -U IPython

Tabii ondan once Sphinx

sudo apt-get install python-sphinx


Friday, September 10, 2010

Numpy Loadtxt ve Converter

CSV dosyasi diye bilinen bosluk, virgul, vs. ile ayrilmis satirsal, duz text bazli dosyalari Loadtxt ile yukluyoruz. Eger bu yukleme sirasinda mesela bir float olmasi gereken bir hucrede 'NA' gibi bir string bazli deger varsa, loadtxt bu degeri float yapamadigi icin sikayet edecektir. NA bilindigi gibi "deger yok" anlamina gelen "not applicable" kelimesinden geliyor; Numpy icinde buna tekabul eden bir float degeri var (Nump.nan diye erisiliyor), o zaman String gorunce bu degere donusumu bizim yapmamiz lazim.

Alttaki kod nes.dat adli bir dosyayi okur, 1. satiri atlar, ve sadece 11 ve 32. kolonlarini cekip cikartir, bu kolonlarin her ikisinde de bazen NA metni gorulurse, onu converter() fonksiyonu uzerinden numpy.nan degerine cevirir.
import numpy

def converter(x):
if x == 'NA':
return numpy.nan
else:
return float(x)

nes = numpy.loadtxt("nes.dat", skiprows=1, usecols = (11,32),
converters={11:converter, 32:converter})

Saturday, September 4, 2010

R, Matrix, lme4, sim ve Ubuntu

Andrew Gelman'in kitaplarindaki Bugs ve diger ornekleri isletebilmek icin, Ubuntu apt-get komutundan gelen R degil, daha yuksek bir versiyon gerekiyor, cunku daha alt versiyonlar Matrix kutuphanesini kuramiyorlar. En son versiyon icin R sitesine gitmek lazim

http://ftp.sunet.se/pub/lang/CRAN/bin/linux/ubuntu/

dizininde kendi Ubuntu versiyonunuzu secin (bizimki Karmic). Buradan

r-base-core_2.11.1-5karmic0_i386.deb

adli dosyayi indirip uzerine tiklayin. Bir GUI cikacak, oradan Install dugmesine tiklanir. Eger daha once R kurulmus ise, tiklamadan once eski paketi sudo apt-get remove r-base r-base-dev r-base-core .. vs ile silmek daha temiz olur.

R kurulduktan sonra R yazarak komut satirina girelim:

> install.packages("arm")
> install.packages("foreign")

yazarsak gereken tum bagimli, alt kutuphaneler otomatik olarak kurulacaktir. Matrix, lme4 paketleri bu paketlerden.. ve bu sefer R sikayet etmeyecek.

ARM Gelman hocanin kendi yazdigi kutuphanedir.

Tuesday, August 31, 2010

Imagemagick, Imaj Dosyalarini Islemek, Format Degisimi, Convert Komutu

Ubuntu Linux uzerinden formatlararasi gecis cok basit, ImageMagick kurulur,

sudo apt-get install imagemagick

Bu bize convert adli bir program veriyor. Mesela dosya.jpg dosyasini dosya.png yapmak icin

convert dosya.jpg dosya.png

Eger animasyon gif dosyasi uzerinde ayni komutu isletirsek, animasyondaki her kare ayri bir png dosyasi olarak verilirdi. Dikkat: tum imajin animasyondan cikartilmasi icin -coalesce secenegi gerekebilir.

Bu komutun pek cok ozelligi var.

Bir dosya icinden belli bir bolgeyi cikartmak icin, mesela ust sol kose referansli olmak uzere 100,100 noktasindan baslayarak sadece1000 genisliginde 600 yukseliginde bolgeyi almak icin

convert -extract 1000x600+100+000 dosya.jpg sonuc.jpg

Pek cok goruntu dosyasini ust uste birlestirmek icin (arada 20 pikselllik bosluk ile)

convert -bordercolor White -border 2x20 dosya_*.jpg -append out.jpg

Diyelim ki iki sayfasi tek bir kagitta yatay basilmis bir dokumani scan etmek istiyoruz. Scanimage ile tiff ciktilari aldiktan sonra, imaji cevirmek icin

convert -rotate 270 [dosya1.tiff] [dosya2.tiff]

270 yerine 90 da olabilir tabii, scan etme pozisyonuna gore dogrusunu secin. Eger imaj yeterince net degilse, netlestirmek (sharpening) icin su komut

convert ... -unsharp 1.5x1.2+1.0+0.10  [dosya1.tiff] [dosya2.tiff]

Rotate ve unsharp isleri tek bir satirda ayni anda yapilabilir.

Scan Edilmis Imajlari Ortadan Bolmek

Eger elinizde iki sayfasi tek bir kagida basilmis sekilde bir scan imaji varsa (bu sekilde basilmis bir kitaptan elde edilmis olabilir), bu imaji ortadan yatay olarak ikiye bolerek iki imaj elde etmenin caresi ImageMagick ile soyle:

convert dosya.tiff -crop 100%x50% +repage dosya_%d.tiff

Bu cagridan sonuc olarak dosya_00.tiff, dosya_01.tiff adinda iki imaj ortaya cikacak.

Bir video dosyasini numaralanmis goruntu dosyalarina cevirmek icin,

convert video.avi chessb-right/video%03d.png

Stackoverflow Turu Yardimci Siteler

Stackoverflow sitesinin basarisindan sonra SO kurucularinin ya da baskalarinin onu taklit ederek kurdugu siteler turemeye basladi. Bilindigi gibi SO'da sorulan sorular, o sitedeki soruyu bilebilecek kisiler tarafindan cevaplanabilmekte. Teknolojisi o kadar karmasik degil, fakat SO tasarim acisindan onemli bazi noktalari iyi yakalamis gozukuyor. Soru sormak, soru cevaplamak anonim olarak bile yapilabiliyor, dis sistemlerdeki hesabiniz ile (Google gibi) sign-in yapmaniz kolaylastirilmis. Site Google'in disaridan rahat indeksleyebilecegi sekilde hazirlanmis. Soru sorarken benzer sorular hemen size gosterilebiliyor (boylece ayni sorularin tekrarlanmasinin onune geciliyor). Soru soranlarin begendigi cevabi kabul etmesi, ve cevap verenin buna gore sitede rutbesinin yukselebilmesi mumkun; sitede pozisyonu yukselen sitede yavas yavas daha fazla admin haklarina kavusuyor, mesela.

Yeni siteler farkli konular hakkinda soru - cevap servisi verebiliyorlar. Istatistik, makina ogrenimi, matematik konulari hakkinda sorular bu sitelerde sorulabilir. Yeni siteler

stats.stackexchange.com
metaoptimize.com
mathoverflow.net
math.stackexchange.com

Wednesday, August 25, 2010

Scanimage

Ubuntu'da scanner'a erismek icin USB uzerinden scanner bilgisayara baglanir, sonra komut satirindan
scanimage -L
ile scanner'larin listesine bakilir. Sizin cihaziniz listede var ise, 2. kolonda gorulen tirnak icindeki cihaz ismini -d secenegine vererek suna benzer bir komutu isletebilirsiniz.
scanimage --mode=Gray --resolution 200 -x 200 -y 297
-d plustek:libusb:005:021 --format=tiff > image.tiff
Bu komut, gri modunda, 200 cozunurluk / detayda, eni 200, boyu 297 mm olmak uzere tiff formatinda bir imaj scan eder ve image.tiff dosyasina yazar.

Thursday, August 19, 2010

R ve BUGS

R dili istatistik hesaplamalari icin yaygin bir sekilde kullaniliyor. WinBUGS (ve genelde BUGS kutuphanesi) ise bir simulasyon teknigi olan Monte Carlo simulasyonlari icin kullanilmakta.

R kurmak icin Ubuntu uzerinde

sudo apt-get install r-base r-base-dev

yeterli. BUGS biraz daha cetrefil. WinBUGS bir Windows programi. Once wine kurariz:

sudo apt-get install wine

Sonra su sayfadan (cok dandik bir sayfa evet, bu gibi sebeplerden zaten bu ortamda gelecek gormuyoruz -asiri Windows baglantisi bir diger faktor-) WinBUGS exe dosyasi indirilir. Exe uzerinde sag click Windows kurulus secenegini gosterir. Bunlar olduktan sonra R komut satirina girin ve R ile Winbugs baglantisi kuracak install komutunu isletin:

$ R
> install.packages("R2WinBUGS")

Bu kurulum, daha sinirli isler yapabilen egitim versiyonunu kurdu. Daha sofistike isler icin tam versiyona gecmek lazim; sorun degil, herkese acik bir anahtar kurunca o da oluyor. Su adrese girin

http://www.mrc-bsu.cam.ac.uk/bugs/winbugs/WinBUGS14_immortality_key.txt

Bu dosyanin tamamini bir yere kaydedin. Sonra WINE ile Bugs'i baslatin. Open | File ile biraz once kaydettiginiz txt dosyasini yukleyin. Tools | Decode menusunu secin, sonra cikan dialog kutusunda "Decode All" dugmesine tiklayin. Kurulus tamam.

Artik hem R hem BUGS isletmeye haziriz. Normal R programlari isletmek icin normal "R -f [dosya]" kullanilir. Eger script icinde plot, vs. komutlari varsa, bunun ciktilari Rplots.pdf adli bir dosyaya yaziliyor.

BUGS isletmek icin ise su ornek kullanilabilir.

test-schools.R
library(R2WinBUGS)
model.file <- system.file(package="R2WinBUGS","model",
"schools.txt")
data(schools)
J <- nrow(schools)
y <- schools$estimate
sigma.y <- schools$sd
data <- list ("J", "y", "sigma.y")
inits <- function(){
list(theta=rnorm(J, 0, 100), mu.theta=rnorm(1, 0, 100),
sigma.theta=runif(1, 0, 100))
}
parameters <- c("theta", "mu.theta", "sigma.theta")
schools.sim <- bugs(data, inits, parameters, model.file, n.chains=3, n.iter=5000)
print(schools.sim)
plot(schools.sim)
Ornegi isletmek icin "R -f test-schools.R". Arka planda WinBUGS'in baslatip kapatildigini goreceksiniz, R oraya bilgi gecip sonucu geri aldi, vs. WinBUGS bazen kapatilmayabiliyor, o durumda manuel olarak siz kapatin, farketmez.

Kaynak

Wednesday, August 18, 2010

Bulutta Python - PiCloud

PiCloud adli servis Python kodlarimizin bulutta islemesini sagliyor. Bu servisin GAE'den farki nedir? PiCloud uzerinde daha fazla Python paketi destekleniyor. Mesela Numpy ve Scipy PiCloud uzerinde mevcut, GAE'de mevcut degil (PC bu is icin Python bilimsel hesap dunyasinda iyi bilinen Enthought ile anlasma yapmislar). PiCloud ilginc bir servis: arka planda aslinda o da Amazon EC2'yi kullaniyor. Yani bulut uzerindeki bir bulut sistemi!

PiCloud'a kendi C kodlarinizi gondermeniz de mumkun.

Monday, July 26, 2010

PDF Icinde Kelime Aramak

Linux uzerindeki PDF dosyalari icinde bir anahtar kelimeyi aramak icin soyle bir Python script kullanilabilir
import os
list = os.popen("find . -name '*.pdf'").read().split("\n")
for f in list:
f = f.replace(" ", "\\ ")
if "bu cumleyi ara" in os.popen("pdftotext " + f + " -").read():
print f
Bu script pdftotext adli bir yardimci programi cagiriyor, program yoksa kurulmasi lazim. Script, bir ust dizinden onun altindaki her alt dizine (recursive) olarak girerek aramayi yapiyor. Kelime bulunursa dosya ismi ekrana basiliyor.

Thursday, July 1, 2010

Numpy ile Text Veri Okumak

Tablo formatinda duz text dosyasi okumak istiyorsak, numpy kutuphanesinde loadtxt fonksiyonu kullanilabilir. Soyle bir dosya oldugunu farzedelim:
Website hits from May 23 to June 22  
Day    Count
Sat    7
Sun    12
Mon    20
Tues    30

Bu dosyanin ilk iki satirini okumak istemeyiz, o kisim baslik (header) kismi. Onlari atlamak, sol kolonu string, sag kolonu integer tipinde alip, tamamini tek bir Numpy matrisi icine atmak istiyorsak, komut soyle:

import numpy

type = numpy.dtype([('column1', 'S10'),
                   ('column2', 'uint32')])
fin = numpy.loadtxt("veri.txt",  dtype=type, skiprows=2)
 
Mumkun diger bazi ornekler 
 
dtype=[('first_channel', 'S10'), 
                         ('returning_customer', 'S10'), 
                         ('order_month', 'i8'),
                         ('order_year', 'i8'),
                         ('payment','S10'),
                         ('amount','f8'),
                         ('order_count','i8'),
                         ('total_amount','f8'),
                         ('order_zip','S10'),
                         ('restaurant_zip','S10'),
                         ('referrer','S100'),
                         ('channel','S10'),
                         ('front_end','S4'),
                         ('commision','f8'),
                         ('coupon_code','S20'),
                         ('campaign_description','S200'),
                         ('preorder','S5'),
                         ('season','S10'),
                         ('did_not_come_back_past_6_months','S1')
                         ]

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.

Friday, May 28, 2010

JTPD Semineri

28 Mayis 2010 tarihli "Bulut, Mobil, NoSQL, HTML5" seminerimizin prezentasyonunu suradan indirebilisiniz.

JTPD

Sunday, May 9, 2010

Sirketlerin 'Bulut'una Karsi Diaspora

Gittikce daha fazla yazilimin buluta (Amazon EC2, Google App Engine) ve sosyal iletisim bilgisinin sosyal ag sirketlerine (Facebook, Twitter) kaymaya baslamasi ile birlikte, kisisel verilerin, yazilimin kime ait, kimin kontrolu altinda oldugu konusu tartisilmaya baslandi. Facebook'un ikidebir degisen gizlilik politikalari bu tartismalara yakit veriyor.

Bu konuya yeni bir yaklasim Diaspora adli yazilimi ortaya cikartti. Yazilimin ruhu aslinda Bittorrent, Tor mentalitesiyle benzesiyor (hatta ileride Diaspora'nin bu hizmetleri kapsayabilecegi de soylenmekte); eger Internet'in temeli daginik yapida olmasi ise, o zaman herkes -kendimize basta olmak uzere- sosyal ag hizmeti, herkes web hizmeti, herkes e-mail hizmeti, herkes veri depolama hizmeti veremez mi?

Daha detaylandiracak olursak; Facebook ornegini ele alalim. Diaspora bu hizmeti soyle halledecek. 1) Herkes bir Diaspora aginda hem kullanici hem servis isini gorecek, yani bilgisayarinizda bir servis, bir kullanici programi isliyor olacak 2) kisisel veriler kullanicinin kendi bilgisayarinda tutulacak, kullanici istedigi kadar kisisel bilgiyi istedigi sekilde disari acacak. 3) Diaspora protokolu kisisel veriyi yakinindaki diger makinalara -sifrelenmis halde tabii- yedekleme amacli kopyalayabilecek 4) iletisim olabildigi olcude birebir makinalar arasinda halledilecek.

Bu durumda, bir Web sitesi isletmek te kendi bilgisayarinizda Web sayfalari bir yerlere koymak kadar basit bir islem olabilir. Diaspora her turlu hizmeti dis dunyaya acabilecegi icin, bu sayfalarin Web uzerinden iletisimi de bu "koca bulutun" icinde halledilecektir. Peki insanlar bu bulutu performans amacli istismar edebilir mi? Bunun onune bant genisligi baglaminda "verdiginden fazlasini alamayacagini" garanti eden basit kontroller halledebilir. Donanim zaten o kadar ucuzlasti ki, insanlar kendi satin aldiklari ufak bilgisayarlari evinde Diaspora network'une dahil ederek islem kapasitelerini arttirabilirler. Diger yandan istismar edilemeyecek statik sayfalar, kullanim durumuna gore -cok erisilenler icin mesela- diger Diaspora makinalarina kopyalanarak, satha yayilarak erisimleri daha da hizlandirilabilir. Su anda Akamai, Dropbox gibi sirketlerin verdigi hizmetin bir benzerinden bahsediyoruz.

Email gibi bir servis, zaten noktadan noktaya oldugu icin Diaspora bunu halleder. Hedef noktadaki makina acik degilse, cografi olarak ona yakin olan Diaspora makinalarinda gecici olarak mesajlar -sifrelenmis olarak- bekletilebilir. Yani Internet'in iletisim paketleri icin cok alt seviyede yaptiginin benzeri, daha ust seviyedeki iletisim protokolleri icin, benzer bir sekilde halledilebilir. Bu Internet'in ruhuna uygundur.

Olasi bir Diaspora network'un gucu tabii ki kullanici sayisiyla orantili olacak. Fakat simdiden boyle bir agi kullanmanin avantaji var. Diaspora ilk surumu cikartti, bu surumda tum sosyal aglardaki hesaplariniza baglanip, mesajlarinizi toplayip, eklemenizi saglayabiliyor. Boyle bir ucuncu parti entegrasyonu, partiler arasi gecisi de kolaylastiriyor - Flickr'a bir resim eklemeniz, Twitter hesabinizda bir baglanti paylasilmasini saglayabiliyor mesela.

Yazinin basinda bahsettigimiz Tor servisi, benzer sekilde, Diaspora icinde halledilebilir. Cin gibi yasakci ulkelerin erisim kontrolleri Diaspora uzerinden delinebilir. Su anda bu Tor ile de yapiliyor, fakat Diaspora daha fazla ek hizmet verecegi icin, daha fazla kullaniciya sahip olacaktir, ve daha fazla kullanici daha guclu bir ag demektir, bu yasakci kontrollerin delinmesini kolaylastirir. Zaten yapilan is yazilim seviyesinde benzer oldugu icin ayni protokol uzerinden bu hizmetin de verilmesi mantikli olur.

Yani gelecekte, su anda bilgisayara bir isletim sistemi kurdugumuz gibi, bilgisayari alir almaz bir Diaspora sistemi de kuruyor olabiliriz - boyle bilgisayarlari kurulu halde aliyor da olabiliriz.

Ilginc bir sekilde Diaspora aslinda Tim O'Reilly'nin bahsettigi Internet Isletim Sistemi'nin ta kendisi. O'Reilly bir PC isletim sisteminin o makinanin ic kaynaklarini idare etmekte oldugundan hareketle, su anda bulutta gozukmeye baslayan hizmetlerin / kaynaklarin boyle bir kontrolor sisteme ihtiyaci oldugunu ileri surmekteydi. Fakat o, bu isletim sisteminin tek bir sirket tarafindan yukaridan asagiya entegre olmus sekilde ortaya cikarilabilecegini one suruyordu. Diaspora bu isi daginik bir sekilde halletmenin yolu olabilir. Ayrica Diaspora'nin yaygin oldugu bir dunyada IOS tek bir sirkete ait olmayacaktir. Bulut hic kimsedir, ayni anda bulut herkesdir.

Bu cozum su anda bulut servislerinin musterisi olan sirketler icin tercih edilir olabilir; cunku verilerini kendi bilgisayarlarinda depolamaya devam ediyor olacaklar. "Baskasinin" makinasina kopyalamalari gerekmeyecek.

Peki boyle bir ekosistem icinde inovasyon olabilir mi? Mesela Google App Engine benzeri bir servis, olasi bir Diaspora aginda cikabilir miydi? Buna cevap cok basit. Su an bulut servisleri veren sirketler de zaten ayni temel yazilimlari kullaniyorlar. App Engine icinde Python, Django, Linux gibi yazilimlar var. Bu yazilimlari herkes kendi bilgisayarinda isletebilir / zaten isletiyor. Diaspora sadece, bu ornek baglaminda, port 80 erisiminizin guvenli bir sekilde dis dunya ile paylasilmasini kolaylastiracak.

Sistemin bir dezavantaji su olabilir: verinin ayni yerde olmasi sayesinde verilebilecek ek hizmetlerin verilebilmesi zorlasabilir. Mesela LinkedIn herkesin is gecmisiyle alakali verileri bir yerde depolayabildigi icin bazi ek hizmetleri verebiliyor. O veri uzerinde veri madenciligi (data mining) algoritmalari isleterek bazi iyilestirmeler yapabiliyor, bazi ek mesajlar gonderebiliyor, vs. Bu tur hizmetleri verisi esasen daginik sekilde olan bir Diaspora aginda vermek ne kadar kolay olur? Imkansiz degil muhakkak, fakat dusunulmesi gereken konular. Belki de LinkedIn gibi bir sirket Diaspora aginda insanlarin is gecmisi ile alakali acik verinin 'musterisi' haline gelebilir, ve bu veriyi gezerek, kendi uc noktasinda toplayarak istedigi ek servisleri verebilir. Bu durumda isteyen herkes bir LinkedIn olabilir, en azindan "is gecmisleri hakkinda" veri tekeli LinkedIn elinde olmaz.

Internet reklamciligi bile Diaspora uzerinden mumkun olabilir. Zaten su anda tek bir reklam idarecisi yerine (mesela Adsense) pek cok idareciyi birlestiren reklam aglari (ad network) daha iyi islemekte. Tek bir idareciye bagli sayfalarin reklam icerikleri her zaman dolmayabiliyor (fill rate denen durum) fakat Mobclix denen bir sirket pek cok idareciyi birlestirerek yuzde 100 doluluk orani garanti edebiliyor. Bu durumda esas olarak "herkesi" temsil eden bir ag sistemi olarak Diaspora ayni sekilde optimal reklam servisini sagliyor olabilir. Diaspora'nin icinden ciktigi serbest yazilimin hep para kazanmaya ve ticarete karsi oldugu dusunulur, fakat Richard Stallman'in kendisi dahil boyle bir anti-ticaret durusun kulturun cikis noktasiyla alakasi yoktur.

Kaynak

Saturday, May 8, 2010

Ajax ve Geri Don Dugmesi

Pur Ajax bazli bir uygulamayi dusunelim: bu uygulama tamamen Javascript bazli olarak servis bilgilerine gore sayfada dinamik bazi degisiklikler yapacaktir. Bir sayfadan digerine gecis yine pur HTML bazli olur, a href=.. uzerinden gidilecek dosya ismi verilir, o dosya yeri geldiginde kendi Javascript cagrilarini yapar, vs.

Bir problem tarayicida "geri git" dugmesi kullanildiginda cikabilir. Ornek olarak, form bilgilerinin oldugu bir sayfada, bu form bilgilerin alinip bir tiklama/aksiyon sonrasi ayni sayfada dinamik icerik uretildigini dusunelim, sonra a href=.. ile tiklanarak baska bir sayfaya ziplanildigini farzedelim. Bu noktada "geri" dugmesi tiklandiginda o sayfanin ilk 'ic aksiyonu' hatirlanmayacak, ve o sayfa ilk yuklendigi andaki icerigi ile gelecektir (buyuk bir ihtimalle bos olarak). Bu kullanicilar tarafindan 'geri' dugmesinin isleyinden beklenen bir sey degildir.

Sayfanin en son halini 'hatirlamak' icin pek cok teknik, yardimci kutuphane var. Bu kavram literaturde 'derin baglantilamak (deep linking)' olarak geciyor, Facebook bu konuda ozellikle basarili. Yardimci kutuphanelerden jQuery kullananlar icin jQuery Adress diye bir cozum var.

Ek kutuphane olmadan kendimizin kodlayabilecegi bir cozum olarak hash tag ('#' isareti) kullanimi mumkun. Bu tag genelde, statik html icinde belli bir bolgeye ziplamak icin kullanilir, Javascript ile beraber a href='#' seklinde bos kullanimi da gelistiricilere tanidik gelebilir.

Ajax cagrisi yaptigimiz noktada cagri basariyla geri donerse hemen o noktada sayfayi dinamik olarak tekrar uretmeye yetecek kadar veriyi kodlayip window.location.hash degiskeninde depolayabiliriz. Buraya depoladigimiz her deger www.vs.com/sayfa.html#veri1veri2.. olarak URL icinde gozukecek (tabii parametreleri bir ayirac -delimeter- ile ayirmak iyi olabilir). Sonra, o sayfaya 'geri donuldugunde' ve/yani sayfa ilk yuklendigi zaman ilk yaptigimiz is bu hash tag degerini bir kontrol etmek olur. Eger orada bir deger varsa, degeri alip icerik uretmek icin gerekli diger cagrilari yapariz. Kod suna benzer:

if (window.location.hash.indexOf(":") > -1) {
str = window.location.hash;
...
}

Bu kod sayfa 'body' seviyesinde, sayfa her yuklendiginde isleyecek sekilde konumlandirilmali.

Boylece geri dugmesi icerigi hatirlayabilmis olur.

Friday, April 30, 2010

Internet Isletim Sistemi

Ilginc gelismeler oluyor. HP, Palm sirketini satin aldi; bu alim servis tarafinda guclu olan bir sirketin kullaniciya (consumer) donuk bir telefon sirketini satin almasi anlamina geliyor ayni zamanda. Bu son haber, "etrafi citle cevrilmis bahce (walled garden)" kavramina dogru bir gidisati da ispatliyor sanki. Google, Android musteri (client) sistemlerin kendi App Engine (bulut) servis tarafi sistemlerinden olusan bir "bahceyi" tesvik ederken, Apple iPhone/iPad ve su anda yatirimini yaptigi kendi servis tarafi hizmetleri ile birlesmesini arzulayacak gibi. HP / Palm bu yonde bir gelisme olarak algilandi. O'Reilly yayinciligin duayeni Tim O'Reilly'ye gore, isler bir Internet Isletim Sistemi'ne dogru gidiyor.

http://oreil.ly/cyFhMZ
http://oreil.ly/amhozs

Bunlara paralel olarak son kullaniciya donuk program gelistirenler "hangi tarafa kayalim?" sorusu ile karsi karsiya. Ya da kayarsak, "o platformu nasil kodlayalim?"

Bizim durusumuz telefon uzerinde gitgide HTML/CSS/Javascript bazli teknolojilere dogru. Servis tarafinda Google servislerine yakin duruyoruz, cunku App Engine, ozellikle Python uzerinden, esnek servisler sunuyor. Telefon tarafinda Objective-C Cocoa islerine girmeyecegimizi iyi biliyoruz, ve Apple'in App Store'unun bazen 5 haftayi bulan kontrol sistemi bir acik yazilimci icin uygun degil. Kurumsal kodlayicilar icin de Android / GAE cekici olacaktir.

Bulut'a dogru gidisi cok iyi anlatan su yazilar guzel.

http://bit.ly/aTkdpM
http://bit.ly/bxOePm

Kapismanin alanini tarif eden "mobil platform artik yeni masaustu" sozu uygun herhalde. Bir zamanlar masaustu icin Windows, Mac arasindaki savasin degisik bir versiyonu oynaniyor, ve su anda masaustu (ve dizustu) hizla kar elde edilemeyecek, ucuzluk (commodity) klasmanina dogru kayiyor, ve savas kullanicilari kendi ekosistemine kapatarak, o ekosistem icindeki para akisi uzerinden kar etmeye calismak gibi gozukuyor. Apple iTunes ve App Store ile insanlari kolayca sarki, uygulama satin almaya alistirdi. Apple 100+ milyon insanin kredi kart bilgisini elinde tutuyor. Bu servisi fiziksel seyleri satmaya yoneltebilecegi konusulmakta... Google reklam, arama servislerini Android uzerinden diger servislere genisletebilme potansiyelini barindiriyor. HP, son haberlere gore, eldeki varini yogunu cok buyuk risklere girerek telefon / bulut alanina yatirmaya karar verdi. Microsoft surpriz olabilir, ama buyuk bir ihtimalle pek anlamadigi bu alanda var olamayacak. Ilginc gelismeler. Su yazi da faydali:

http://bit.ly/9ZJ8Fq

Wednesday, April 28, 2010

Tor

Tor programi, o programi isleten digerlerinin bilgisayarlarini Internet uzerinden birlestirererek "guvenli" bir alternatif iletisim agi olusturur. Isyerinizde belli bir site blok edilmis ise, Tor ile bir "sanal aga" baglanip disari "cikarak" o istediginiz siteye baglanabilirsiniz. Tabii sizin diger bilgisayarlari kullandigi gibi, baskalari da sizin bilgisayarinizi diger noktalara erismek icin kullaniyor olabilir - performans acisindan bunu da belirtelim. Yani surekli Tor isletmek bilgisayar performansinizda negatif bir etkiye sebep olabilir.

Ubuntu uzerinde Tor kurmak icin

sudo apt-get install tor
sudo apt-get install privoxy

komutlari yeterli.

Not: Ubuntu 9.10 Tor kurulumu icin surayi takip etmek lazim cunku bu durumda normal apt-get islemiyor: /etc/apt/sources.list dosyasi icinde
deb     http://deb.torproject.org/torproject.org karmic main
satirlari en sona eklenir ve
gpg --keyserver keys.gnupg.net --recv 886DDD89
gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | sudo apt-key add -
isletilir, sonra
apt-get update
apt-get install tor tor-geoipdb
Privoxy icin sudo nano /etc/privoxy/config ile dosyayi edit edin, ve icerik olarak

forward-socks4a / localhost:9050 .

ekleyin. Baslatmak icin

sudo /etc/init.d/tor start
sudo /etc/init.d/privoxy start

Sonra Firefox 3.0 uzerinde TorButton adli eklentiyi kurun.

YouTube video'larini ve flash icerik gorebilmek icin: Bu eklenti kurulduktan sonra Firefox sag alt kosede Tor statusunu gosteren bir isaret cikacak. Bu isaret uzerinde mouse sag dugme click yaparak "preferences" secenegine girin. Security Preferences tab'inden "disable plugins during Tor usage" secenegini de-aktive edin.

Simdi mouse sol click ile Tor Disabled yazisi uzerine tiklayin, bu yazi "Tor Enabled" gibi yesil bir yaziya donusecek. Bu kadar. Artik istediginiz siteye baglanabilirsiniz.

Kaynaklar

https://help.ubuntu.com/community/Tor?action=show&redirect=TOR

http://support.mozilla.com/tiki-view_forum_thread.php?locale=fi&comments_parentId=82766&forumId=1

Friday, April 16, 2010

HTML -> Ajax -> AppEngine

Akilli telefonlar icin mobil kod gelistirilmesinde bir alternatif daha sekillenmeye basliyor. iPhone dunyasinda AppStore uygulama deposuna giren programlarin bazen cok uzun suren kabul surecinden gecmesi, programcilari alternatif yollar aramaya itti. Diger yandan ayni kodla birden fazla marka telefon uzerinde program isletebilmek ozelligi aranir oldu, ve isletilen programin surum yapilir yapilmaz devreye sokulabilmesi istegi, aynen masaustu ortaminda oldugu gibi tekrar Web'den servis edilen HTML secenegini gundeme getirdi. Bu sekilde, hicbir kabul surecinden gecmeden, bir URL uzerinden uygulama HTML olarak servis edilebilmis olacakti. Ayrica HTML'in bir sonraki surumu HTML5 mobil icin faydali ozellikler sunuyor; lokasyon verisini saglayabilme, Net'e baglantisiz (offline) calisabilme, tarayici uzerinde lokal veri depolayabilme gibi servisleri var. Hem Android, hem iPhone baglaminda, HTML secenegiyle gorsel kodlama icin yeni bir dil (API) ogrenmeye gerek kalmayacak, piyasada yaygin bir HTML / CSS / Javascript tecrubesi mevcut.

Bu durum telefon uzerinde Java kodlamasi acisindan biraz kotu haber olabilir: Su anda Android dahil olmak uzere mobil kodlama icin HTML5 + Servis Kodlarinin Java icermesi gerekmiyor. Illa Android Market'ten indirilebilecek bir uygulama istense dahi, bu tek class'lik bir Java kodu olabilir; program baslar baslamaz WebView.loadUrl cagrisini yapar ve aradan cekilir.

Biz de bu secenegi takip edecegiz; teknoloji yelpazesindeki son durum, telefon uzerinde HTML5, CSS / Javascript kodlarinin Ajax uzerinden Google App Engine Python servis kodlarina baglanip bilgi alip verdigi bir ortam olacak.

Basit bir ornek ile baslayalim: Bir test.html sayfasi, yuklenir yuklenmez bir GAE servisine baglanip, HTTP GET uzerinden bilgi alacak, ve bunu Javascript uzerinden Document objesiyle HTML icine yazacak. Javascript ile Ajax cagrisi yapmanin en basit yolu bir Javascript kutuphanesi kullanmak. Prototype kutuphanesi ile bu is cok basit. prototype.js dosyasini indirip /files/ altina koyuyoruz.
<html>
<head>
</head>
<body>
<script type="text/javascript" src="/files/prototype.js"></script>
<script type="text/javascript">
new Ajax.Request( 'http://localhost:8080/test', {
method: 'get',
parameters: { 'test': 'value1'},
onSuccess: function(response){
document.getElementById("test").innerHTML = response.responseText
},
onFailure: function(){
alert('ERROR');
}
});
</script>
<h3>
<div id="test">
</div>
</h3>

</body>

</html>
Bu servisin baglandigi Python kodlarina gelelim:
# main.py
#
import cgi
import logging
import wsgiref.handlers
from google.appengine.ext import webapp
from testpage import *

logging.getLogger().setLevel(logging.DEBUG)

application = webapp.WSGIApplication([
('/test', Test),
], debug=True)

def main():
wsgiref.handlers.CGIHandler().run(application)

if __name__ == '__main__':
main()

# testpage.py
#
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template

class Test(webapp.RequestHandler):

def get(self):
tt = self.request.get('test')
self.response.out.write(str(tt)+",")
self.response.out.write("item1,")
self.response.out.write("item2,")
self.response.out.write("item3")
Uygulamayi ayarlamak icin app.yaml dosyasi soyle olacak:
application: testapp
version: 1
runtime: python
api_version: 1

handlers:
- url: /files
static_dir: files
- url: .*
script: main.py
Simdi GAE gelistirme servisini dev_appserver.py ile baslatalim, ve http://localhost:8080/files/test.html adresini ziyaret edelim. HTML icinde Ajax ile GET cagrisi yaparken URL uzerinden 'test' adli parametreyle servise 'value1' degeri gonderdik, bu deger ve onun yaninda diger bazi degerler geri gonderilecek. Tum bu degerlerin ekranda basildigini gorecegiz; Javascript bunu bos biraktigimiz 'div' icinde innerHTML'e degerleri gecerek yapacak.

Not: HTML icinde gorulen http://localhost:8080/test referansi anlatim kolayligi icin kullanildi, aslinda tum URL yerine sadece /test kullanmak ta yeterli. Hatta gelistirme, sonuc ortami arasinda rahat gidip gelebilmek icin boyle yapmak daha mantikli.