Monthly Archives: Şubat 2015

Genel

Para Yönelimli Programlama (PYP)

Para Yönelimli Programlama (PYP)Para Yönelimli Programlama, programlama eyleminin para ekseninde gerçekleştirildiği yazılım geliştirme faaliyetidir. Geliştiriciler arasında “Dark Side”, “Para Çokomel”, “Parasıyla değil mi ?” sözleriyle de ifade edilen bu yaklaşımı, bu yazıda birlikte irdeleyeceğiz.

PYP, aslında hepimizin bildiği algülüm vergülüm esasına dayanan ticari bir faaliyetten başka birşey değildir. İşverenin, yazılım geliştirme ihtiyaçlarının karşılanması doğrultusunda aylık periyodlarla yaptığı maaş ödemesine istinaden, geliştiricinin işveren beklentilerini makul sürelerde karşılaması esasına dayanır.

Adından da anlaşılacağı üzere programlama faaliyeti asla mantık ekseninde gerçekleştirilmez. İşin içeriği, yaratacağı prestij kaybı, görsel/mantıksal/fonksiyonel problemler geliştiriciyi ilgilendirmez. Ödemeler düzgün gerçekleştiği sürece müşteri her zaman haklıdır. Ödemenin aksaması, rakip veya farklı sektördeki firmanın yapacağı X+1 lik ücret teklifi mevcut firmayla olan ilişkilerin aynı gün sonlanmasına neden olabilir. (Mevcut firmanın x-1 lik personeli temin edebilmesi durumunda mevcut personelin işine aynı gün sonverebildiği gibi.)

PYP uygulayan geliştiricinin egosu ve fikri olmaz. Şayet fikri varsa ısrarcı olmaz. Tartışmaya girmez. Alınacak nihayi cevap her zaman için “Ok o zaman o şekilde yapalım.” şeklindedir. Kıdeme bağlı olarak “parasıyla değil mi ?” gibi türlü varyasyonların da duyulması mümkündür.

Para Yönelimli Programlama (PYP)Bu tip geliştiriciler, yedi köyle barışık denilecek cinsten insanlardır. Sistemcisinden, proje yöneticisine ve diğer tüm ekip arkadaşlarıyla tam anlamıyla uyum içindedir. Asla laf taşımaz. İşinin yürümesi için herşeyi yapar. Nabza göre şerbet verir. İtin köpeğin önde gidenidir. İş bitiricidir. Üretimin süreci ve sonucu göz önünde bulundurulduğunda aslında her PYP geliştiricisi DGYP ve GGYP yaklaşımlarını da benimser. (Bkz. Daya Geç Yönelimli Programlama (DGYP). Bkz. Goygoy Yönelimli Programlama (GGYP)) Projedeki mevcut özellik defalarca kaldırılıp eklense de asla üşenmez, yorum getirmez. İşverenin kendisine bunun için para ödediğinin bilincindedir.

PYP uygulayan geliştirci, bir projenin öyle veya böyle yayına çıkabilmesi adına her firmada en az birkaç tane bulunması gereken geliştirici tipidir. Ego tatminin yaşanacağı yer işyeri olmadığından işverenin yazılım geliştiricinin egosunun tatmin etmek için iş beğendirmek veya her an yeni bir challange yaratmak gibi bir mecburiyeti yoktur. İşveren para karşılığında geliştiricinin bilgisini ve zamanını satın alır.

Pahalıdır. Standart bir yazılım geliştiriciyi X liraya, bir rockstar ı X+1 liraya çalıştırabilirsiniz. Deneyimli bir PYP geliştiricisini X+2 liraya çalıştıramazsınız. Şayet anlaşsanız bile daha iyi şartları sağlayan başka bir firma bulduğu gün yerinde yeller eser.

Sadakat ancak hayvanlarla insanlar arasında yaşanabilecek bir duygudur. Bu nedenle firmanın geliştiriciden sadakat beklentisi son derece yersizdir. PYP geliştiricisi, yukarıda belirtilen ücret politikası nedeniyle asla herhangibir projede tek adam olarak konumlandırılmamalıdır. Çünkü her an herşey olabilir :)

Genel

CSV verisinin MySQL Shell Üzerinden Veritabanına Aktarılması

MySQL shell arabirimi ile satır adedi yüksek verilerinizi ekstra bir betik yazmaksızın SQL komutları ile hızlıca içeri alabilirsiniz.

Aşağıdaki örnekde görülen dosyada 1 başlık, 8022 veri satırı bulunmaktadır.

