12 Nisan 2021 Pazartesi

MongoDB Arama Listeleme ve Silme

    Bir önceki yazımda Mongodb'ye kısaca giriş yapmıştım ve bir tabloya veri eklemeyi yazmıştım. Bu günkü yazımda da kısaca tablomdaki kayıtları getirmeyi ve yapısı çok benzer olduğu için silme işlemini anlatacağım. Tekrar hatırlatayım. Yazdığım komutlar mongo ya consoldan direk olarak yollayabileceğiniz mongodb komutları. Eğer C#, java yada benzer bir dil üzerinden erişiyorsanız o dilde kullandığınız SDK yapısına uygun olarak komutları değiştirmeniz gerekir.

    MongoDB Arama (Find) komutu

    Mongoda arama ve listeleme için Find ve Aggregate komutlarından birisi kullanılır. aggregate komutu hem işlevi hem de kullanımı biraz karmaşık olduğu için daha sonra tek bir yazıda uzun uzun anlatmayı düşünüyorum. Bu yazıda find komutu ile bir kaç örnek kullanım göstereceğim. En basit kullanımı şöyledir. Yazdığım mongo komutlarının hemen altına Sql dillerindeki karşılığını yazmayı düşünüyorum. Böylece normal veri tabanları ile az çok haşır neşir olanlar daha hızlı anlayabilir.

db.collectionName.find({})

Sql: select * from collectionName

    Bu komut ismini verdiğiniz tablo içindeki tüm kayıtları döker. Hemen altında sql komutu karşılığından da  bunu anlayabilirsiniz. Eğer tablonuzda çok kayıt varsa bu komutu bu şekilde çalıştırmak biraz sıkıntı olabilir. Sonuna limit komutu ekleyerek daha az sayıda veriye göz atabilirsiniz. Skip komutu ile beraber kullanarak sayfalama yapısı da kullanabilirsiniz. Personel adında bir collection olduğunu farz ederek örneklerimi biraz daha somut hale getireyim. 

db.personel.find({}).limit(100) //sadece ilk 100 kaydı getirecektir
Sql : select top 100 * from personel -- veya select * from personel limit 100

db.personel.find({}).skip(200).limit(100) // ilk 200 kaydı atlayacak sonraki 100 kaydı getirecektir.
sql: select * from personel limit 100 offset 200

    Sorgumuza birde where koşulu eklememiz gerekirse find içinde tanımlayabiliriz.

db.personel.find({_id:"564"})  //564 id'li personeli getir.
sql: select * from personel where id = '564'

db.personel.find({maas:{$gte:3000}}) //maaşı 3000 ve üzeri olan personelleri getir.
sql: select * from personel where maas>=3000

db.personel.find({maas:{$lt : 3000}}) //maaşı 3000 den az personelleri getir.
sql: select * from personel where maas<3000

