Forum: D Programlama Dili RSS
JSON Ayrıştırıcı Sınıfları
JSON Parser Classes
Sayfa:  önceki  1  2  3  sonraki 
Avatar
Salih Dinçer #16
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 6023
İzninizle şu kısmı değiştirmeyi öneriyorum...
JSONValue JSONBelgesi()
{
    JSONValue json;
    json.type = JSON_TYPE.OBJECT;
    return json;
}
Yerine, main() içinde tek satır ekleyerek (8-10 satır çıkararak) şu şekilde kullansak?
    JSONValue belge;
    belge.type = JSON_TYPE.OBJECT;
    belge.object["öğrenciler"] = to!JSONValue(öğrenciler);
Bu şimdilik basit ve küçük bir katkım olabilir. Çünkü henüz tüm kodu kavrayamadım. Kavramayı kolaylaştırmak içinde gereksiz bir işlevi kaldırarak işleri çok küçük bir miktar da olsa basitleştirdim. En azından tersine mühendislik ile kodu incelerken sondaki bir adım kolalaştırmış oldum...

Tüm öğrenicilere başarılar...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #17
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yavaş yavaş anlamaya başlıyorum...

Önceki koddan alıştığımız enum içindeki D kodlarını (opCast() işlevini) saymazsak kilit nokta aşağısı:
@property string eklemeİfadesi(string tabloİsmi, string değişkenİsmi)() {
    enum solTaraf = tabloİsmi ~ `["` ~ değişkenİsmi ~ `"]`;
    enum sağTaraf = `to!JSONValue(` ~ değişkenİsmi ~ `);`;
 
    return  solTaraf ~ "=" ~ sağTaraf;
}
 
@property string eklemeİfadeleri(T, string tabloİsmi)() {
    enum size_t fazlalık = 3; /* Parantezler ve nokta */
    enum size_t kırpılacaklar = T.stringof.length + fazlalık;
 
    string eklemeİfadeleri;
 
    foreach (i, üyeTürü; typeof(T.tupleof)) {
        enum değişkenİsmi = T.tupleof[i].stringof[kırpılacaklar..$];
        eklemeİfadeleri ~= eklemeİfadesi!(tabloİsmi, değişkenİsmi);
    }
 
    return eklemeİfadeleri;
}
Aslında her şey bir büyü (şablon) değil mi hocam? Yani derleme zamanında taşlar yerine oturuyor ve biz geliştiricilere yapıyı oluşturup JSON'u yazmaktan başka bir şey bırakmıyor!

Duygularımı kodlara dökmek için müthiş isminde bir değişken ekledim ve main() içindeki karşılığına da int.max yazdım. Gerçekten de müthiş...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #18
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 6024
zafer:
değişken true değerinde olduğu için assert bir hata olmadığını kabul ederek program akışına müdahale etmiyor. Oysa hata oluşmuştu ?

Bazı değerler desteklenmediği için (örneğin ulong.max) hata atılmasını istiyoruz. O assert, gerçekten de hata atıldığından emin olmak için var. Programı sonlandırmak gibi bir derdimiz de olmadığı için "bu değere karşılık hata atıldı; güzel" deyip devam ediyoruz.

Diğer taraftan burada scope yapısını kullanmakta mümkün olabilir mi?

Olabilir ama ben "bu kapsamdan çıkılırken şu olsun" demek yerine, "şu işlem sırasında hata atılsın" demek istedim.

Not: Bu olanak bazı birim testi kütüphanelerinde (örneğin Unittest++) örneğin CHECK_THROW adı altında zaten vardır. Yapmak istediğim aslında şu kadar basitti ama D'de standart bir birim testi modülü yok:

    buİşlemSırasındaHataAtılmışOlmalı(to!JSONValue(ulong.max));

Ali
Avatar
Salih Dinçer #19
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Merhaba,

Küçümsemek veya emeği küçültmek için söylemiyorum; aksine hoşuma gittiği için önemle belirtmeliyim ki 15 satırlık bir mixin işlevi olayı kopartıyor. Ali hocam bana kızacak ama verdiği emeğinin bir kısmını tek işleve küçülttüm. En azından bunu anlayabilmek ve tabloya bir anda bakabilmek için yaptım. Gerçekten çok leziz bir çözümmüş.

Teşekkürler Ali hocam...
/*
    jsonyaz.d (28.05.2012 - Ali Çehreli)
*/
import std.stdio, std.json;
import std.traits; // isSomString, isArray vb. ifadeler için
    :    :    :
