?> python Archives - Webmaster sitesi
Tem 312018
 

MariaDB ve MySQL Kardeş Kavgası

MariaDB ve MySQL Kardeş Kavgası

Image credits: unixmen.com

Başlıkta olayı dramatize ettiğime bakmayın! Fakat MariaDB ve MySQL garçekten de kardeşmiş. Her ikisi de aynı babanın (Michael “Monty” Widenius) ürünü.

Öykünün aslını bugün öğrendim. O yüzden, asıl seçimimi ve desteğimi bugüne kadar ertelemiş olduğum için kendimi de ayıpladım.

İzninizle bu hikayeyi size de özetleyeyim:

MariaDB adını ve bu sistemle MySQL veritabanlarının hiç bir değişikliğe gerek kalmadan aynen kullanılabileceğini bir kaç hafta önce öğrendim. Python Turkiye grubunda Python ile Windows ve Ubuntudan aynı veritabanı (MySQL) dosyalarını ortak kullanmaya yönelik bir soru sormuştum. Bir arkadaşım MySQL yerine MariaDB kullanmamı önerdi. MariaDB adını da ilk kez bu vesileyle duymuş oldum.

Yıllardır MySQL kullanıyorum. WordPress ağırlıklı web sitelerimde ve kişisel bilgisayarımda kullandığım veritabanı çoğunlukla MySQL oldu. Bazen de Firebird kullanırım. Diğer popüler ve kamuya açık bir çok veritabanını da denedim ama bana en sıcak ve en kolay bu ikisi geldi.

Bugün MySQL kullanan Delphi 7 ile yazmış olduğum kişisel bir programı, Ubuntu üzerinde de rahatça kullanabilmek için Python ile yeniden yazmaya karar verdim. Daha doğrusu bu kararı çok önceden vermiştim ama, bir türlü uygulamaya geçememiştim.

Önce Python’da MySQL için hangi paketleri kullanmam gerektiğini araştırmaya başladım. İşte bu araştırmaya MariaDB konusunu da dahil ettim. Ve oldukça ilginç bir öyküyle karşılaştım. Öykünün ana başlıkları şöyle:

  • Monty’nin ekibi mSQL çalışmalarına başlıyor.
  • 1995 yılında Monty’nin kızı My’ın adını çalışmaların adına ekleyerek MySQL olarak duyuruyorlar.
  • MySQL çift lisansa sahip (biri GPL).
  • Yazılımı geliştiren TcX firması adını MySQL AB olarak değiştiriyor. Yazılımı geliştirenler bu firmanın birer çalışanı oluyor.
  • 2005’te Oracle, InnoDB tablo tipini geliştiren Innobase firmasını satın alıyor.
  • 2006’da Oracle, Berkeley DB tablo yapısını geliştiren Sleepy Cat firmasını satın alıyor.
  • 2008’de Sun, MySQL AB’yi satın alıp, açık destekli geliştirme yapısını değiştiriyor.
  • 2010’da Oracle, Sun ve dolayısıyla MySQL’i satın alıyor ve geliştirme yapısını daha da değiştiriyor. (Ticari destek ücretlerine de % 600 zam yapıyor.)
  • Bu gelişmeler üzerine Monty, MySQL kodunu çatallayarak yeni bir veritabanı sisteminin çalışmalarına başlıyor. Bu çalışmaya ikinci kızının adını veriyor: MariaDB.
  • MariaDB, MySQL modelinde kullanılan aynı komut, arayüz, kitaplık ve API’leri kullanıyor.
  • MariaDB giderek popülerlik kazanmaya başlıyor.

Öykü bu. Oracle’ın dünya çapında kendi veritabanı tekelini kurma stratejisini çok açık bir şekilde göz önüne seriyor. (Öykünün ayrıntılarına referanslardaki linkten ulaşabilirsiniz.)

Tek bu neden bile MariaDB’ye geçmek için benim açımdan yeterli.

Peki Oracle, ileride MariaDB yeterince popüler olduğunda onu da satın almaz mı?

Olabilir elbette! Ama hayat devam ediyor. Belki Monty’nin üçüncü bir kızı olmayabilir ama, ekibindeki birilerinin de kızları vardır mutlaka!..

Açık kaynak çalışmalarını engelleme girişimleri her zaman olacak, ama o da her seferinde yepyeni isimler altında yeniden filizlenip gelişecek bir başka ortam bulacaktır.

Ahmet Aksoy

Referanslar:

  tarafından 6:53 pm itibariyle gönderildi.
Tem 312018
 

Pythonda Fonksiyon Dekoratörleri

En kaba tanımıyla dekoratörler, yazılım tasarım kalıplarıdır.

Dekoratörler fonksiyon, metod ve sınıfların işlevselliğinin, dekore edilen fonksiyonun veya alt sınıfların kaynak kodlarında değişiklik yapmaya gerek kalmadan değiştirilebilmesini sağlarlar.

Pythonda Fonksiyon Dekoratörleri

