Posts

Euler Projesi – Çözümlerim

Nedir bu Euler Projesi? Öncelikle ondan başlayalım.

Euler Projesi

Euler projesi; ister matematikçi olsun ister yazılım geliştiricisi, meraklı insanların çözmek isteyeceği soruları barındıran bir sitedir. Şu anda 608 tane soru bulunmaktadır ve her geçen vakit bu sayı artmaktadır. Kendilerini tanıtan yazıyı çevirirsek;

Euler projesi; çözmek için matematiksel kavrayışlardan daha fazlasına ihtiyaç duyan zorlu matematiksel / bilgisayar programlama problemleri dizisidir. Matematik, zarif ve etkili yöntemleri keşfetmenize yardımcı olsa da, birçok sorunu çözmek için bir bilgisayar kullanımı ve programlama becerileri gerekecek.

Neden bu proje ile ilgili yazıyorum? Çünkü ben de bu projedeki soruları çözmeye başladım. Bu soruları çözebilmek için matematiği yeniden öğrenmem gerekecek ama bundan keyif alıyorum. Bu soruları çözüyorum çünkü yazılımı sevmemin temel sebebi de bu.

Yazılımı ve yazılımcıyı en temel hali ile alırsak, bilim ve bilim insanının en temel yapısından farksız olduğunu göreceğiz. Yazılımcı da bilim insanı da bir problem ya da soruyla karşılaşır ve bunun çözümüne, cevabına ulaşmak için uğraşır. Bu yüzden bilim insanları kolaylıkla yazılım öğrenmekte ve kullanmaktadır. Yazılımcılar arasında (ülkemizde pek rastlanmaz malesef çünkü yazılımcı değiller, ezberci iş gücü köleleri onlar) bilime merak duyan veya ilgilenen insana rastlamak şaşırtıcı olmaz bu yüzden.

Bu tür problemleri incelemek, inceleme esnasında öğrenmek ve çözüme ulaştıktan sonra başarı hissi inanılmazdır. Bu yüzden yazılımı uyuşturucuya benzetenler de olmuştur. Nasıl ki uyuşturucuda aynı hazzı yakalamak için daha çok uyuşturucu tüketimi olur, yazılımcı da aynı hazzı yakalayabilmek için giderek daha zor problemlerin çözümüne adar kendini.

İşin özetine gelirsek ben çözümlerimi yayınlayacağım bir github reposu oluşturdum. Çözümlerimi hem php hem de javascript dillerinde yayınlayacağım. Amacım insanların çözüme ulaşması değil elbette. Yazılımcılar birbirinden farkı çözümler üreteceği için, birbirimizin cevaplarını görmek ve bunun üzerinde tartışma yapabilmek.

Bu çözümleri oluştururken dinlediğim müzik ise aşağıdadır;

Mysqlexport – Veritabanını Php İle Dışarı Aktarmak

İster programcı olun ister web sitesi olan herhangi birisi, herkesin başına gelmiştir; veritabanlarınızı yedeklemek istersiniz ama paylaşımlı hosting kullanırsınız ve hosting firmasından kaynaklı problemler ile veritabanınızı ya da veritabanlarınızı dışarıya aktarıp yedeklemek imkansız hale gelir. Böyle bir sorunuz olmasa bile benim gibi kendi sunucunuzu yönetebilirsiniz ve birçok veritabanınızı elle yedeklemek size zor gelir. Tüm veritabanlarınızı otomatik olarak yedekleyecek bir sisteminiz olsun istersiniz.

Zaten programcı dediğiniz tembel olur, tembel kalabilmek için her şeyi otomatikleştiren veya kolaylaştıran insanlardır. Programı çalıştırdığı esnada kahve makinesinin kahve oluşturmaya başlaması ve tam onun yanına geldiği esnada kahve oluşturmayı bitirmesi için kod yazan sistem yöneticileri gördü bu dünya. İşte ben böyle insanları takdir ederim.

Ben de sunucumdaki veritabanlarını otomatik olarak yedeklemesi için bir php sınıfı oluşturdum. Cronjob oluşturarak bu dertten kurtulacağım. Siz de isterseniz benim gibi otomatik yedekleme için kullanın, isterseniz web üzerinden gireceğiniz bir şifre ile yedekleyen özel sayfa oluşturun.

Oluşturduğum mysqlexport projesine https://github.com/erhankilic/mysqlexport adresinden oluşabilirsiniz.

Aşağıdaki örnek kullanım ile istediğiniz gibi veritabanlarınızı yedekleyebilirsiniz. Yalnız tüm veritabanlarına erişim yetkisi olan bir kullanıcı ile yapmalısınız. Aksi takdirde hangi veritabanına yetkisi varsa sadece onu yedekleyecektir.