void main()
{
    JSONValue belge;   
    auto öğrenciler = [ Öğrenci("Ayşe", 12,
                               ["matematik" : 90,
                                "ingilizce" : 100 ]),
                        Öğrenci("Başak", 34,
                               ["matematik" : 95,
                                "ingilizce" : 99 ])
                      ];
    auto öğretmenler = [ Öğretmen("Mustafa Kemal", "Türkçe"),
                         Öğretmen("Ali Çehreli", "D Dili")
                       ];
    with(belge){
        type = JSON_TYPE.OBJECT;
        object["öğrenciler"] = to!JSONValue(öğrenciler);
        object["öğretmenler"] = to!JSONValue(öğretmenler);
    }
    writeln(toJSON(&belge));
}/* ÇIKTISI:
{
    "öğrenciler":[
    {
        "isim":"Ayşe",
        "numara":12,
        "notlar":
        {
            "ingilizce":100,
            "matematik":90
        }
    }, {
        "isim":"Başak",
        "numara":34,
        "notlar":
        {
            "ingilizce":99,
            "matematik":95
        }
    }
    ],
    "öğretmenler":[
    {
            "ismi":"Mustafa Kemal",
            "dersi":"Türkçe"
    }, {
            "ismi":"Ali Çehreli",
            "dersi":"D Dili"
    }
    ]
}*/
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
zafer #20
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #16
Salih Dinçer:
Yerine, main() içinde tek satır ekleyerek (8-10 satır çıkararak) şu şekilde kullansak?
    JSONValue belge;
    belge.type = JSON_TYPE.OBJECT;
    belge.object["öğrenciler"] = to!JSONValue(öğrenciler);

Bence bir sakıncası yok. Ancak JSONBelgesi() metodunun JSON_TYPE.OBJECT tipini sarmalaması bana oldukça güzel görünüyor. Bu hem programı küçük parçalara bölme açısından hemde bu metodun çağrıldığı yerdeki temiz yazım ve okunabilirlik açısından bence değerli bir metot, senin kullandığın şekilde tabi ki olabilir.

Aslında bu metodu kodlayan Ali'ye sormak gerek böyle bir metot oluşturuken amacı neydi, neticede bu üç satır kodu bende büyük ihtimalle main metoduna iliştirip geçerdim.
https://github.com/zafer06 - depo
Avatar
Salih Dinçer #21
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Geliştirme aşamasında parçalara bölmenin faydaları olmalı. Peki kodumuz oturduysa, birim testlerinden başarıyla geçtiyse; Ali hocanın şu son yaptığı mix in olayını tek işlevde kullanmamamızın bir mahsuru var mı?
string opCastJSONValue(T)() {
    enum işlevBaşı = `
        JSONValue opCast(T : JSONValue)() const @property
        {
            JSONValue json;
            JSONValue[string] yapınınÜyesi;
        `;
    enum işlevSonu = `
            json.type = JSON_TYPE.OBJECT;
            json.object = yapınınÜyesi;
            return json;
        }`;
    enum size_t xFazlalık = 3; /* Parantezler ve nokta */
    enum size_t soldanKes = T.stringof.length + xFazlalık;
 
    string katmaİfadesi = işlevBaşı;
 
    foreach (i, üyeTürü; typeof(T.tupleof)) {
        enum değişken = T.tupleof[i].stringof[soldanKes..$];
        enum solTaraf = `yapınınÜyesi["` ~ değişken ~ `"]`;
        enum sağTaraf = `to!JSONValue(` ~ değişken ~ `);`;
        katmaİfadesi ~= solTaraf ~ "=" ~ sağTaraf;
    }
    return katmaİfadesi ~ işlevSonu;
}
 
struct Öğrenci
{
    string isim;
    ulong numara;
    uint[string] notlar;
    // Katma (mixin) ifadeleri, derleme anında buraya gelecek...
    mixin(opCastJSONValue!Öğrenci);
}
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #22
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #20
zafer:
JSONBelgesi() metodunun JSON_TYPE.OBJECT tipini sarmalaması bana oldukça güzel görünüyor.

+1

Ali'ye sormak gerek

JSONBelgesi() aslında std.json tarafından sunulmalı (tabii İngilizce olarak :)). JSON belgelerinin en dış elemanının OBJECT türünde olduğunu bilmemiz gerekmemeli.

