29 Şubat 2012 Çarşamba

Haskell'de Listeler - 1

Haskell'de en önemli veri tiplerinden birisi Listelerdir (List).Gerek kullanım biçimi gerekse listelere uygun fonksiyonlar bizi Listeler için Haskell'e yöneltir.Listelere örnekler :
[1,2,3]       ['a','b']         [ ]
Gördüğümüz gibi birinci örnekte int listi ikincisinde karakter listi üçüncüsünde ise boş list örneği verdik.listeler homojen olmak zorundadır.ya hepsi karakter ya hepsi int örneğin.Listeler köşeli parantezlerle sınırlandırılır.karakter listeleri onunla eşleşen stringe eşittir mesela compilera

Prelude>"vay" == ['v','a','y']
True
doğru döndü.demekki "vay"=['v','a','y'] doğru bir önerme.
örneklerimizde kullanacağımız let kelimesini anlatalım.let bir değişkene geçici olarak bir değer atar.
mesela let a=[1,2,4,5] dedik sonra terminale a yazarsak bize [1,2,4,5] döner.
Prelude> let a=[1,2,3,4]
Prelude> a
[1,2,3,4]
Şimdi gelelim fonksiyonlara burada kısa açıklama ve gösterimlerle anlatmaya çalışalım ancak "vay" == ['v','a','y'] unutmayın :) örnekler açıklamaların altında


++ : iki listeyi birbirine yapıştırır. (aynı türden olacaklar)
Prelude> "haskell"++" "++"programlama"
"haskell programlama"
Prelude> [1,2,3]++[1,3]
[1,2,3,1,3]
: (iki nokta üst üste) bir elemanla bir listeyi yapıştırır 
Prelude> 'a' : "kin"
"akin"
Prelude> 'a':'a':[ ]
"aa"
[liste] !! numara : listenin numaraıncı elemanını döner.
Prelude> [1,2,4] !! 2
4
liste içinde liste örneği : b = [[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3]] (listenin elemanı liste örnek aşağıda)
 Prelude> let b = [[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3]]
Prelude> b
[[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3]]
Prelude> b !! 2
[1,2,2,3,4]
Listeler sözlük sıralamasındadır 
 Prelude> ['a'] >['b','c']
False
head [liste] : listenin başındaki bir elemanı döner
 tail [liste] : listenin başındaki bir eleman hariç diğer elemanları döner.
last [liste] : listenin son bir elemanını döner
init [liste] : listenin son bir elemanı hariç diğer elemanları döner.
Prelude> head [1,2,3,4]
1
Prelude> tail [1,2,3,4]
[2,3,4]
Prelude> last [1,2,3]
3
Bu son 4 fonksiyon bir liste alır (boş olmayacak).İlk yazımızda da belirtiğimiz üzere parantez yok.terminalde kullandığımız fonksiyonları .hs uzantılı dosyamızda da kullanabiliriz sorun olmayacaktır.Burada let'i kullanmamın sebebi şu an .hs dosyasıyla uğraşmadan hızlıca terminalde işleri halletmektir :)
reverse [liste] : listeyi ters çevirir 
take numara [liste] : listenin 0'dan başlayarak ilk numaraya kadar olan elemanlarını döner.
drop numara [liste] ise listenin 0'dan başlayarak ilk numaraya kadar olan elemanlarını düşürür diğerlerini döner.
Prelude> reverse [1,2,3]
[3,2,1]
Prelude> take 3 [1,2,3]
[1,2,3]
maximum [liste] : listenin maximum elemanını döner , minimum [liste] minimum , sum [liste] ise ,eğer sayı listesiyse , toplamlarını döner.
Örnek verilmemiş ve yazılmamış diğer fonksiyonları kendiniz deneyebilirsiniz :) 

haskell sembolü



Haskell'e giriş

Haskell fonksiyonel bir programlama dilidir.Fonksiyonel programlama dilleri bazı durumlarda çok pratik olabilirler ancak piyasada fazla kullanılmazlar.Ancak bir programcı fonksiyonel programlama dillerinden aldığı zevki ve deneyimi başka yerde bulamaz diye düşünüyorum.
Piyasada kullanılmaz desem de işte bir mario oyunundaki kullanımı :
,

Öncelikle sadece Haskell için değil bütün programlama dillerinde program yazabilmemiz için ihtiyacımız olan en temel 2 şey vardır : metin düzenleyici ve derleyiciler(compiler).Ben Notepad++ 'ı kullanıyorum metin düzenleyici olarak..Her programlama dilinin kendine has bir compiler'ı vardır.Haskell için olan compiler'ı (GHC)  Buradan indirebilirsiniz.
Haskell'in yüklenip yüklenmediğini terminali açıp 'ghci' komudunu yazarak öğrenebiliriz.Başarıyla prelude> komut beklemeye başladıysa herşey tamamdır.Hata alıyorsak bir daha yüklemeyi deneyebiliriz.
Windows 7'de terminali arama bölümüne cmd yazarak,Linux'da ise Accessories  başlığı altında bulabiliriz. 
Derleyicimizi şimdi test etmeye başlayabiliriz :

C:\Users\user>ghci
GHCi, version 7.0.4: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Prelude> 1+1
2
Prelude> 3*2
6
Prelude> true&&false

<interactive>:1:1: Not in scope: `true'

<interactive>:1:7: Not in scope: `false'
Prelude> True&&False
False
Prelude>
Gördüğümüz gibi başarılı bir girişin ardından normal işlemlerimizi compiler'a yaptırmaya başladık.1+1'i bize 2 olarak döndü sorun yok gibi gözüküyor.Ancak farkettiyseniz  true&&false 'da hata verdi.Çünkü :
Haskell'de fonksiyon ve değişken isimleri küçük ve büyük harfe duyarlıdır.Ayrıca bir fonksiyon ismi büyük harfle başlayamaz.
Fonksiyonları görmedik daha ama ön bilgi olarak kalsın :)
Haskell'de genel olarak fonksiyonlarımızı tanımlamak için .hs uzantılı dosyalara fonksiyonlarımızın taslağını yazarız.Mesela benim deneme.hs dosyamda şunlar var:
ikiyekatla x = x + x  
Demek oluyorki bizim fonksiyonumuz bir x alacak ve bu x'i ikiye katlayacak.Fonksiyon tanımlaması C ailesine göre değişik.Öncelikle parantez olayı yok fonksiyon tanımlarken.Sona noktalı virgül de yok.Fonksiyonun döneceği değeri eşitlediğimiz bir takım işlemler var.Eşitliğin sol tarafı girdiler sağ tarafı da fonksiyonun döndüğü değer diyebiliriz.Şimdi biz bu fonksiyonu deneme.hs'de yazdık.Ancak compiler'da nasıl bağlayacağız?:

Prelude> :l deneme
[1 of 1] Compiling Main             ( deneme.hs, interpreted )
Ok, modules loaded: Main.
*Main> ikiyekatla 2
                                                                                                             4
Görüldüğü üzere tanımladığımız fonksiyonun dosyasını compiler'a bağlamak için dosyanın .hs uzantısız haliyle :l nin yanına yazıyoruz.Eğer bir hata varsa bize söyler ,yoksa *Main> der ve bizden girdi bekler.Girdi olarak da ikiyekatla 2 dedim gördüğünüz gibi parantez yok tamamen serbest ve bize 4 döndü.Tabiiki dosyanın en yukarıda görüldüğü gibi user klasörünün içinde olması gerekiyor.Eğer değilse çıkın ve ghci yapmadan önce "cd dosyanın bulunduğu konumu yazın" mesela cd Desktop gibi.
Önceden de dediğimiz gibi fonksiyonların isimleri büyük harfle başlamaz ancak içinde ' karakteri olabilir.Haskell kendine özel bazı tanımlanmış fonksiyonlara sahiptir.mesela max 3 4 bize 4 döner.min 2 3 bize 2 döner.succ 2 bize 3 döner (yani bir sonraki sayı) böyle değişik kendiliğinden tanımlı fonksiyonlar var onları yeri geldiğinde söyleyeceğiz ancak burada da gördüğünüz üzere fonksiyona verilen girdilerde hiç parantez kullanmadık.Şimdi biraz daha genişletilmiş bir örneğe bakalım :
kucugukatla x y  = if x > y then x*x  else y*y 
deneme.hs dosyasına bunu yazdıktan sonra bu fonksiyonu okuması için terminale yeniden :l deneme yada :r yazacağız. Gördüğünüz gibi fonksiyonumuz iki tane girdi alıyor x ve y, x y'den büyükse x'i aksi takdirde y'yi ikiye katlıyor.burada if kullanımını da görmüş olduk.parantez olayı olmadığından bi alt satıra geçelim derdi de yok :)





 