Kullanım Basamakları;

  1. Öncelikle include ile sınıfımızı programımıza dahil ediyoruz.
  2. Bir değişkene oluşturduğumuz yeni sınıfı atıyoruz. İlk parametrede yedeklenecek yerin yolunu yazıyoruz. Daha sonra sırasıyla veritabanı bağlantı adresini (genelde localhost olur), kullanıcı adını ve kullanıcı şifresini parametreler olarak yazıyoruz.
  3. Bundan sonra iki seçeneğimiz var. İster setDatabases(array $databases) ile bir array içerisinde yedeklemek istediğimiz veritabanlarını programa tanımlıyoruz ya da getDatabases() fonksiyonu ile veritabanlarının isimlerini çekmesini sağlıyoruz.
  4. En sonunda da export() fonksiyonu ile yedekleme işlemini bitiriyoruz.
<?php
include 'Export.php';
$export = new MysqlExport\Export('backup', 'localhost', 'root', 'dev1');
$export->getDatabases();
$export->export();

importSqlWithPhp – Php ile Sql Dosyası Yükleme (Import Etme)

Bazen Phpmyadmin ya da herhangi bir veritabanı programı kullanamadığınız zamanlar olur ve Sql dosyasını veritabanına yüklemek için başka seçenekler kullanmak zorunda kalırsınız. Burada ise Php‘de hem eski mysql_query hem de yeni mysqli_query kullanarak nasıl yükleyebileceğinize dair bilgilendirme yapacağım. Dosyalara aynı zamanda Github projemden de ulaşabilirsiniz.

Her iki yöntemde de yapmanız gereken şunlardır. Sql dosyası ile oluşturacağınız php dosyasını aynı yere yükleyip site adresi üzerinden php dosyasını çalıştırmak. Sunucu üzerinden konsol komutları ile de çalıştırabilirsiniz.

$filename değişkeni dosya ismi ile güncelleyin. $mysql_host ismini ise veritabanı sunucusu ile güncelleyin. Veritabanı sunucusu farklı değilse olduğu gibi bırakabilirsiniz. $mysql_username ve $mysql_password veritabanı için oluşturduğunuz kullanıcı adı ve şifredir. $mysql_database ise veritabanı ismidir. Gerekli şekilde güncellersiniz.

Mysql_query Fonksiyonu İle

<?php

// Name of the file
$filename = 'sql.sql';
// MySQL host
$mysql_host = 'localhost';
// MySQL username
$mysql_username = 'username';
// MySQL password
$mysql_password = 'password';
// Database name
$mysql_database = 'database';

// Connect to MySQL server
mysql_connect($mysql_host, $mysql_username, $mysql_password) or die('Error connecting to MySQL server: ' . mysql_error());
// Select database
mysql_select_db($mysql_database) or die('Error selecting MySQL database: ' . mysql_error());

// Temporary variable, used to store current query
$templine = '';
// Read in entire file
$lines = file($filename);
// Loop through each line
foreach ($lines as $line) {
// Skip it if it's a comment
 if (substr($line, 0, 2) == '--' || $line == '')
 continue;

// Add this line to the current segment
 $templine .= $line;
// If it has a semicolon at the end, it's the end of the query
 if (substr(trim($line), -1, 1) == ';') {
 // Perform the query
 mysql_query($templine) or print('Error performing query \'<strong>' . $templine . '\': ' . mysql_error() . '<br /><br />');
 // Reset temp variable to empty
 $templine = '';
 }
}
echo "Tables imported successfully";
?>

Mysqli_query Class’ı İle

<?php

// Name of the file
$filename = 'sql.sql';
// MySQL host
$mysql_host = 'localhost';
// MySQL username
$mysql_username = 'username';
// MySQL password
$mysql_password = 'password';
// Database name
$mysql_database = 'database';

// Connect to MySQL server
$con = @new mysqli($mysql_host,$mysql_username,$mysql_password,$mysql_database);

// Check connection
if ($con->connect_errno)
 {
 echo "Failed to connect to MySQL: " . $con->connect_errno;
 echo "<br/>Error: " . $con->connect_error;
 }

// Temporary variable, used to store current query
$templine = '';
// Read in entire file
$lines = file($filename);
// Loop through each line
foreach ($lines as $line) {
// Skip it if it's a comment
 if (substr($line, 0, 2) == '--' || $line == '')
 continue;

// Add this line to the current segment
 $templine .= $line;
// If it has a semicolon at the end, it's the end of the query
 if (substr(trim($line), -1, 1) == ';') {
 // Perform the query
 $con->query($templine) or print('Error performing query \'<strong>' . $templine . '\': ' . $con->error() . '<br /><br />');
 // Reset temp variable to empty
 $templine = '';
 }
}
echo "Tables imported successfully";
$con->close($con);