db.personel.find({
    dogumtarihi: {$gte:new Date("1980-01-01"), $lte:new Date("2000-01-01)}
})
//1980 den sonra 2000 den önce doğan personelleri getir.
sql: select * from personel where dogumtarihi between '1980-01-01' and '200-01-01'

db.personel.find({ad:"fatih" , soyad:"abc"}) //adı fatih, soyadı abc olan personelleri getir
db.personel.find({$and : [{ad:"fatih"} ,{ soyad:"abc"}] }) //adı fatih, soyadı abc olan personelleri getir
not: iki kullanımda and operatörü yerine geçer ve aynı sonucu döndürür.
sql: select * from personel where ad = 'fatih' and soyad = 'abc'

db.personel.find({$or: [{ad:"fatih"} ,{ ad:"ali"}] })//adı fatih veya ali olan personelleri getir
sql: select * from personel where ad = 'fatih' or ad = 'ali'

    Bu şekilde çekeceğiniz sorgu ya göre sql sorgularında where bölümüne koşul eklediğini gibi mongo içinde find içine istediğiniz kadar koşul ekleyebiliyorsunuz. 


    MongoDB Silme (DeleteOne, DeleteMany) komutu

    Mongoda silme yani delete işlemi aynı find komutu gibi yapılır. Find komutunda sorgunuzun sonucunda değerler size listelenir ama delete komutunda koşula uyan değerleriniz veri tabanından silinir. İki tane delete komutu vardır. 

  • DeleteOne : Koşulunuza uyan belgelerden ilki silinir.
  • DeleteMany: Koşulunuza uyan tüm belgeler silinir.
Örnek kullanım şu şekildedir. 
db.personel.deleteone({_id:"564"}) // 564 idli personel silinir.
sql:delete from personel where id = '564' //sql de bu komut deletemany gibi çalışır.

db.personel.deletemany({ad:"fatih"}) //fatih ismindeki tüm personeller silinir.
sql: delete from personel where ad = 'fatih' 

    Bu şekilde find içinde kullandığınız tüm şekillerde karmaşık koşullar ekleyerek istediğiniz kaydı silebilirsiniz.



11 Nisan 2021 Pazar

MongoDB Collection InsertOne ve InsertMany

    Bu aralar MongoDB veri tabanı ile çok haşır neşir olduğum için biraz yazmak istedim. Bu konuda internette büyük ihtimal 300 bin tane yazı vardır ama bir tanede benden olsun. Aslında dizi haline getirmeyi düşündüğüm ve muhtemelen pek fazla kişinin okumayacağı bu yazıları en çok kendim için yazıyorum. Çünkü işime yaradığında sağdan soldan toplayıp birleştirip sorun çözdüğüm kodları unutuyorum. Sonradan lazım olunca yine aynı şekilde toplamak zorunda kalıyorum. Bu yüzden buraya yazarak lazım olunca yine kullanmayı planlıyorum.

    Mongo nedir, Nosql nedir, veri tabanı nedir paragrafları açıp uzun uzun anlatmaya gerek yok sanırım. Zaten NoSql camiasının lokomotiflerinden olan Mongo belge (doküman) bazlı bir veri tabanıdır. Yani tablo (collection) içine attığınız her her kayıt bir doküman olarak saklanır ve bu şekilde kullanılır. Bir id değeri ile işaretlenir.

    Mongodb'yi mongodb.com adresinden indirip kurabilirsiniz. Bağlanmak için ücretli ve ücretsiz çeşitli arayüz programları kullanabilirsiniz. ben mongodbmanager.com sitesinden indirdiğim nosql manager programını kullanıyorum. Ücretsiz ve ücretli versiyonu var. Ayrıca sdk paketleri ile neredeyse tüm programlama dillerinden bağlanarak kullanabiliyorsunuz. Arayüzler üzerinden veri ekleme ve basit listeleme ve güncelleme işlemlerini yapabiliyorsunuz. Bu kısmı anlatmaya gerek yok ben mongo sorguları ile yapılacak işlemleri anlatacağım. Belki arada C# dilinden linq kullanımı da anlatırım. 


    Collection Oluşturma ve Veri Ekleme 

    MongoDB'de sabit bir veri yapısı zorunlu olmadığı için collection oluşturmak için özel bir komut çalıştırmanıza gerek yoktur. Eğer bir collection ismi vererek bir kayıt eklerseniz eğer collection varsa kaydı içine ekleyecek yoksa yeni bir collection oluşturacak ve kaydı onun içine ekleyecektir. Kayıt ekleme kodu InsertOne veya InsertMany komutları kullanılır.  Mesela Personel adlı bir collection'a yeni bir kayıt eklemek için;

db.Personel.InsertOne({
    "Ad":"Fatih",
    "Soyad":"Abc",
    "DogumTarihi":ISODate("1900-10-01T00:00:00.000Z"),
     "Sicil":1234

})

Belgeleri json formatında olması gerekiyor.Json belgenize _id alanı ve değeri eklerseniz bu belgenizin id'si olacaktır. Eğer id değeri vermezseniz mongodb kendisine özel olan  ObjectId formatında bir değer oluşturacak ve belgeye ekleyecektir. koleksiyona aynı sorguda birden fazla değer eklemek için InsertMany aşağıdkai şekilde komutu kullanılabilir. 

db.Personel.InsertMany([{
    "Ad":"Fatih",
    "Soyad":"Abc",
    "DogumTarihi":ISODate("1900-10-01T00:00:00.000Z"),
     "Sicil":1234

},
{
    "Ad":"Ali",
    "Soyad":"Abc",
    "DogumTarihi":ISODate("1900-10-01T00:00:00.000Z"),
     "Sicil":1234,
    "Maas":1234.67
},
{
    "_id":"6072214beb7726f28265870d",
    "Ad":"Ayşe",
    "Soyad":"Abc",
    "DogumTarihi":ISODate("1900-10-01T00:00:00.000Z"),
     "Sicil":1234
}]
)

Mongodb NoSql sistemlerin doğası gereği şema bağımsızdır. yani aynı koleksiyonda olsa bile tüm belgeler farklı tipte ve isimde alanlara sahip olabilirler. Mesela örneğimizde ilk kayıtta 4 alan varken ikinci kayıtta 5 alan var. İçerdeki kayıtların nasıl olacağı tamamen sizin programlarınızdaki ihtiyacınızla sınırlı. İsterseniz normal veri tabanları gibi koleksiyon içindeki tüm kayıtları aynı formatta saklarsınız isterseniz her belge içinde farklı formatlar saklarsınız. Tabi veriler kullanırken içinden çıkabilecekseniz :) 

Koleksiyon içine atabileceğiniz veriler json formatındaki veri tipleri ve özel bir kaç tipi içeriyor. Özel tip olarak en çok kullanacağınız ObjectId, Date, UUID tipleridir. Ayrıca iç içe dökümanlar ve arraylar ile istediğiniz formatta veri saklayabilirsiniz. 

16 Nisan 2018 Pazartesi

sql ile taklalar - partition by (dense_rank) kullanımı

      Merhabalar.

      3 gün önce yarın yazarım dediğim yazıyı 3 gün sonunda yazabiliyorum bloğa. Gerçi okuyan olur mu biloğa yarar mı bilmiyorum. :) Önceki yazımda partition by kullanımından kısaca bahsetmiştim ve row_number ile bir örnek yapmıştım. Sql sorgularında partition by benim bildiğim 3 farklı sıralama şekli ile kullanılabiliyor. row_number, rank ve dense_rank. partition by ifadesinin sorgu sonucunu parçaladığını ve parçalar içinde sıralama yaptığından bahsetmiştim. Bu üç sıralama türüde işte bu parçalar içindeki satır numaralarının nasıl artacağına karar vermek için kullanılıyor. Kısaca aralarındaki farkı şöyle anlatabilirim.
  • row_number : parça içindeki satırlar order by ifadesindeki kolona göre 1 den itibaren numaralandırıyor.
  • dense_rank : parça içindeki satırların numarası sadece order by ifadesindeki kolon değeri değiştikçe arttırılıyor.
  • rank :  parça içindeki satırların numarası row_number'da olduğu gibi arttırılıyor ama sadece order by ifadesindeki kolon değeri değiştikçe sonuca yansıtılıyor.


      Aralarındaki farklı daha kolay anlamak için internette rastladığım basit bir örneği paylaşarak anlatayım.