Özetle dekoratörler, yapısını değiştirmek istemediğimiz fonksiyonların davranışlarını; yani işlevlerini değiştirmek amacıyla kullanılır.

Dekoratörler, fonksiyonların hem parametre, hem de dönüş değeri olarak kullanılabilme özelliğine dayanır.

“@” işareti dekoratör tanım operatörü olarak kullanılır. (Aynı işaret matris çarpım operatörü olarak da kullanılmaktadır.)

Şimdi dekoratör uygulamasını örnekleyecek küçük bir örnek geliştirelim.
Eğer Türkçe karakterlerin kullanımı konusunda benim gibi titiz biriyseniz, string.lower() fonksiyonu uygulanmış Türkçe karakterlerden ‘I’ harfinin ‘ı’ yerine ‘i’ olarak geri döndüğünü farketmişsinizdir.

Bu hatayı gidermek için tr_lower_dekorator isimli bir fonksiyon hazırlayalım. Bu dekoratör fonksiyonumuz parametre olarak func isimli bir başka fonksiyon alıyor. Bu fonksiyonun aldığı parametre ise x stringi.

Dekoratör fonksiyonumuzun içinde fonksiyon(x) isimli ara fonksiyonumuz mevcut. Bu fonksiyon, önce, parametre olarak aldığı x stringindeki ‘I’ karakterlerini ‘ı’ harfine dönüştürüyor, sonra da orijinal fonksiyonu çağırarak ‘I’ harfleri düzeltilmiş stringe lower() fonksiyonunu uyguluyor.

Kodlar aşağıda. Sormak istediğiniz bir şey olursa, en aşağıdaki yorum alanını kullanabilirsiniz.

Betiğimizin döndürdüğü bilgiler şöyledir:

İlk satırda orijinal string, ikinci satırda string.lower() fonksiyonu kullanılarak elde edilmiş string, son satırda ise string.lower() fonksiyonuna dekoratör uygulanmış haliyle üretilmiş string yer almaktadır.

turkce_lower02() fonksiyonunu kolayca düzenleyip doğru sonuç üretmesini sağlayabilirdik. Örneğimizin anlaşılabilir olması için böyle basit bir fonksiyon kullandım. Bu fonksiyon yerine çok daha karmaşık bir fonksiyon olsaydı, dekoratörün etkisi daha açık bir şekilde ortaya çıkacaktı.

Dekoratörler bottle, flask ve django gibi ağ çerçevelerinde (web application framework) sıklıkla kullanılmaktadır.

Ahmet Aksoy

Referanslar:

  tarafından 6:12 pm itibariyle gönderildi.
Ara 092017
 

Pythonda Liste Kısaltmaları

Liste kısaltmaları (list comprehensions), Python diliyle basit, kolay anlaşılır ve hızlı bir şekilde listeler oluşturmamızı sağlar.

Liste Kısaltmaları

Örneğin 0 ile 10 arasındaki ( 0 ve 10 dahil) tam sayıların karelerini hesaplayıp, sonuçları bir liste haline getirelim.

Bu işlemin en basit yöntemi for döngüsü kullanmaktır.

Aynı listeyi list ve map fonksiyonları kullanarak da oluşturabiliriz:

Üçüncü yöntemimiz ise liste kısaltması kullanmaktır:

Her üç yöntemin sonucu da aynıdır:

Şimdi 5 ile 18 arasındaki (5 ve 18 dahil) sayılarla 2’nin üssünü hesaplayalım:

Sonuçlar aynı:

3 ile 28 arasındaki çift sayılar:

Sonuçlar aynı:

2 ile 24 arasındaki tek sayılar için liste kısaltması:

Sonuçlar:

Kısacası yinelenebilir (iterable) bir nesneden bir liste oluşturmak istediğimizde:

Liste kısaltmamıza filtre uygulamak içinse if anahtar sözcüğünü kullanıyoruz:

Bir önceki yazımda liste kısaltmalarının for döngülerinden ve map() fonksiyonundan daha hızlı çalıştığını belirtmiştim.

Şimdi bu kıyaslamayı basit bir örnek üzerinden kendimiz yapalım. Kıyaslama işleminde bir dekoratör fonksiyonu kullanalım.

Sonuç:

Elbette bu sonuçlar betiği çalıştırdığınız bilgisayarın çalışma hızına da bağlıdır ama, aynı işlemin farklı yöntemlerle uygulanmasının farklı süreler aldığını açıkça görebiliyoruz.

Eğer yazdığınız kodlar çalışma hızına duyarlı ise, kesinlikle liste kısaltması kullanmanızı öneriyorum. Eğer böyle bir kaygınız yoksa ve Python konusunda çok fazla deneyiminiz bulunmuyorsa, for yöntemini kullanın. Böylece map veya liste kısaltmasının içeriğini algılamak için çaba sarfetmenize gerek kalmaz.

Şahsen ben, bu konuda Guido van Rossum’a katılıyorum: Eğer çok özel nedenleriniz yoksa lambda, map, filter ve reduce gibi ek araçlara ihtiyacınız olmayacaktır.

Ahmet Aksoy

Referanslar: