Yazılım

You are currently browsing articles tagged Yazılım.

Anımsayamadığım kadar uzun zamandır, herhalde 1997 ya da 1998′den beri Gnu/Linux ile ilgiliyim. Slackware 2.4 günlerinden beri bu işletim sistemiyle uğraşıyorum. “Fanatik” olduğum söylenebilir. Ubuntu ise ben dahil birçok kişinin favori dağıtımı.

Bu başlangıçtan sonra bu yazıyı ben okuyor olsam “Neden bekliyorsun? Belli hastasın, işin gücün yok ‘yeni sürüm çıksa da indirsem kurcalasam!’ derdindesin!” derdim ve keşke öyle olsaydı.

Ubuntu 9.04 çok iyiydi. Taş gibiydi. Harika çalışıyordu. Ne zaman ki adamlar “9.10 çıktı” duyurusunu yaptılar ve ben mutlu mutlu sürümü yükselttim, işte o gün dertler başladı.
Eskiden izlediğim filmleri izleyemez, dinlediğim müzikleri dinleyemez olmuştum. “Dert değil, güncelleme çıkar.” diyerek VLC kurdum, idare etmeye başladım. Sistem genel olarak kararsız bir yapıya bürünmüştü ancak yeni sürümün ilk günlerinde normal olduğunu düşünerek üstünde durmadım. Vakıa, bir kaç gün içinde güncellemeler çıktı ki ne güncelleme! Çekirdekten Apache’ye kadar hemen hemen güncellenmedik paket kalmadı. Kalmadı ama, görünürde iyiye giden hiç bir şey yoktu.
Derken iki gün sonra bir güncelleme daha… Yine çekirdekten ofise kadar ve yine düzelme yok.
Olsun, Ubuntu yine canımdı. Bu arada tasksel’i deneyeyim dedim, sağolsun o da makinede gereksiz bulduğu Xorg dahil, paket repoları dahil, ne varsa kaldırıverdi. “Tasksel yerine mkfs yazsak daha iyiymiş!” diye homurdanarak konsoldan makineyi ayağa kaldırmakta birkaç saat içinde muvaffak oldum.

Sonra bir güncelleme daha ve bu sefer Apache de çalışmamaya başladı.” Artık alenen söverek onu da toparladım.
Webcam’in mikrofonun çekmeceye kalkmış olmasını sorundan saymıyorum bile zira webcamim çok sıradan ve ne çok eski ne de çok yeni bir model olmasına rağmen Ubuntu 9.04 de 9.10 da tanımadı. Arayıp bir kernel modülü bulup derledim ve çalıştırmayı başardım ancak kernel güncellemesinden sonra yine dağıldı. İki günde bir webcam modülü ile uğraşmak istemediğimden webcami basitçe söküp, haklı yeri olan çekmeceye kaldırdım.

Şimdilerde güncelleme yöneticisinde bekleyen 300 MB yeni paket var ancak benim de bir sabrım var.
Yayınlanmasına hesapça bir ay kadar kalmış olan Ubuntu 10.4′ten umutluyum, ancak “ne olur ne olmaz” diyerek bir de Debian indirdim, kenarda duruyor.

Paylaş:
  • Print
  • FriendFeed
  • Twitter
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • Blogplay
  • DZone
  • LinkedIn
  • MySpace
  • Ping.fm
  • Reddit
  • StumbleUpon
  • Technorati

Etiketler: , ,

PostgreSQL ile bir gece

Bir kaç ay önce, ailedeki yazılımcı sayısının artmasıyla “Artık şirketi kuralım!” dedik ve Logikit‘i kurduk. Kendimizi tanıtmakla geçen, programcı olarak bana boş vakit tanıyan sürede de Logikit::Framework‘ü (LF) kodladım ve bir kaç ay boyunca LF üstünde küçük ve orta ölçekli bir kaç proje geliştirerek frameworkü geliştirme ve olgunlaştırma olanağı da buldum. Buraya kadar iyi…

Bu ay (Mart 2010) başlarında oldukça büyük ölçekli bir projeye başladım. Usecase’ler yazılıp çizilip tartışıldı, entity relationship diagramlar yapıldı, veritabanı mimarisi oturdu. Projede veritabanı performansı çok önemli ve PostgreSQL kullanıyoruz.

LF’i kodlarken “database abstraction’ı da aradan çıkarıverelim!” diye uyanıklık edip PDO kullandım. Bir sürü RDMBS için sürücüsü var ya, rahatım!

LF’te model için yazdığım abstract class PDO’dan türüyor ve kullanıcı modelleri de bu abstract class’tan. Basit bir active record uygulaması. Kullanıcı (LF kullanan programcı) controller’ında record set için bir array oluşturuyor, bu array’i bizim modele veriyor ve model de duruma göre (“id” alanı varsa) INSERT ya da (“id” alanı yoksa) UPDATE sorgusu oluşturuyor. Tablo adını biliyoruz ama tablo alan adlarını bilmiyoruz.

Daha önce LF üstünde geliştirdiğim projelerin hepsi MySQL kullanıyordu ve benim aklıma da “yazdığım kod başka RDMBS üstünde çalışır mı, çalışmaz mı, çatlar-patlar mı?” soruları gelmedi. “En fazla bir-iki yeri düzeltmek gerekir.” dedim ve geçip gittim.

Projenin planlama aşaması bitip, PostgreSQL tablolar oluşturulup ilk controllerı yazmaya sıra geldiğinde gidip ayarlarımdan sürücüyü (büyük bir güvenle!) “mysql”den “pgsql”e değiştirdim ve safça çalışmasını umuyorum! Çalışmadı tabii…

Bir-iki yeri basitçe fiksledim; her şey normal görünüyor. Array doğru geliyor, tablo adı doğru, velhasıl her şey doğru.
Debug sürecinde daralta daralta çalışmayan yeri buldum: Tablodaki alan adları düzgün gelmiyordu!

MySQL ile kullandığım model asbtract’ında ilgili metod şöyleydi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* Return list of columns
*
* @access   public
* @param        string  tableName
* @return   array
*/


public function columns($tableName)
{
$tableName = strtolower($tableName);

$arrFields = array();
$colQuery = $this->query("SHOW COLUMNS FROM $tableName");
while($col = $colQuery->fetch_array())
{
$arrFields[$col['Field']] = $col;
}

return $arrFields;
}

Şöyle bir durup kafamı kaşıdım: On yıldır yaşamımı yazılımcı olarak kazandığımı anımsadım.
Buna rağmen en son iki yıl kadar önce PostgreSQL ile bir proje geliştirmiştim ve hiç bir durumda tablo alan adlarını öğrenmeye ihtiyaç duymamıştım; zaten o adları hep ben vermiştim!
Doğal olarak LIMIT 1 ile bir sorgu yapıp bu adları öğrenebilirdim ancak hem performanstan yemek gibi bir lüksüm yoktu, hem de bu tür işi kendime yakıştıramadım. Tamam, PostgreSQL uzmanı olmadığımı biliyordum ancak PostgreSQL kullanarak en az 10-12 proje geliştirmiş bir kişi evladı olarak büsbütün cahil olduğumu da ummuyordum.
Biraz deştikten sonra, hayret verici şekilde, aşağıdaki kodun LIMIT 1 sorgusuna göre daha verimli olduğunu gördüm:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/**
* Return list of columns
*
* @access   public
* @param        string  tableName
* @return   array
*/


public function columns($tableName)
{
$tableName = strtolower($tableName);

$arrFields = array();

foreach($this->query("SELECT
a.attname as \"Column\",
pg_catalog.format_type(a.atttypid, a.atttypmod) as \"Datatype\"
FROM
pg_catalog.pg_attribute a
WHERE
a.attnum > 0
AND NOT a.attisdropped
AND a.attrelid = (
SELECT c.oid
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname ~ '^($tableName)$'
AND pg_catalog.pg_table_is_visible(c.oid)
)
;"
) as $col)

{
$arrFields[] = $col[0];
}

return $arrFields;
}

Bu durumda görünen o ki, LF’ün yeni sürümünde en az iki ayrı abstract model olacak.
Başıma yine gelirse anımsamak için bir not…

Paylaş:
  • Print
  • FriendFeed
  • Twitter
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • Blogplay
  • DZone
  • LinkedIn
  • MySpace
  • Ping.fm
  • Reddit
  • StumbleUpon
  • Technorati

Etiketler: , , , ,

Newer entries »