WITH T(StyleID, ID)
     AS (SELECT 1,2 UNION ALL
         SELECT 1,2 UNION ALL
         SELECT 1,2 UNION ALL
         SELECT 1,5)
SELECT *,
       RANK() OVER(PARTITION BY StyleID ORDER BY ID)       AS 'RANK',
       ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) AS 'ROW_NUMBER',
       DENSE_RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS 'DENSE_RANK'
FROM   T 

      Sorgu sonucu




      Farkı gösteren örneğin ardından dense_rank kullanımı ile ilgili canlı bir örnek yazarak gerçek hayatta nasıl kullanılabileceğini göstermek istiyorum. Örneğim için şöyle bir senaryo düşünün. Bir özel okulda her sınıftan birden fazla şube (1A, 1B, 2A, 2B gibi) var. Her şube için bir öğretmen seçilmiş ve öğrenciler her şubeye en fazla 20 kişi gelecek şekilde kendi bulunduğu sınıf seviyesinde bir şubeye atanması yapılacak. Normalde bu işlem için her sınıf için öğrenci listesini çekip bir döngü ile 20-20 insert edilmesi gerekiyor ama dense_rank sayesinde bu parçalama ve atama işlemini tek sorgu ile yapabiliriz. Şimdi bu sorunu çözeceğini düşündüğüm sorguyu paylaşayım.
SELECT * FROM (
SELECT a.ogretmen_id, a.ogretmen_adi, a.sinif, a.sube, b.ogrenci_id, b.ogrenci_adi,
DENSE_RANK() OVER(PARTITION BY a.sinif, a.ogretmen_id ORDER BY b.ogrenci_id) rn_ogretmen,
DENSE_RANK() OVER)PARTITION BY o.sinif ORDER BY a.ogretmen_id) rn_ogrenci
FROM ogretmen a 
INNER JOIN ogrenci b ON a.sinif = b.sinif
) c

