Zırvalama Tahtası symfony, debian, PHP5, SQL ve pek çok ayrıntı

13Jan/090

Gnome ve klavye ayarları

İş yerinde bir süredir ubuntu kullanıyorum, bir ara nasıl yaptıysam yaptım ve klavyenin sağındaki numerik tuşları kullanamamaya başladım, numlock ışığı yanık olmasına rağmen çalışmıyordu bir türlü ve bende kendime eziyet etmekten zevk alan biri sayılmam, biraz google araması ile aşağıdaki çşözümü buldum, denedim, numerik klavyeme kavuştum mutluyum :)

Gnome altında Sistem -> tercihler -> klavye menüsünü tıklayın, karışınıza gelen pencerede bulunan “Fare tuşları” tabındaki, “belirteç klavye ile kontrol edilebilir” seçeneğindeki tik’i kaldırın, numeric klavye tekrar çalışacaktır.

5Sep/070

Symfony de ufak performans arttırma yolları

Symfony ile bir şeyler yapmaya başladığınız da sizi en çok zorlayacak alanlardan birisi native PHP ile arasındaki performans kaybıdır, bu kayıp benim nezdim de kaybedilmesi çok problem olmayan bir kayıp olsa da kimi zaman başımı ağrıtır. PHP'de performans'ı kötü etkileyen en önemli iki faktör define fonksiyonu ile döngülerdir, (en azından apd ile oynadığımda bunu görüyorum), Symfony içerisinde ise performans kaybını en çok uzun listeleri oluşturan sorgular sırasında yaşıyorum, bunun en önemli nedenlerinden biri sorgular gerçekleştirildikten sonra dönen record setinin hydrate için bir döngüye girmesi ardından elimdeki bu listeyi kullanmak için benimde aynı miktarda bir döngüye girmem, bu durumda 100 satırlık bir kayıtın ekrana basılması için 200 döngü gerekiyor ve buda bir miktar (hafife alınmayacak kadar) performans kaybına neden oluyor. Şimdi daha önce yazdığımız listeleri kullanmak için önümüzde iki yol var birincidi XxxPeer::doSelect methodu yerine XxxPeer::doSelectRS methodunu kullanmak ve action/view içerisinde while($rs->next()) olarak kullanmak, diğeri yine kayıtları Recordset nesnesi olarak alıp, kullanılacağı döngü içerisinde hydrate etmek olacaktır. Örnek aşağıda:

 $rs = XxxPeer::doSelectRS($c);
 if($rs)
 {
   while($rs->next())
   {
      $obj = new Xxx();
      $obj->hydrate($rs);
      //Artık elimde hydrate edilmiş bir kayıt var
      $obj->setMethodname('value');
      $obj->save();
   }
 }

Dönen kayıt sayısı kadar döngüden ve dolayısı ile CPU zamanından tasarruf ettim, artık turşu kurabilirim.

(Yazar) Sevgili günlük
(Günlük) Ne var, neee?
(Yazar) Sıkıldım.
(Günlük) PowerDNS için bir yönetim paneli yaz o zaman.

15Sep/060

Concat,PostgreSQL

Elimdeki proje ile uğraşırken bir soruna denk geldim, Aşağıdaki gibi bir sonuç döndüren sorgumun tek satırda almam gerekiyor, ancak name alanlarındaki verileri de kaybetmemem gerekiyordu. Biraz google biraz doküman okuyarak concat aggregate fonksiyonunu buldum ancak bu aggregate fonksiyonu PostgreSQL için yoktu, biraz daha bakınınca dökümanlardan birinde hazır yapılmışına rastladım. Eh burayada koymazsam olmaz sonra unutuyorum :)

SELECT name,phone FROM TABLENAME;

name | phone
-----------------+------------------
AAAAAAAF | 9054444333xx
AAAAAFFF | 9054444333xx
SSSSSDDDDAAAF | 9054444333xx