28 Şubat 2012 Salı

Chrome'u çökertene 1 milyon dolar!

Bilişim devi Google internet tarayıcısı Chrome'u çökertebilene 1 milyon dolara kadar ödül vereceğini açıkladı.

"Pwn2Own" siber korsanlık yarışması kapsamında yarışmacılar, Windows 7 ile çalışan bilgisayarları kullanarak Chrome'a verebilecekleri zararın derecesine göre 20 bin, 40 bin veya 60 bin dolarla ödüllendirilecek. 7 Mart'ta başlayacak yarışma, dağıtılan toplam ödül bir milyon doları bulana kadar devam edecek.
Ödüller 3 kategoride 3 farklı kişiye verilecek ve her kategoride kazanan ilk yarışmacı para ile ödüllendirilecek. Ayrıca kazanan her yarışmacıya Chromebook verilecek.

Sosyal Paylaşım Sitenizde Youtube benzeri sitelerden Vidyo paylaşımını sağlamak-PHP

Bir sosyal paylaşım siteniz var ve üyelerinize değişik vidyo paylaşım sitelerinden aldıkları vidyoları paylaşma imkanı vermek istiyorsunuz.Üyeler çeşitli değişik biçimlerdeki Youtube vidyo linklerini alıp sitenizde vidyo olarak paylaşmak isteyebilirler ve siz de Youtube'ın paylaşım bloğunda yer alabilecek kadar popüler değilsiniz.O zaman adım adım ve kolayca bu işi halledebiliriz :

1.Öncelikle Youtube'nin kullandığı embed koduna bakıyoruz :

iframe src=" http://www.youtube.com/embed/9EEOWbIqQdE" allowfullscreen frameborder="0" height="349" width="560"
http://www.youtube.com/watch?v=QbdpGHbLces&feature=feedu
Bakarsanız bütün Youtube linkleri 'http://www.youtube.com/watch?v=' ile başlıyor.Embed ve izleme vidyolarını teşhis ettikten sonra bunları kullanıma hazır hale getireceğiz.

2.Vidyo linkini gerekli formumuzdan POST olarak aldık ve önündeki her linkte bulunan 'http://www.youtube.com/watch?v=' ifadesini str_replace ile kaldırıyoruz yerine boşluk koyuyoruz.(eregi_replace fonksiyonu miladını dolduruyor çünkü.)Sonra gerekli temizlikleri stripslashes,strip_tags ve mysql_real_escape_string fonksiyonlarıyla yapıyoruz.Stripslahes '\' karakterlerini silerken,strip_tags ise html ve php taglarını temizliyor.Ardından elimizde 11 haneli ve '&' karakteriyle bitmesi muhtemel bir string kalıyor.


$vidyo_linki = $_POST['vidyo_linki'];
$vidyo_linki = str_replace("http://www.youtube.com/watch?v=", "",
$vidyo_linki);
$vidyo_linki = stripslashes($vidyo_linki);
$vidyo_linki= strip_tags($vidyo_linki);
$vidyo_linki = mysql_real_escape_string($vidyo_linki);


3.Yukarıdaki örnek Youtube linkimiz temizlikten sonra 'QbdpGHbLces&feature=feedu' haline dönüştü.Direk açsaydık vidyoyu elimizde 'QbdpGHbLces' gibi bir string kalabilirdi.Şimdi amacımız '&' karakterinden önceki 11 karakter uzunluğundaki stringi alıp embed kodunda kullanmak.Bunun için explode fonksiyonu çok uygun stringi belli bir karakteri görene kadar parçalara ayırıyor.Burada diyoruzki '&' karakterini görene kadar bi parça al,ondan sonrası başka parça olsun.Yeni bir array oluşuyor ismi parca ve bu stringin bölünmüş parçalarını içeriyor.Biz sadece parca arrayinin ilk elemanını alıyoruz parca[0] bu da istediğimiz 11 karakter uzunluğunda youtube vidyo idsine eşit :) bu idyi tabi paylaşım sitesi olduğumuzdan hemen veritabanına kaydediyoruz sonradan embed kodunda kullanmak için.stringimiz '&' içermese bile yine ilk 11 karakteri almış olacağız.

$parca = explode("&", $vidyo_linki);
$vidyo_linki=$parca[0];


4.Şimdi vidyo linkini embed kodunun içine yerleştirippaylaşımı dinamik olarak yapabilirsiniz.Embedin hemen sağına gelen 11 karakterlik youtube idisiyle oluşturuluş iframe kodunu artık sitemize yerleştirip vidyo paylaşımını yapabiliriz.

iframe src="http://www.youtube.com/embed/' .$vidyo_ismi. '" allowfullscreen frameborder="0" height="349" width="425"


5.Bu yöntemi izleyerek diğer vidyo sitelerinin de embed ve normal linklerine bakarak sitenizde paylaşılabilecek vidyo ağını genişletebilirsiniz.

Formda POST ile bilgi gönderdikten sonra sayfa yenilenmesi halinde bilgilerin yeniden gönderilmesini engellemek-PHP

Bir form oluşturduk ve bu form ile bilgileri gönderdik.Ardından sayfa yenile refresh yaptığımız zaman bir uyarı geliyor ve bizden bilgileri yeniden gönderip göndermeyeceğini soruyor.Bunu çözmek için yapacağımız şey bir php kodu :
if ($_SERVER['REQUEST_METHOD']=='POST') {

header("Location: ".$_SERVER['PHP_SELF']);
exit;
}

(tabiki bu php kodunu bütün POST işlemlerimizi bitirdikten sonra koyuyoruz :))
Burada diyoruzki : eğer işlem POST ise o zaman işlemin yapıldığı anasayfaya dön.Böylece hem POST işlemimiz yapılırken,hem de sayfa yenilemede karşımıza çıkan sorun çözülüyor.

Formlarda alınan yeni satırlı yazının düz görünmesi sorunu -PHP

Formdaki yazı bölümlerine satır atlayarak yazdığımız yazıların daha sonra işlenirken veya güvenlik temizlemelerinden geçerken düz yazıya dönüşmesi gerçekten sinir bozucu.Ancak bunun çözümü çok basit bir fonksiyon: nl2br.bu fonksiyona gerekli yazıyı verdiğiniz zaman o size yeni satırları html'de anlaşılacak olan br ' ye çeviriyor:POST olarak aldığımız yazıyı direk olarak $yazi=nl2br($yazi); dersek eğer gerekli çevirimler gerçekleşir.

PHP Session Güvenliği

Üyelik sistemi kullanan web siteleri genelde sayfayı ziyaret edenlerin üye olduğunu anlamak için Session'ları kullanırlar.Session kullanmanın ise o kadar da güvenli olmadığı söyleniyor.Ancak gerekli güvenlik önerilerini kullanarak Sessionlarımızı daha güvenli bir hale getirebiliriz.
Session kullanmanın pek de güvenli olmamasının sebebi genel olarak, üyelik sistemine giriş yapan kullanıcının yarattığı Session bilgilerinin birileri tarafından ele geçirilip, taklit edilmesiyle o kullanıcının hesabını ele geçirmesi veya daha tehlikeli bir şekilde sitenin tamamını ele geçirmesi olarak ifade edebiliriz.
Üyelik sistemi olan sitelerde genel olarak, her üye başarılı bir giriş yaptığında o üyeye özel bir session oluşturulur ve üyenin çevrimiçi olup olmadığı bu sessionlarla denetlenir.
session_start();

$_SESSION['id']=$uyenin_idsi;
Genel olarak üyenin hangi üye olduğunu ayırt etmek için üyeye has id,email gibi sessionlar kullanmak gerçekten de tehlikeli olabilir. Çünkü bir şekilde bizim bu session bilgilerimizi ele geçiren bilgi hırsızları bunu oluşturdukları sessionlarla profilimizi ele geçirmek için kullanabilirler.
Peki bu durumlardan korunmak için neler yapabiliriz sorusuna cevaplarımız neler?
1.Sessionlarda üye numarası,email gibi hassas bilgileri kullanmayın.
2.Üye her giriş yaptığında onun session numarasını değiştirin.Bunun için rasgele bir şekilde sayı ve karakterler üreten fonksiyonlar yazabilirsiniz.10-11 karakter uzunluğu idealdir.
3.Sessionları veritabanında saklayın.
4.Sessionların yok olma sürelerini kısa tutun.
5.Session değerlerine sayfanın linkinde asla yer vermeyin.
Birinci maddenin nedenini açıkladık.İkincisi ise gayet basit : sessionların karmaşık olması bizim kimliğimizin tahmin edilmesini zorlaştırır.Üçüncü madde ise bizim işimize çok yarayacak bir madde.Bunun için veritabanımızda sessionlar için bir tablo yaratmamız yeterli.Tablomuzda 2 sütun olmalı en az : biri session değeri, ikincisi ise o sessionun hangi üye için yaratıldığı. Bu bize bir çok kolaylık sağlar. Birincisi random bir session değeri yaratıldığı zaman yaratılan bu sessionun önceden bulunan sessionlara eşit olup olmadığını denetleyebiliriz.Eğer sessionumuz mevcut sessionlarda varsa, küçük bir olasılık, başka bir session oluşturup veritabanına kaydedebiliriz.İkincisi ve daha önemli avantaj ise bu bizim sadece bir session değerine bağlı kalmamızı önler.Çünkü veritabanına kaydettiğimiz karmaşık sessionların hangi üyeye ait olduğunu biliriz.
Her girişte ayrı bir session değeri vermek bilgi hırsızlarının bizim sabit bir sessionumuz olmadığından işini zorlaştırır ve hesabımızı ele geçirmek için kullanabileceği session değerlerine ulaşmalarını engeller.
Her sayfa yenilemede de ayrı bir session değeri atanması bile güvenlik çılgınları için düşünülebilir bir seçenek :)

Taslak fonksiyon yazarak verilen değerlerin en büyüğünü bulmak (c++)

Template (taslak) fonksiyon yazmakta zorlanan mühendislik okuyan
arkadaşlarım için küçük bir örnek vermek istedim
Template fonksiyonların amacı aynı fonksiyonu birden fazla
türde veriyle kullanmaktır.
Mesela en büyük bulma fonksiyonunda hem char hem int cinsleri için
geçerli olabilecek fonksiyonlar yazabiliriz.
Şimdi arkadaşımın ricası üzerinde verilen 3 aynı türde değerin
en büyüğünü bulma fonksiyonunu yazıyoruz.

#include
using namespace std;
//T kullanacağımız cinsi belirten kısaltma oluyor.
template <class T> // bu göstergeyi kesinlikle template fonksiyon tanımlarken kulanmalı
T ucenbuyuk (T a, T b,T c) {
T sonuc1;
T sonuc2;
sonuc1 = (a>b)? a : b;
//bu kısa yazılımın anlamı a b den // buyukse a,aksi halde b sonuc1 e eşittir demek.
//if ve else kullanılarak aynı şeyler yapılabilir.
sonuc2 = (sonuc1>b)? sonuc1 : b;
//sonuc1 a ile b nin büyüğü sonuc2 ise sonuc1 ile c nin büyüğü olduğundan
// sonuc2 en büyük değer oluyor bu yüzden sonuc2 bizim max değerimiz oluyor
return (sonuc2);
}
Peki template olarak tanımladığımız bir fonksiyonu nasıl kullanabiliriz? hemen örnekleyelim

int main ()
{
int i=5, j=6, k=7,l;
char l='a', m='b', n='c',r;
l=ucenbuyuk<int>(i,j,k);
n=ucenbuyuk<char>(l,m,n);
cout << k << endl;
cout << n << endl;
return 0; }
Yani görüldüğü üzere ucenbuyuk<int>(i,j,k) diyerek kullandığımız fonksiyonda göstergesini
kullanarak bu fonksiyonu int olarak çağırcağımızı belli ediyoruz.