WHERE c.rn_ogretmen BETWEEN (20 * c.rn_ogrenci) - 19 AND (20 * c.rn_ogrenci) 

      Sorgunun yaptığı işi kısaca anlatmak gerekirse her öğretmen karşısına öğretmenin ders vereceği sınıf seviyesindeki tüm öğrenciler getiriliyor ve her sınıf seviyesi için öğrenci sayısı x öğretmen sayısı kadar satır oluşuyor. Satırlara iki farklı numara veriliyor. Birincisi her öğretmen için bir sıra numarası. İkincisi her öğretmenin karşısındaki her öğrenciye bir satır numarası. Öğretmen sıra numarasını 20 ile çarparak öğrenci sırası ile karşılaştırdığımızda her öğretmen için 20 öğrenci seçmiş oluyoruz. Mesela

  • 1. öğretmen için (20 * 1) - 19 ve (20 * 1) = 1..20, 
  • 2. öğretmen için (20 * 2) - 19 ve (20 * 2) = 21..40,
şeklinde en fazla 20 öğrenci olacak şekilde tüm öğretmenler ve öğrenciler eşleştiriliyor. Bu sorguya eğer biliniyorsa öğrencilerin önceki yıl yada deneme sınavı puanları veya öğretmenlerin performans puanları eklenerek atama işine öğrenci başarı derecesine göre sınıflandırma ve benzeri şeyler katılabilir. insert into ile sorgu sonucu doğrudan istediğiniz tabloya basılabilir

13 Nisan 2018 Cuma

sql ile taklalar - partition by (row_number) kullanımı

      Merhabalar. 

      Kaç zamandır ortadoğu ve balkanların en tembel yazılımcısı olarak bloğumun adını tembel-programci olarak değiştirmeyi düşünüyorum ama çok üşeniyorum:) Neyse 2 buçuk yıllık İstanbul gezmelerinde yapıp geldikten sonra biz İzmir yazısı yazayım dedim. İstanbul'daki iş hayatımda türlü türlü sql sorgu taklaları attıktan sonra olaya sql yazısı ile geri döneyim dedim. sql sorguları yazarken guruplama ve gurup içindeki en küçük yada en büyük elemanı bulmak çok sık kullandığımız bir işlem. Bu işlemi genelde group by ile çözüyoruz ama bazen gurup içindeki en büyük değeri almak yetmiyor en büyük yada en küçük değerin olduğu tüm satırı almak gerekebiliyor. 

      Mesela veritabanındaki tüm müşterilerin son alışverişlerinin tutarlarını listelemek gibi. Bu gibi durumlarda imdadımıza partition by ifadesi yetişiyor. Konuyu daha anlaşılır kılmak için basit bir örnek yapmak iyi olur sanırım. Bu arada elimin altında hazır olduğu için örnekleri MS Sql Server üzerinde yazacağım. Diğer sql sunucuları içinde sorgular çok farklı değil. 

    SELECT musteri_adi, musteri_no, fatura_tarih, fatura_toplam 
    FROM (
        SELECT m.musteri_adi, m.musteri_no, f.fatura_tarih, f.fatura_toplam, 
            ROW_NUMBER() OVER(PARTITION BY m.musteri_id ORDER BY f.fatura_tarihi DESC) rn 
        FROM fatura f
            INNER JOIN musteri m ON f.musteri_id = m.musteri_id
        WHERE fatura_iptal = 0
    ) fl

    WHERE fl.rn = 1

      Örneği kısaca anlatarak anlamayı kolaylaştırayım. içerideki sorguda müşterilerin tüm faturaları listeleniyor. partition by ile sorgu sonucu musteri_id alanındaki degerlere göre parçalanıyor ve fatura_tarihi alanına göre ters sıra ile her satır rn alanında numaralandırılıyor. Yani her müşteri için sıra 1'den başlayarak her faturası için ilerliyor. Dıştaki sorguda rn = 1 şartı ile her müşteri faturası için sadece ilk kaydın seçilmesi sağlanıyor. 

     Aslında bugün farklı bir konu anlatmayı düşünüyordum. Bu hafta içinde iş yerinde önemli bir sorunu cursor kullanmak yerine dense_rank ile çok harika bir şekilde çözmüş ve bununla ilgili bir örnek anlatacaktım ama konuyu geriden alınca saat geç oldu. Artık yarın yada bir kaç yıl sonra onuda yazarım...