Ali
acehreli (Moderatör) #23
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #21
Salih Dinçer:
Peki kodumuz oturduysa

Kod çok nadiren oturur. Sürekli olarak hatalar bulunur ve giderilir, hızlandırma yolları farkedilir, ek olanaklar gelir, vs.

birim testlerinden başarıyla geçtiyse;

Öyle düşünürsek birim testlerini de bir noktadan sonra kaldırmalı mıyız? Ama anlıyorum tabii: Dıştaki işlev denenince iç işlemler de denenmiş oluyorlar diyorsun. Peki sen neden birleştirmekten yanasın? Öyle daha kolay mı anlaşılıyor? Çünkü bana tam tersi oluyor. :)

Ali hocanın şu son yaptığı mix in olayını tek işlevde kullanmamamızın bir mahsuru var mı?

Mahsuru yok. Benim asıl amacım alt parçaları unittest'ler içinde gösterebilmekti. mixin()'li kodlar çok karmaşık olabiliyorlar.

Aslında eklemeİfadesi() işlevini bir noktada bir iç işlev yapmayı denedim; çünkü nasıl olsa yalnızca eklemeİfadeleri() tarafından kullanılıyordu ve dışarıda durmasına gerek yoktu. Ama ne yazık ki onun unittest bloğunu içeriye alamadım.

Ali
Avatar
Salih Dinçer #24
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
Mahsuru yok. Benim asıl amacım alt parçaları unittest'ler içinde gösterebilmekti. mixin()'li kodlar çok karmaşık olabiliyorlar.
Haklısın hocam, birim testleri için dediğin gibi şart. Üstelik doğru yoldan sapmamak için böyle küçük parçalar gerekli...

acehreli:
Öyle düşünürsek birim testlerini de bir noktadan sonra kaldırmalı mıyız? Ama anlıyorum tabii: Dıştaki işlev denenince iç işlemler de denenmiş oluyorlar diyorsun. Peki sen neden birleştirmekten yanasın? Öyle daha kolay mı anlaşılıyor? Çünkü bana tam tersi oluyor. :)
Ama işte benim bir huyum var ki bunu defalarca dile getirmiş olmalıyım: PageDown/Up yapmadan ekranda ne kadar çok kod görürsem onunla daha iyi anlaşıyoruz...:)

Belki de balık hafızalı olduğumdandır. Açıkçası ilk defa kodu gördüğümde n'oluyor, ne bitiyor? Kim kimden ne alıyor, nereden ne çıkıyor aklım almıyordu. Tabi günün yorgunluğunun da etkisi vardı ama sanki benim yaptığım gibi daha anlaşılır.

İtiraf etmeliyim; başta sandım ki ben bunu bir haftada çözemem...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #25
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 6024
zafer:
Diğer taraftan burada scope yapısını kullanmakta mümkün olabilir mi?

Yani şöyle diyorsun:

    bool hataAtıldı_mı = false;
    {
        scope(failure) hataAtıldı_mı = true;
        to!JSONValue(ulong.max);
    }
    assert(hataAtıldı_mı, "ulong.max için hata atılmadı!");

Aslında daha temiz görünüyor ama ne yazık ki bu sefer de atılmasını umduğumuz hata yüzünden program sonlanıyor. try-catch yönteminde ise hatayı yakalayıp gözardı etmiş oluyoruz. Amaçlardan birisi de o: hata atılsın ama testlerimiz de devam etsinler.

Ali
Avatar
Salih Dinçer #26
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Peki hocam mixin olayı neden bir önceki sürüm olan DMD 2.058'de derlenemez? Hatırlatmak için hatayı alıntılayım:
struct jsonyaz.Öğrenci no size yet for forward reference
İşin ilginci yapı kaç defa çağrıldıysa o kadar hata tekrar ediyor. Ayrıca @property'nin espirisi nedir? Çünkü onsuz da derleniyor.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #27
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
Peki hocam mixin olayı neden bir önceki sürüm olan DMD 2.058'de derlenemez? Hatırlatmak için hatayı alıntılayım:
struct jsonyaz.Öğrenci no size yet for forward reference

Sana özelden yazdığımı buraya da kopyalayayım:

acehreli:
Bence 2.059 bir hatayı gidermiş olmalı. Dikkat edersen, BütünÜyelerİçin_opCastJSONValue() işlevi mixin()'in içine yazıldığı yapının içinden çağrılıyordu. Yani teknik olarak aslında o yapı daha tam tanımlanmamıştı.

