Thursday, April 14, 2011

Sosyal Kodlama = Github

Twitter, Facebook gibi sitelerin etkisiyle yeni Web uygulamalarindan artik "sosyal ozellikler" bulundurmasi bekleniyor. Sirketler yazdiklari uygulamalara "sosyal icerik" eklemek istiyorlar. Github bu akima dahil ve programcilar icin sosyal kaynak kod kontrolu olarak nitelenebilecek bir noktada.

Sosyal ozellikler, kod idaresi ve acik yazilim dunyasi icin aslinda bicilmis kaftan. Yazilimi acanlar baskalarinin takip etmesi icin kodlarini aciyorlar. Yani kod idaresini "sosyal" hale getiren bir site camianin ruhuna tamamen uygun.

Ek olarak Github'in temelinde kod idare sistemi Git var. Git'den daha once bahsettik; Linus Torvalds tarafindan yazilmistir, ve CVS, ClearCase (allah korusun) PVCS gibi sistemlerden bir adim otesini temsil etmektedir. Bu alanda Bazaar, Mercurial gibi sistemler de var.

Github'a donelim: site sosyal ozellikleri otesinde kullanim, gorsel acisindan da daha sukseli, ve rahat bir havada. Sourceforge artik daha kaba / agir (clunky) bir hale dustu. Biz bu siteyi kullanmiyoruz. Git yapisinin kuvvetleri dogal olarak Github'a yansiyor. Git ile calisirken bir projeyi "klonlarsiniz" ve bir anlamda kendi ozel kod deponuza sahip olursunuz. Bu klonlama islemi Github altinda tek bir dugme tiklamasi ile gerceklesiyor. Bunun ustune Twitter'vari "izleme (watch)" operasyonu var; Kendi sayfaniza girdiginizde "izlediginiz" acik yazilim projelerinin yaptiklari commit operasyonlarini mesaj olarak goruyorsunuz. Sizden klonlama yapan bir kisi sizden "birlestirme istegi" talep edebiliyor, yine tek bir tiklama ile, vs.

Github her turlu Git operasyonunu destekler, eger ssh id_rsa.pub gibi acik anahtarinizi Admin secenekleri uzerinden hesabiniza eklerseniz, git push yaparken sifre bile sorulmayacaktir. Not: Bunun islemesi icin depoyu bastan https uzerinden degil git@github diye baslayan adresten klonlamis olmaniz gerekir.

$.getJSON Hata Durumlari

Javascript kodu icinde eger servis tarafina soyle bir $.getJSON Ajax cagrisi yaptik diyelim:
$.getJSON('/bizim/url', {'param1': param1},
function(data){
...
});
Eger bu fonksiyon normal sekilde geri donerse isleyis "function(data)" icine dusecektir. Ama hata dondururse ne yapariz? O zaman finally mantigina benzer bir kullanim gerekli:
$.getJSON('/bizim/url', {'param1': param1},
function(data){
...
}).complete(function() { /* temizlik islemleri */ });
Dikkat: Ajax cagrilari yaparken, cagri dondukten sonra hemen bir sonraki Javascript kodunun "sirasiyla" isleyecegini farz etmeyelim. Ajax asenkron olarak isler, ve cagri sonrasi, cagri geri donmeden bile, bir sonraki Javascript kodu isleme konabilir.

jQuery ve Radyo Dugme Gruplari

Radyo dugmeleri icinden sadece biri isaretlenebilecek secenekler icin kullanilir. Fakat ayni sayfa uzerinde birden fazla grup istersek, mesela secmeli bir sinav sayfasi icin diyelim, o zaman radyo dugme gruplari kullaniriz. HTML ile:
<div>
..
<p>
<input type="radio" name="group0" value="1"/>
<input type="radio" name="group0" value="2"/>
<input type="radio" name="group0" value="3"/>
</p>
</div>

<div>
...
<p>
<input type="radio" name="group1" value="1"/>
<input type="radio" name="group1" value="2"/>
<input type="radio" name="group1" value="3"/>
</p>
</div>
Gruplari birbirinden ayirmak icin "name" icin her grupta degisik olacak bir isim vermek yeterli.

Peki jQuery ile bu secenekleri nasil okuruz? Soyle:
for (var i=0;i<[GRUP SAYISI];i++){
res = $("input[name='group"+i+"']:checked").val();
...
}
Dongu icinde tum gruplar gezilecek, ve her grubun secilmis dugmesinin degeri "res" icine atanacak.

Deger atamasi nasil yapilir?
$('input[name=group1]:eq(2)').attr('checked', 'checked');
Bu kodla 'group1' dugme grubunde '2' no'lu dugmeyi seciyoruz.

Monday, April 4, 2011

Sympy

Python'da sembolik matematik, cebirsel manipulasyon gibi pek cok yararli islem icin bir paket: Sympy. Kurmak icin suradan paket indirilir, ve klasik sekilde kurulur.

Basit bir test icin x**2 (x kare 2) fonksiyonunun turevini alalim:
from sympy import *

x = Symbol('x')
f = x**2
pprint (diff(f, x))
Sonuc beklenecegi sekilde 2x gelecektir. Turev almak diff komutu uzerinden, hangi degiskene gore turev alinacagi bu fonksiyona ikinci parametre ile bildiriliyor. pprint, "pretty print"'ten geliyor ve "guzel baski" demek, text ortaminda olabildigince "grafikimsi" bir baski yap anlaminda. 2x gibi ufak bir formulde pek fark gorulmeyebilir, ama daha cetrefil formullerde guzel baski farkini gosterecektir (altta gorulecegi gibi).

Daha sofistike bir ornek icin Isi Denklemini kullanalim. Bu denklem bir kismi diferansiyel (partial differential equation) denklemidir.


Bu denklemin cozumlerinden biri altta verilmistir (kismi diferansiyel denklemlerde cozum bir foksiyon bulmak demektir, ve birden fazla fonksiyon cozum olabilir)


Peki bu son denklemin Isi Denklemi icin cozum olup olmadigini kontrol etmek istesek ne yapardik? Ustteki u(t,x) formulunun bir t'ye gore kismi turevini (isi denkleminin sol tarafi), sonra x'e gore iki kez parcali turevini alip (isi denkleminin sag tarafi) sonuclarin birbiriyle esit olup olmadigina bakabiliriz. u(t,x) turevlerini manuel olarak ta yapabiliriz, ama biz ornek olmasi icin Sympy kullanalim.
from sympy import *
x = Symbol('x')
t = Symbol('t')
u = (exp((-x**2)/(4*t)) / 2*sqrt(pi*t))
pprint (diff(u, t))
pprint (diff(diff(u, x),x))
Sonuc olarak
        2               2
-x -x
─── ───
⎽⎽⎽ 4⋅t ⎽⎽⎽ 2 4⋅t
╲╱ π ⋅ℯ ╲╱ π ⋅x ⋅ℯ
────────── + ─────────────
⎽⎽⎽ 3/2
4⋅╲╱ t 8⋅t

formulunun iki kere arka arkaya basildigini gorecegiz, yani formulun iki tarafi birbirine esit cikiyor. Demek ki u(t,x) hakikaten bir cozumdur.

Entegrasyon
from sympy import *

x = Symbol('x')
q = Symbol('q')
I = Symbol('I')
f = 1/(I*x-q)
pprint (integrate(f, x))
Bu ornekte q,I sabit degerlerdi, onlari da sembol olarak tanimladik. Sonuc:
log(I⋅x - q)
────────────
I