10 Ekim 2014 Cuma

İlk bakışta Windows 10: Windows 7 + Windows 8 = Windows 10

        Bir buçuk yıl aradan sonra yeniden merhaba. Blog gezegeninin en tembel yazarı benim sanırım. Şu işe biraz daha ağırlık versem çok iyi olacak. Kaç tane programlama dili ile uğraşıyorum, kaç değişik sorunla karşılaşıyorum ama yazma işine gelince hep kaytarıyorum. Acaba bu yazma alışkanlığı için iğne ilaç falan bir şey var mı? Bir doktora görünüp sormak lazım. Neyse konuya döneyim en iyisi.

        Microsoft yeni işletim sistemini sonunda duyurdu. Bill amcanın yeni bebeği "Windows 10". 1 Ekim itibari ile Windows 10 Teknik Önizlemesi tanıtıldı ve Bilişimciler yani bizler için yayınlandı. Bayram seyran derken bende ancak bugün fırsat bulup indirebildim. Tabi merakımı gidermek için hemen Hyper-V üzerine kurup azıcık inceledim. Bu arada Hyper-V'yide ilk defa kullandım. Normalde Virtual Box kullanıyordum. Onun deneme işide aradan çıksın istedim.

        İlk edindiğim izlenim şu oldu : Bence Microsoft böyle sık sık yeni sürüm çıkarmayıp bunun yerine şimdilik 8.2, 8.3 falan diye devam edip gitse daha iyi olurmuş. Yani bir kahramanlık yapıncaya kadar İşletim Sistemlerine yeni isimler vermesin. Görsel olarak pek bir yenilik yok. Linux sistemlerde yıllardır olan "Çoklu Masaüstü" özelliği eklenmiş. Başlat Menüsünde Windows 7 ile Windows 8'i birleştirmişler. Tam ekran başlat menüsü olayına herkes şikayet edince eskiye dönüp onun yanına da Metro Style Araçlarını basmışlar. Al sana yeni bir tasarım. Tabi bununla da kalmamışlar tam ekran açılan yeni nesil Metro Style uygulamalarını da normal pencere olarak düzenlemişler. Bence buda yeni bir tasarım harikası. Microsoft bizim mehter takımı gibi oldu artık. İki ileri bir geri. Yeniliklerle ilgili siteden "What is new?" bölümünü'de okudum ama tasarım haricinde güvenlikten bahsedilmiş ama henüz incelemedim. Umarım bir yerlerde kayda değer bir kaç yenilik olmuştur.

        Yeni bir tasarım yap yeni sürüm diye çıkar piyasaya herkese mecburi olarak sat. Beğenmediler mi? O zaman geri eski tasarıma dön bir sürüm daha çıkart onuda sat. Birde Android telefonumu 2.3.3 sürümünden 4.1.2 sürümüne (arada 3 defa sürüm yükseltmesi oldu) yükselttim. Bir tane telefon numaram veya uygulamam bile silinmedi. Hiç bir uygulamanın ayarı dahi kaybolmadı. Windows'a hala format atmadan kurulum için bir çare bulamadılar. Tabi bunlar ilk izlenimlerim. Daha ayrıntılı olarak inceleme yapacağım. O zaman fikrimi değiştirecek yeni şeyler keşfedince tekrar bir şeyler karalarım...

     

31 Mart 2013 Pazar

Hayal kurmayı beceremeyenlerin hayali:PARDUS

    Evet acımasız bir başlık:"Hayal kurmayı beceremeyenler". Yani bizler. Yani bizi yönetenler.. Yani bu yönetenleri seçenler. Hemen belirteyim. Yazımda hiç bir siyasi övme, yerme yada atıf yok. Yönetenler derken hükümet yada partiyle alakalı bir durum değil. Çünkü bu yazıda geçenleri farklı bir şekilde yapıp her şeyi yüzüne gözüne bulaştırmayacak bir irade şu anda hiç bir partide yok. Yani siyasi olarak kim gelirse gelsin durum değişmeyecekti. Çünkü biz millet olarak hayal kurmayı beceremiyoruz. 

    Pardus projesi kullanma imkanı olmasa bile Linux yada diğer açık kaynak projelerine değer veren bir çok Türk'ün gurur kaynağıydı sanırım. Bende ilk defa üniversitede bölüme yeni başladığım zamanlarda duymuştum. İnsanların Xp kurmaya çalışırken "Kuruluma başlamak için bir tuşa basın..." yazısını unutup kaçırana kadar bilgisayara defalarca format attığı yıllardı (Durumu yaşayanlar espriyi anlamıştır). Linux ile ilk tanışmam Ubuntu ile olmuştu. Muhteşem bir fikir ile çalışan ve kurulan sistemi aynı cd içine toplamışlardı. Yani merak ettiğiniz zaman bilgisayarınıza takıp başlatıyor, saatlerce kurcalıyor ve sonra cd yi çıkardığınızda hiç bir şey olmamış gibi Xp hapishanesine dönüyordunuz. Mahkumların hapishane avlusunda volta atması gibi bir şey olsa gerek. Sonra nette dolaşırken rastgele Pardus projesi haberine rastlamıştım. Zerre boyutundaki Linux bilgime rağmen beni bile heyecanlandıran bir haber vardı. Milli İşletim Sistemi Pardus

    İnanılmaz bir haberdi. Dünyada binlerce gönüllünün vakıflar ve dev bütçeli şirketler ile desteklenerek ortaya çıkardıkları sistemlere bir tane de Türk Markası ekleniyordu. Aslında o zaman ilk şunu düşündüm. Linux açık kaynak kodlu ise ve her hangi bir kişi internetden istediği zaman kodları indirip istediği değişikliği yapma özgürlüğüne sahipse. Bizimkilerde bir Linux kodu indirip resimleri ve adını değiştirip bize milli diye kakalamasınlar. Tabi zamanla edindiğim bilgilerle Pardus projesini çok daha iyi anlayabildim. Bir kakalama projesi değil yeni bir tasarım projesiydi. Bir elin parmağını bile geçmeyen dağıtım alt yapılarından hiç birini kullanmak yerine kendi alt yapısını oluşturacaktı. Bunun için pisi (paket yönetim sistemi) başta olmak üzere bir çok araç yeniden yazıldı. Özellikle diğer dağıtımlarda çıkan sorunlar incelenip ve bu sorunlar en baştan giderilecek şekilde geliştiriliyordu. Bu nedenle özellikle Pisi dünyadaki açık kaynak gönüllülerinin büyük beğenisini toplamıştı.  