Oysa, T.tupleof T'nin bütün üyelerini kullanıyor. Yani bir çelişki var: daha tanımlanmamış bir yapının bütün üyelerinden bahsediyoruz. Anlaşılan 2.058'in bu konuda bir sıkıntısı varmış ve 2.059'da bir biçimde çözülmüş.

(Sözüm meclisten dışarı ;): Lütfen teknik konuları forumda konuşalım.)

@property'nin espirisi nedir? Çünkü onsuz da derleniyor.

dmd'yi her zaman için -property seçeneği ile kullanmanı öneririm. Aslında onun varsayılan bir seçenek olması gerekirmiş ama eski kodları bozmamak için öyle yapmamışlar.

Bence şunları hep kullanmalıyız: -unittest -w -wi -property

Ali
Avatar
Salih Dinçer #28
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
dmd'yi her zaman için -property seçeneği ile kullanmanı öneririm. Aslında onun varsayılan bir seçenek olması gerekirmiş ama eski kodları bozmamak için öyle yapmamışlar.

Bence şunları hep kullanmalıyız: -unittest -w -wi -property
Bu parametreleri (ayrıca -X'i) biliyorum, en azından bildiğimi sanıyormuşum. Çünkü -property'i yapı üyeleri içinde at @ ile birlikte kullanmak dışında bugüne kadar hiç kullanmamıştım. Hocam sayende her geçen gün yeni şeyler öğreniyoruz. Bunun neticesinde D camiasına ve dolayısıyla açık kaynağa adayabileceğimiz büyük bir proje çıkmaz ise ayıp bize vallahi...:)

Gerçi en büyük proje yazdığın kitap olmalı ki hocam sırasını çoktan saldı. Bu vesileyle Zafer'e de teklif etmek isterim: std.json ile alakalı dersi artık hep birlikte yazalım mı? Kapsamlı olabileceği içi ikiye, hatta üçe (Ali hocam da bu bölümü anlatır) bölmek de iş yükünü hafifletir. Zaten Zafer'in sitede yer alan bir makale denemesi var ki JSON olayını Kelimatik projesinde zat-ı muhterem başlatmıştır:

JSON'a başlangıç:
#75
Malum KelimeMatik projesini konsol tabanlı olarak yeniden yazmaya karar verdim. Bu aşamada bir takım bilgileri saklamak için kullandığım XML yapısındaki dosya sistemini uzun zamandır ilgimi çeken ve son zamanlarda adını sıkça duyduğum JSON yapısı ile değiştirmeyi düşünüyorum.

Ben de bir iki paragraf ile makaleye bir başlangıç yapayım ve böylece en kolay kısmını kapayım! Çok mu akıllıyım...:)

JSON (JavaScript Object Notation), Türkçe'de "ceysın" olarak okunur, (Değil mi Ali hocam?) ve çok basit bir işaret diline(Fransızca notation) sahiptir. Amaç, insanların da kolaylıkla okuyabileceği ve fazla yer kaplamayan (ama JavaScript ile uyumlu!) bir veri değişimi meydana getirmekti. Öncüsü ise bu işin tek üstadı olan Douglas Crockford'dur. Öğrenince anlaşılması basit olsa da başlangıçta anlamsız gelebilir. Bu yüzden ne olmadığını tarif ederek devam edelim:

Anlam olarak, kesinlikle ne Java dili ile ne de diğer programlama dilleriyle ilgili bir şey değildi(r). Doğrudan JS (JavaScript) ile ilgili olduğu ve Java dilinin JS'ye isim olarak benzese de tarihsel açıdan (-bknz Mozilla) alakalı olmadığını önemle belirtmeliyiz. Ancak sonradan Java dahil bir çok dil ve script'de (örn. D ve AS gibi, tam liste için tıklayın) ayrıştırıcıları (parser) yazılmıştır. Bu da çok kolay yaygınlaşmasını sağlamıştır. D'de ise, dilin içinde yatan büyük potansiyel sayesinde kullanımı inanılmaz derecede kolaylaştırılmıştır.

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #29
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
std.json ile alakalı dersi artık hep birlikte yazalım mı?

Bence başladığın JSON makalesine sen devam et ve bitir işte.