LOAD DATA LOCAL INFILE 'hede-ticaret.csv'
INTO TABLE catalog_stock 
FIELDS TERMINATED BY ',' ENCLOSED BY '\"' 
LINES TERMINATED BY '\n' STARTING BY ''
IGNORE 1 LINES
(@ignore, code, name, @ignore, @ignore, brand, status, @ignore, provider)
SET status = 0, `provider`='hede'; 

Dilerseniz yukarıdaki örneği birlikte satır satır inceleyelim.

LOAD DATA LOCAL INFILE 'hede-ticaret.csv'

Verilerin hangi dosyadan okunacağını belirttik.

INTO TABLE catalog_stock 

Okunan verilerin hangi tabloya yazılacağını belirttik.

FIELDS TERMINATED BY ',' ENCLOSED BY '\"' 

Yukarıdaki TERMINATED BY ifadesi ile her bir alanın hangi karakter ile sonlandığını (bunu alan ayracı olarak da ifade edebiliriz.), ENCLOSED BY ifadesi ile alanın kapsayıcı karakterini tanımlıyoruz. Bu tanımlama herhangibir alanın içeriğinde alan ayracını içeren bir veri varsa parser ın bunun aslında alanın içeriğine dahil olduğunu anlamasını sağlıyor.

LINES TERMINATED BY '\n' STARTING BY ''

Her bir satırın \n karakteri ile sonlandığını boş metin ile başladığını belirttik.

IGNORE 1 LINES

Örnekde kullandığım dosyanın ilk satırının başlık/alan isimlerini içerdiğini belirtmiştim. Yukarıdaki tanımlama ile ilk satırı yok sayıyoruz.

(@ignore, code, name, @ignore, @ignore, brand, status, @ignore, provider)
SET status = 0, `provider`='hede'; 

Verdiğim örnekde veritabanındaki alan sayısı ve sırası csv dosyasınınkinden farklı olduğu için yukarıdaki tanımlamayla csv dosyasının ilk kolonundan başlayarak veritabanındaki hangi alanla eşleşeceği bilgisini tanımlıyoruz. Ayrıca SET komutu ile de status ve provider alanları için varsayılan bir değer yazdırıyoruz.
Yukarıda gördüğünüz @ignore ifadesi csv dosyasında bulunan, ancak veritabanında karşılığı olmayan alanlar için csv satırından gelen veriyi ignore isimli bir değişkene göndererek sıradaki alanla ilgili eşleştirmenin pas geçilmesini sağlıyor.

Son olarak yukarıdaki komutların çıktısı aşağıda görüldüğü gibidir.

Query OK, 8022 rows affected, 8022 warnings (0.16 sec)
Records: 8022  Deleted: 0  Skipped: 0  Warnings: 8022

Gerçekleştirdğiniz içe alım işlemi ile ilgili hataları görmek için SHOW WARNINGS komutunu kullanabilirsiniz.

SHOW WARNINGS LIMIT 0,10;

Sonuç:

+---------+------+----------------------------------------------------------------------------+
| Level   | Code | Message                                                                    |
+---------+------+----------------------------------------------------------------------------+
| Warning | 1262 | Row 1 was truncated; it contained more data than there were input columns  |
| Warning | 1262 | Row 2 was truncated; it contained more data than there were input columns  |
| Warning | 1262 | Row 3 was truncated; it contained more data than there were input columns  |
| Warning | 1262 | Row 4 was truncated; it contained more data than there were input columns  |
| Warning | 1262 | Row 5 was truncated; it contained more data than there were input columns  |
| Warning | 1262 | Row 6 was truncated; it contained more data than there were input columns  |
| Warning | 1262 | Row 7 was truncated; it contained more data than there were input columns  |
| Warning | 1262 | Row 8 was truncated; it contained more data than there were input columns  |
| Warning | 1262 | Row 9 was truncated; it contained more data than there were input columns  |
| Warning | 1262 | Row 10 was truncated; it contained more data than there were input columns |
+---------+------+----------------------------------------------------------------------------+

Yukarıdaki örnekde kullandığım csv dosyası veritabanındaki tabloda yeralan alan sayısından daha fazla alan içeriyordu. Bu nedenle her bir satır için “Row N was truncated; it contained more data than there were input columns” hatasını aldım.

Karşılaşılabilecek Problemler:

ERROR 1148 (42000): The used command is not allowed with this MySQL version

LOAD DATA komutu metin dosyasını istemci makinede arayacaktır. Ancak bu durum bazı güvenlik sorunlarına neden olabileceği için mysql client, –local-infile=1 parametresi ile çalıştırılmalıdır.

LOAD DATA komutu ile ilgili diğer detaylar için bu dökümanı inceleyebilirsiniz.