Eeee Ne güzel yapmışlar işte neden hayal mayal çamur atıyorum ki şimdi ben.
    Evet ilk aşamada her şey çok güzeldi ama sonrasında değil. Öncelikle devlet kendi değerine hiç bir zaman sahip çıkmadı. Geliştirilmesi için milyonlar harcadığı projeyi hiç bir zaman kullanmaya tenezzül etmedi. Hiç bir kamu kurumunda Pardus kullanılacak diye bir şart koymadı. Hatta tenezzül edenleri bile engelledi. Nasıl mı? Devletin alt Belediyeler gibi alt birimlerden rutin olarak istediği tüm bilgiler ya Microsoft formatlarında (özellikle neredeyse tüm listeler Excel formatında) isteniyor yada bu bilgileri girmek için açtığınız plaformlar İnternet Explorer haricinde çalışmıyor. Yani devlete rutin bilgi iletebilmesi için her hangi bir kamu kurumunun en az bir bilgisayarında Windows ve Office kurulu olması gerekiyor. Tabi bu durumda kim diğerlerine Pardus kurar?

    Bunun en acı örneği de Kütahya Milletvekili Prof. Dr. Alim Işık'ın TBMM'ye verdiği bir soru önergesine verilen cevap sanırım. Soru önergesinde özetle "Arkadaş madem o kadar para harcayıp milli işletim sistemi yaptınız. niye kullanmıyorsunuz?" diyor. Cevaplardan bazıları içler acısı:

  • Bakanlık bünyesinde kullanılan teknolojilerin pek çoğu PARDUS işletim sistemi tarafından desteklenmemektedir. Aktif dizin, E-posta sistemi ve saallaştırma bunların başında gelmektedir. ( rapuru hazırlayanların bu terimlerden ne anladığını çok merak ediyorum).....
  • Ancak bakanlığımız ilgili kuruluşu bünyesinde Pardus sistemi ve donanımlarının gelecek dönemde kullanımı konusunda uygulamalar takip edilmekte olup maliyetin uygun görüldüğü, standartların sağlaması, veri uygunluğu sorunu çözülmesi ve falan filan mırt zırt (sonuçta Pardus kurmak için özel bir uzay bilgisayarına ihtiyacın var zaten Pardus lisanslarıda bir kaç milyon dolar olduğundan uygun donanım bulursak ve lisans ücreti de azcık düşerse kullanırız)
    Bu sadece Çevre ve Şehircilik Bakanlığından gelen cevap kim bilir diğer cevaplarda ne komediler vardır. Cevabın aslına buradan konuyla ilgili başka bir yoruma da buradan ulaşabilirsiniz.

   İkinci olarak ilk öğretim yada meslek lisesi bilişim bölümlerinde hiç bir yerde Pardus ile ilgili ders koyulmadı. Çocuklara ısrarla Windows ve Microsoft yazılım geliştirme araçları öğretildi. Java'ya hiç tenezzül edilmedi, Php gittikçe azaldı ki şu an bir çok meslek lisesinde müfredattan çıkartılmıştır. Python adını bilen bilgisayar öğretmeni sayısını çok merak ediyorum. C ve C++ ya hiç girmiyorum.

    Sonra hikaye uydurdular. F@tih projesi ve bu projede Pardus kullanılacak diye. (Bu arada Fatih projesinin fikrini 2009 yılında Sanayi Bakanlığı Tekno Girişim yarışmasına sunmuş ve reddedilmiştim  Acaba projeye o yüzden mi benim adımı verdiler :)  Hikayeye göre projedeki tüm tahtalara ve daha sonra tabletlere Pardus yüklenecekti. Böylece hem milli proje milli kaynaklarla ortaya çıkarılacak ve proje maliyeti önemli ölçüde düşürülecek hemde Pardus projesinin gelişimine önemli katkılar sağlayacaktı. Hikayeye uygun olarak tüm akıllı tahtalara Pardus yüklendi ama Bill amca imdadımıza hemen yetişti. Geldi bir şeyler vadetti ve istediği peşkeşi aldı. Sonra hikayeye hemen bir ekleme yapıldı ve Akıllı tahtalar Pardus ile çalışmıyor denip tüm tahtalara ek olarak Windows yüklendi ve varsayılan olarak ayarlandı. Zaten yeni bir şey öğrenmekten aciz öğretmenlerimiz klavye olmamasını da bahane ederek hiç bir zaman Pardus'u o akıllı tahtalarda açmadılar ve açmayacaklar. Yani sadece göstermelik ve Milli Yatırım Yalanı.

     Pardus'a en büyük darbede geçen yıl vuruldu. Önce projenin durdurulduğu açıklandı. Sonrada uydurma bir komisyon toplandı ve öldürücü darbeyi indiren kararı aldı. Özgünlüğü ile övünç kaynağı olan ve tüm dünyada açık kaynak gönüllülerinin dikkatini çeken Pardus artık özgünlüğünü kaybedecekti. Kendi alt yapısını bırakacak ve Debian alt yapısını kullanmaya başlayacaktı. Tam olarak istedikleri gibi oldu ve Pardus 2013 Sürümü Debian alt yapısı ile çıktı. Artık milli işletim sistemimiz yok yerine Milli Ubuntu kopyamız var.

    Neyse gece gece yine ayranım kabardı. Ayranım kabardı deyince de üniversiteden bir hocamın (şahsi olarak hoca demeyi uygun bulmuyorum aslında ama kişiyi ifade edecek başka bir kelime bulamadım) kulaklarını çınlatmak istiyorum. Aklıma geldiğinde hep çok iyi(!) duygularla anarım kendisini...

26 Ocak 2013 Cumartesi