Ayrıca ben kitaba fazla Phobos veya başka kütüphane karıştırmak istemiyorum çünkü hangi birisine yetişilebilir? Şu anda kitapta iki modül var: std.parallelism ve std.concurrency. Onları da kendime şöyle açıklıyorum: Kitabın diğer bölümleri programların tek mikro işlemci üzerinde çalıştırılmalarını sağlıyorlar. Bir anlamda, mikro işlemci üzerinde çalışmak bu işin özü. O yüzden, programların günümüzdeki çok çekirdekli ortamlarda nasıl çalıştıkları ile ilgili olduğundan std.parallelism ve std.concurrency'ye ayrıcalık yaptım.

Hmmm... Aslında std.range de biraz geçiyor. Ama ben bunları gerçekten dile çok bağlı olan kavramlar olarak görüyorum. JSON, regex, vs. bir sürü konu da çok önemli ama onlar özel uygulamalar için... gibi geliyor...

O yüzden kitabı boşver; JSON makalesini bitirmeni bekleyelim. ;)

Ali
zafer #30
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #22
acehreli:
JSONBelgesi() aslında std.json tarafından sunulmalı (tabii İngilizce olarak :)). JSON belgelerinin en dış elemanının OBJECT türünde olduğunu bilmemiz gerekmemeli.

Sen böyle yazınca JSONBelgesi() kafamda daha da netleşti. Haklısın Ali aslında önemli olan bu bakış açısına sahip olabilmek, sanırım ustalık bu bakış açısına yaklaşabilmekle alakalı bir durum. Bende senin tecrübelerinden faydalanarak bu açıya yaklaşmaya çalışıyorum.


acehreli:
Yani şöyle diyorsun:

    bool hataAtıldı_mı = false;
    {
        scope(failure) hataAtıldı_mı = true;
        to!JSONValue(ulong.max);
    }
    assert(hataAtıldı_mı, "ulong.max için hata atılmadı!");


Aslında daha temiz görünüyor ama ne yazık ki bu sefer de atılmasını umduğumuz hata yüzünden program sonlanıyor. try-catch yönteminde ise hatayı yakalayıp gözardı etmiş oluyoruz. Amaçlardan birisi de o: hata atılsın ama testlerimiz de devam etsinler.

Hakılısın şimdi bende denedim. Scope hatayı yakalayıp yönetme şansı vermiyor. Anladığım kadarıyla scope hatanın atılmasını engellemiyor sadece bize program akışı sonlanmadan önce son bir imkan sunuyor. Bir nevi köprüden önceki son çıkış gibi sanırım.

Ancak gerçekten çok daha temiz bir kodlama sunuyor :)

Salih Dinçer:
std.json ile alakalı dersi artık hep birlikte yazalım mı?

Genel olarak Salih'in düşüncelerine katılıyorum ve yazdıklarınıda doğru buluyorum. Bununla beraber JSON için bir ders yazmak yerine bu konuya özel bir makale yazılmasının daha doğru olduğu düşüncesindeyim. Böylece hem makale bölümü zenginleşecek hemde bizlerin çalışmaları daha somut bir hale gelecektir. Neticede forumda konuşulanlar konular içinde atıl bir şekilde kalıyor.

Birlikte bir ders veya makale yazmak bence gerçekten zor olacaktır. Ancak bunun yerine örneğin Salih sen bu konuda bir makale hazırla ve sitede yayınlayalım, sonrasında eksik gördüğüm kısımları tamamlayacak bir makalede ben eklerim. Bence bu çok daha kolay ve hızlı olur. Aksi taktirde hepimizin tek bir makale üzerinde çalışması bence hem zor olur hemde yazı bizlerin kişisel yaklaşımları doğrultusunda şekilleneceği için bir bütünlük arz etmeyebilir.

Diğer taraftan benimde uzun süredir aklımda bir JSON makalesi var ancak bu konuyu biraz daha irdeleyip doyurucu bir makale hazırlamak niyetindeyim. Ayrıca AyarYönetici sınıfı ile JSON üzerinde bir uygulama yaparak pratikteki bazı aksaklıklarıda gördükten sonra böyle bir yazı hazırlamayı düşünüyorum ve tabi şu sınavları ve semineri bitirdikten sonra ancak bu tür işlere vakit ayırabileceğim. :)
https://github.com/zafer06 - depo
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  önceki  1  2  3  sonraki 
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-22, 06:57:39 (UTC -08:00)