=> CREATE AGGREGATE concat (
(> BASETYPE = text,
(> SFUNC = textcat,
(> STYPE = text,
(> INITCOND = ''
(> );
CREATE AGGREGATE

SELECT CONCAT(name||', ') AS name, phone FROM TABLENAME GROUP BY phone ;

name | phone
------------------------------------------------------------------------------------------+------------------
AAAAAAAF,AAAAAFFF,SSSSSDDDDAAAF | 9054444333xx

Pek bir güzel oldu....

20Aug/060

Pek bir güzel

Daha önceki symfony versiyonlarında olmayan yeni bir özelliği keşfettim (aferim bana) geç fark etmemin en büyük nedeni undocumented olması imiş. Hemen kısaca bahsedeyim eğer iki adet farklı Veri tabanına ihtiyacınız var ise databases.yml içerisiniş azıcık düzelterek istediğimiz gibi bağlanabiliyoruz.

all:
propel:
class: sfPropelDatabase
param:
dsn: pgsql://myuser:mypass@localhost/mydb
is_default: yes
mysql:
class: sfPropelDatabase
param:
dsn: mysql://myuser:mypass@localhost/mydb

Artık her istekte sadece tek bir veri tabanı bağlantısı açılacak diğer veri tabanı üzerinde bir sorgu yapmamız gerektiği zaman bağlanılacak. (sistem kaynaklarını düzenli kullanalım değilmi ama :) ) Bunun için ise eğer Criteria sınıfını kullanacaksak $c = new Criteria(’mysql’); diyerek mysql ismini verdiğimiz bağlantı üzerinden bu işlemi gerçekleştireceğimizi belirtiyoruz ki DB bağlantısı açılsın ve sorgumuz mySQL üzerinde koşsun. Aksi halde default olarak belirttiğimiz propel isimli DB bağlantısı üzerinde koşacak sorgumuz. Peki ya Criteria değilde özel SQL yazıyorsak ne olacak? İşte o vakitte $con = Propel::getConnection(’mysql’); diğerek Bağlantımızın mysql ismini verdiğimiz bağlantı paramatreleri ile koşacağını belirtmiş oluyoruz. Pek bir güzel. Ha ne işimize yarayacak derseniz benim hayatımı kolaylaştırdı, sizinki size kalmış.

(Yazar) Sevgili günlük..
(Günlük) Efendim?
(Yazar) Aşık diyorum, olmak diyorum, lazım diyorum.
(Günlük) Sen diyorum, ne diyorum, istediğini, diyorum bilmiyorsun, diyorum.

Tagged as: , No Comments
7Jun/060

Merak işte

Günün birinde bir PostgreSQL veri tabanında ki bir tablonun disk üzerinde kapladığı alanı merak ederseniz şu SQL sorgusunu çalıştırın;

select pg_total_relation_size('tablename');

Aferim... akıllı çocuk...

26May/060

postsuper

eğer postfixte kuyrukta bekleyen e-postaları silmek gerekirse postsuper komutunu kullanıyoruz ve ayrıntılı bilgi için süper man!!!

28Apr/060

Buda lazım tabii…

Bir alandaki tekrar eden verilerin hangileri olduğunu öğrenmek istiyorsunuz diyelim ne yaparsınız?
işte aşağıdaki gibi bir sorgu yazarsınız,

SELECT
dates
FROM reports
GROUP BY dates
HAVING ( COUNT(dates) > 1 )

çalıştırırsınız sonrada dadından yinmez....

14Mar/060

Linux ve sistem bilgilerini görüntüleme

Linux dağıtımlarını kullanırken yada kullandığınız dağıtım üzerinde bir takım değilşiklikler yaptığımızda (kernel güncelleme yada yeni servisler ekleme vs.) çok nadir de olsa bazı sorunlar ile karşılaşabiliriz. (servisler çalışmayabilir vs.) Bu durumda neler yapılır?

İlk bakılacak olan elbette sorunun nereden kaynaklandığını düşündüğümüze göre değişmektedir, örneğin sistem açılırken başlatılan servislerden birinde bir sorun var ve bununla ilgili bir mesaj boot işlemi sirasında ekranda görünüyor ancak çok hızlı geçtiğinden okuyabilmek imkansız, bu durumda bakılacak ilk yer /var/log/boot.log elbette bunun için sisteminizde bootlogd servisinin kurulu olması gerekir bu servis /dev/console aygıtına gönderilen verileri /var/log/boot.log dosyasına gönderir.

Eğer sisteminize bir aygıt bağlamış iseniz yada çekirdeğinizi güncelledikten sonra bazı aygıtlarınız çalışmıyor ise başvuru adresiniz dmesg' tir, dmesg çıktısı içerisinde kolayca gezinmek için pipe ile çıktıyı less'e yollayabilirsiniz. (dmesg|less)

Eğer daha fazla bilgiye ihtiyacınız varsa (aygıtınız için özel bilgiler mesela) /proc dosya sistemi üzerinde gezinmeye başlayabilirsiniz. bazı dosyaların ne işe yaradıklarını hemen yazalım.

/proc/cpuinfo : cpu ile ilgili bilgileri görüntüleyebilirsiniz.
/proc/devices : Linux sisteminiz üzerinde kullandığınız aygıtları görebilirsiniz.
/proc/ioports : giriş / çıkış portlarını görüntüleyebilirsiniz, her aygıt için bu adres bilgileri farklıdır.
/proc/interrupts : Linux sisteminizdeki aygıt kesme isteklerini hangi irq hangi aygıt için atanmış öğrenebilirsiniz.
/proc/dma : Linux sisteminizdeki dma kanallarını görüntüleyebilirsiniz.
/proc/bus/pci/devices : pci aygıtlarınız ile ilgili bilgi alabilirsiniz.
/proc/bus/usb/devices : usb aygıtlarınız ile ilgili bilgi alabilirsiniz.
/proc/scsi/scsi : scsi aygıtlarınız ile ilgli özet bilgiye ulaşabilirsiniz.
/proc/bus/usb/drivers : usb aygıtlarının kullandıkları sürücüleri öğrenebilirsiniz.

Aygıtlar hakkında bilgi almanın daha farklı yollarıda vardır elbette mesela hwinfo komutu yada hdparm ile sabit sürücünüz hakkında bilgi alabilir, ve bazı özelliklerini açıp kapatabilirsiniz. (dma kullan yada kullanma gibi)
fdisk ile sabit sürücünüz üzerindeki alanları ve hangi formatta olduklarını görüntüleyebilir, yada düzenleyebilirsiniz. (bu tehlikeli bir iştir dikkatli olunması gerekir aksi halde verilerinizi kaybedebilirsiniz)
iostat ile cpu ve giriş çıkış işlemleri ile ilgili istatistiki bilgileri öğrenebilirsiniz.
lspci komutu ile pci aygıtları hakkında bilgi alabilirsiniz.

Sistem ve süreç bilgileri için ise,
top, ps, uptime, netstat, uname komutlarını kullanabilirsiniz.

netstat ile ilgili bir bilgi vereyim hemen (bu güzel bir parametre topluluğudur)
-n (isim çözümlemsi yapma)
-r (yönlendirme bilgilerini görüntüle)
-e (daha fazla bilgi alayım canım freak'im ben)
-p (işlemleri de ver bakayım)
-a (dinlenen ve dinlenmeyen socketleri alayım)
-t (tcp socketlerini de alayım)
-u (udp socketlerini de versene lan)

(Yazar) Sevgili günlük...
(Günlük) Efendim?
(Yazar) Efendiler dağa kaçırsın seni.
(Günlük) Kim olduğuna bağlı.