Yeni Oyuncağım Android...

    Uzun zamandır Android ile uğraşmak istiyordum ama zaman bulamıyordum(Tembellik faktörü göz ardı edildiğinde :). Sonunda şirketin projesi için başlayabildim. Android programlama alt yapısı çok güzel hazırlanmış ve oldukça keyifli bir ortam. Özelle de Eclipse'in gelişmiş IDE Alt yapısı ile keyfini katlıyor. Bu arada uzun zamandır ihmal ettiğim Java'ya geri dönmeme vesile olduğu için kendilerine ayrıca teşekkür ediyorum.

    Android'i Anlamak
    Bir çok makaleden de okuduğunuz gibi Android programları Activity sınıfından türetilen sınıflardan oluşuyor. Bu yapı çok yabancı değil. Aynı C# programlamadaki Form sınıfları gibi. Activity içinde arayüzü dosyasını çağırarak görsel ara yüzünüzü oluşturuyorsunuz. Arayüz dosyaları res/Layout klasöründe saklanıyor ve xml biçiminde tasarlanıyor. xml form tasarımı daha sonradan Microsoft'un da SilverLight ve devamı olan WPF ile yöneldiği yeni nesil arayüz tasarım standardı. Java'da FX platformunda xml dilinin bir türevini kullanıyor.(Bir sonraki oyuncağım JavaFx olsa ne güzel olur) Tabi tüm bilgisayar dillerinin ve işletim sistemlerinin atası C'de geri kalmadı. C dili ile kolayca fırtınalar estirmenin kaynağı Qt alt yapısında görsel arayüz tasarımı için çok gelişmiş bir xml dil kullanıyor. Hatta o kadar gelişmiş ki bir butonun görünü web sayfası gibi html tasarlayıp css ile süsleyebilirsiniz. Dur be kafam nereye gittin yine.

     Android'in en güzel yönlerinden bir tanesi tüm string ifadeleri farklı bir xml dosya içinde saklıyor ve çok kolay yerleştirebiliyor olması.(Tamam bende biliyorum bunu diğerlerinin de yapabildiğini ama diğerleri zorlamıyor ki. Mecbur değilsem niye yapayım :) Android programlama sırasında Android işletim sistemiyle tam olarak bütünleşiyorsunuz. Bütünleşme ile ilgili en önemli kısım izinler.

    Android ve izinleri
    Windows sisteminin sürekli yapmaya çalışıp beceremediği her defasında kullanıcı ayarlarından Hesap Denetimi'ni kapatmakla sonuçlanan... Linux sistemlerin fazlasıyla abartıp her defasında parola sorması ile kanser eden en büyük sorundur izinler. Nitekim birinde tamamen güvenliği kapatıp kurtulursunuz (neden sık sık format atmak zorunda kaldığımı anladım galiba) ama diğerinde böyle bir lüksünüz yoktur. Yani kendi bilgisayarınızda güvenlik açığı açmak özgürlüğünüz bile yoktur. Keşke çokça param olsaydı da 2 bilgisayar parsına bir tane Mac alıp onuda öğrenip eleştirebilseydim :( 

    Peki Google'in en başarılı bebeklerinden birisi olan Android bu sorunu nasıl aşmış. Çok zekice bir yöntem ile: Kurulan tüm programlara kurulum sırasında izin vererek. Android kullananlar Play'dan program yada oyun indirirken görmüşlerdir mutlaka. Program kurulmadan önce izinler sıralanır ve sizden bu izinleri onaylamanızı ister. Konumunuzu Alma, İnternete Erişim, Rehberinize Erişim vs. Bu izin listesinde olmayan hiç bir işleme ulaşma yetkisi yoktur. Peki bu yetkiler dahilinde kötü bir şey yapamaz mı. Tabi rehbere erişim ve internete erişim yetkisi olan birinin sizin rehberinizi kopyalayıp kendi sunucusuna atmasına engel olamazsınız. Bu yüzden program kurarken mutlaka izinleri okuyup programın çalışmasıyla alakası olmayan izinler varsa programı kurmayın. Android bu izin sistemini nasıl bu kadar iyi denetliyor derseniz işte orası asıl zekanın yeri. Tam bir makale konusu. 

    Tasarım
    Android için arayüz tasarlarken bir form yada bir sayfa ile başlamak zorunda değilsiniz. Bir arayüz direk bir buton yada bir listbox'da olabilir. İç içe geçmiş onlarca elemandan da oluşabilir. Yalnız aynı katmanda 80'den fazla eleman kullanınca performans uyarısı yapmaya başlıyor. Yuh 80 tane elemanın bir sayfada ne işi var demeyin sonuçta lazım oluyor. :) Tabi bu uyarı Eclipse'in söylediği sadece performansın kötü etkilenebileceğine dair bir uyarı yani bir kısıtlama değil. Eclipse sisteminde programınızı daha düzenli yazmanız için çok güzel yönlendirmeler var. Sırası geldikçe onlardan da bahsederim. 

    Tasarım için sayfanın en üst katmanı genelde Layout oluyor. Temelde Grid, Linear,Relative ve Table olarak 4 tane layout var. Şimdi anlatayım hepsini diyeceğim ama adından belli zaten diyip geçesim var.

    Neyse ya ne zaten kahvemde bitti. Sonra yazarken bahsederim yine..