14 Kasım 2009 Cumartesi
PHP ve curl ile form gönderme örneği
$path = "./list.csv";
$handle = fopen($data_file, "r");
$lines=file($data_file);
$idx = 0;
$line = $lines[$i];
$licensePre = 0;
while (is_null($lines[$idx]) != true)
{
$line = $lines[$idx];
$raw = explode(',',$line);
if ($licensePre == (int)$raw[0])
{
$idx = $idx + 1;
continue;
}
$url = "http://www.*****.***/****/";
$formUrl = '*****.php?tpl=***&main=33';
$nameSurname = explode(' ',$raw[1]);
$nameSize = count($nameSurname);
$name = $nameSurname[0];
$ns = 1;
if ($nameSize > 2)
{
for ($ns=1; $ns<$nameSize-1; $ns++)
$name = $name . " " . $nameSurname[$ns];
}
$surname = $nameSurname[$nameSize - 1];
$licenseNo = $raw[0];
$teamName = $raw[5];
$rawLicenseDate = explode('/',$raw[4]);
$rawBirthDate = explode('/',$raw[2]);
$birthPlace = ($raw[3]) ? $raw[3] : ' ';
$licenseDay = ($rawLicenseDate[1]) ? $rawLicenseDate[1] : '';
$licenseMonth = ($rawLicenseDate[0]) ? $rawLicenseDate[0] : '';
$licenseYear = ($rawLicenseDate[2]) ? $rawLicenseDate[2] : '';
$birthDay = ($rawBirthDate[1]) ? $rawBirthDate[1] : '';
$birthMonth = ($rawBirthDate[0]) ? $rawBirthDate[0] : '';
$birthYear = ($rawBirthDate[2]) ? $rawBirthDate[2] : '';
$filename = "./pic/{$licenseNo}.jpg";
if (file_exists($filename))
$img = "@{$filename}";
else
$img = '';
$data = array(
'emails' => '****',
'password' => '***',
'txtPlayerName' => $name,
'txtPlayerSurname' => $surname,
'txtLicenseNo' => $licenseNo,
'playerPosition' => '0',
'teamName' => (int)$teamName,
'national_team_id' => '-1',
'license_given_day' => $licenseDay,
'license_given_month' => $licenseMonth,
'license_given_year' => $licenseYear,
'license_end_day' => '',
'license_end_month' => '',
'license_end_year' => '',
'birth_day' => $birthDay,
'birth_month' => $birthMonth,
'birth_year' => $birthYear,
'placeOfBirth' => $birthPlace,
'btnSubmit' => 'Submit >>',
'image' => $img,
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url . $formUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$curlrt = curl_exec($ch);
$licensePre = $licenseNo;
$cnt++;
echo $cnt . " " . $line . "\n";
$idx = $idx + 1;
}
?>
7 Mayıs 2009 Perşembe
Ramsey sayıları için naçizane bir üst limit
R(k,k) <= 2R(k,k-1)
Kanıt :
2R(k,k-1) düğümlü iki renkli tamamlanmış bir çizgeyi ele alalım. Bu çizgenin herhangi bir düğümü (D düğümü diyelim) tek-renk olan en az R(k,k-1) tane kenar barındırır. (Güvercin yuvası ilkesi)
Bu tek-renk kenarlarların bir uçları aynı düğümde olduğuna göre diğer uçları tamamen farklı düğümlerde sonlanmalıdır.
R(k,k-1) düğümün oluşturduğu bu alt çizgeyi (Ç diyelim) inceleyelim.
R(k,k) nın koşuluna bakalım. Bu çizge en azından k düğümlü tek-renk tamamlanmış bir alt-çizge
barındırmalıdır.
R(k,k-1) in koşullarına bakalım. Bu çizge en azından a renkli k düğümlü yada b renkli k-1 düğümlü bir
alt-çizge barındırmalıdır.
R(k,k-1) = R(k-1,k) olduğuna göre
D düğümüne bağlı tek-renkli R(k,k-1) tane kenarın rengi
a ise R(k-1,k) dan dolayı :
Ç çizgesi b renkli k düğümlü bir alt-çizge barındırır ya da
Ç çizgesi a renkli k-1 düğümlü bir alt çizge barındırır ve bu alt çizgeye D düğümü ilave edilirse k düğümlü a renkli bir alt çizge elde edilir.
b ise R(k,k-1) den dolayı :
Ç çizgesi a renkli k düğümlü bir alt-çizge barındırır ya da
Ç çizgesi b renkli k-1 düğümlü bir alt çizge barındırır ve bu alt çizgeye D düğümü ilave edilirse k düğümlü b renkli bir alt çizge elde edilir.
Görüldüğü gibi her durumda k düğümlü tek-renk bir alt çizge kaçınılmazdır.
O halde R(k,k) <= 2R(k,k-1) 'dir.
26 Şubat 2009 Perşembe
60415263038565101838178326743348811045937215431513389 kat daha kolay.
Şu halde incelememiz gereken durum sayısı 60415263038565101838178326743348811045937215431513389 kat azalmıştır. Öyleyse artık problemimiz 60415263038565101838178326743348811045937215431513389 kat daha kolay bir problemdir. Fakat bu hali ile bile çok çok .... çok zor bir problemdir.
13 Şubat 2009 Cuma
Basit bir problem ne kadar zor olabilir ?
Eğer başlığı "kolay bir problem ne kadar zor olabilir?" şeklinde yazmış olsaydım gerçekten de çelişkili bir durumla karşı karşıya kalabilirdik. O yüzden en azından bu yazı için problemleri şu şekilde sınıflandırmayı tercih ediyorum;
- Basit ve kolay problemler.
- Basit ve zor problemler.
- Karmaşık ve kolay problemler.
- Karmaşık ve zor problemler.
Problemlerin basit yada karmaşık oluşu haliyle göreceli bir kavram olmakla birlikte çoğu kişi tarafından kabul görebilecek sınıflandırmalar yapabiliriz.
Başlıktan da anlaşılacağı gibi ben bu yazıda bahsedeceğim problemin (parti problemi) basit bir problem olduğunu düşünüyorum. Kanımca, matematik ve bilgisayar konusunda bilgi sahibi olmayan birisi bile iyi anlatıldığı takdirde bu problemi çabucak kavrayabilir. Bir tek cümle ile bile yeterince açık bir biçimde örneklenip ifade edilebilinir.
Şimdi bu "basit" problemi yine basit bir yöntem kullanarak çözmenin, kolay mı yoksa zor mu olduğunu inceleyebiliriz.
En basit kabakuvvet yöntemi ile bu problemi çözmeye çalıştığımızı düşünelim. O halde tüm durumları tek tek denememiz gereklidir.
Örneğin 5 kişilik parti probleminin çözümünün bilinen aralığı [43,49]. Yani problemin çözümü 43, 44, 45, 46, 47, 48 ya da 49 sayılarından bir tanesidir. Problem en az davetli sayısını istediğine göre 43 olup olmadığına bakalım.
Basit kabakuvvet yöntemimizle probleme yaklaştığımızda 43 kişilik bir partide kişilerin tüm olası el sıkışma (tanışıklık yada benzeri) durumlarını teker teker inceleriz. Eğer olası tüm durumlarda parti probleminin bize söylediği iki koşuldan:
- her biri diğer 4'ü ile el sıkışmış 5 kişilik bir grup,
- her biri diğer 4'ü ile el sıkışmamış 5 kişilik bir grup.
Şimdi olası tüm el sıkışma durumlarının kaç tane olduğunu hesaplayalım. El sıkışma olayı iki kişi arasında ya gerçekleşir ya da gerçekleşmez. Ve bu iki kişi 43 kişinin 2 li kombinasyonlarının sayısı kadar farklı biçimde seçilebilinir. O halde;
2^(43*42/2) tane farklı durum söz konusudur. Basit kabakuvvet yöntemimiz 2^903 tane farklı el sıkışma kombinasyonunu incelemek durumundadır. Bu da tam olarak incelenmesi gereken;
67621699985365151533099492469314125634412457732623554832378970755414
25952726078201272540875362012005051832255913691247089694048761634374
87680689892432562658442734955518726507735976342625825844547871018122
51032115730947621472199902571314803042180668990660938354910463787008
adet durum olduğu anlamına gelir. 272 basamaklı bu sayıyı 18 defa katrilyon çarpılarak ifade edilebilecek (katrilyon kere katrilyon kere ... katrilyon) sayıdan daha büyüktür.
Dünyada katrilyon tane ev olsa, her bir evde şu anda dünyada bulunan en hızlı süper bilgisayardan katrilyon kat daha hızlı olan bilgisayarlardan katrilyon tane olsa yine de bu basit kabakuvvet yöntemiyle problemi çözmek dünyanın yaşının katrilyonlar kere katrilyonlarca katından daha uzun zaman alırdı.
Demek ki bu basit problem, basit bir kabakuvvet yöntemiyle çözmek için zor bir problem. Tabii kullandığımız kaba kuvvet yöntemini biraz karmaşıklaştırmak problemi kolaylaştırmada bize yardımcı olabilir. Bir sonraki yazıda aynı problemi 60415263038565101838178326743348811045937215431513389 kat daha "kolay" fakat yine de "zor" :) bir biçimde nasıl çözebileceğimizi anlatmayı düşünüyorum...
11 Ocak 2009 Pazar
Ramsey Sayıları ve BOINC
Son birkaç haftadır Yakın Doğu Üniversitesi Bilgisayar Mühendisliği CEN Araştırma Grubu ile birlikte Ramsey Sayıları üzerine bir BOINC projesi ile meşgulüz. Kısaca söz edecek olursam Ramsey Sayılarının bilinenler aralığını daraltmayı amaçlayan gönüllü hesaplama - daha doğrusu hesaplatma- mantığına dayanan bir proje.
Birkaç ay içerisinde hayata geçirip sonraki birkaç ay içerisinde de sonuç-lar- alabilmeyi planlıyor ya da ümit ediyoruz.
Proje faaliyete geçtiği zaman bilgisayarınıza BOINC istemcisini kurarak yardımcı olabilirsiniz. Projenin faaliyete geçmesi konusunda da aşağıda verdiğim subversion deposunu takip ederek yardımcı olabileceğinizi düşündüğünüz herhangi bir konuda bizimle iletişime geçebilirsiniz. (Şu anda depoda herhangi bir kararlı sürüm bulunmamakta. Yazdığımız kodların bilgisayarınızı yada evinizi havaya uçurma potansiyeli bulunmadığını düşünüyoruz. Fakat şimdilik kodun çalışacağını ve doğru hesap yapacağını garanti edemeyiz, hatta hiçbir zaman böyle bir garanti vermeyi düşünmüyoruz:) Kodların tamamı GNU/GPL lisansına sahiptir. Kullanabilir, kopyalayabilir, değiştirebilir, -üç beş kuruşunu bize bağışlamak koşuluyla- satabilir, atabilir, ödev olarak sunabilir ve hatta ben yazdım diyerek kız/erkek tavlamayı deneyebilirsiniz.)
Aşağıdaki kabiliyetlerden herhangi birine, çoğuna ya da hepsine sahipseniz bu bize yardımcı olabileceğiniz anlamına gelebilir.
* Matematik (Çizge Kuramı, Kombinatorik, ...)
* Programlama (C / C++ / Assembly / Python)
* BOINC API, nauty, NumPy
* İşletim Sistemleri (Linux, OSX, Windows)
* İşlemci Mimarileri (x86, x86_64--AMD64,IA64, PPC)
* İşlemci Teknolojileri (MMX, SSE, SSE2, NVIDIA-CUDA ...)
* Veritabanı (MySQL / SQLite)
* Görsel tasarım (Tercihen Inkscape ve GIMP)
* (XHTML / JavaScript (prototype.js) / PHP)
* Tercüme (Türkçe <> İngilizce, ....)
https://svn.neu.edu.tr/cen/