Aklımda Kalası Kelimeler

* давайте работать вместе
* Zarf ve Mazruf, Zerafet(xHoyratlık) ile aynı kökten(za-ra-fe) gelir
* Bedesten
* Suç subuta ermiştir - Suç sabit olmuştur

8 Şubat 2013 Cuma

Fluent API Nedir, Ne Değildir?

Referans: Configuring Relationships with the Fluent API

Yukarıdaki bağlantıdan edindiklerimi aktaracağım ve birazda okuduğum, izlediklerimden serpiştireceğim. Maksat kavrama seviyesini idrak düzeyine eriştirmek.
Julia Lerman'ın kitapları var Code First ve DbContext üzerine. Gördümki FLUENT API yi kullanmak Annotations'dan hem daha okunaklı hem de tüm yetenekleri barındırması açısından tercih sebebi.

Tablolar arasında ilişkileri Foreign Key ve Navigation özelliklerini kullanarak yapıyoruz. Bu ilişkileri vermek için Fluent API içinde HasRequired, HasOptinal ve HasMany metotlarını kullanıyoruz. Bu metotlar lambda ifadelerini parametre olarak alırlar.

HasKey metodu; tablonun Primary Key alanını ifade etmek için kullanılır ve POCO sınıfında bu değer otomatik oluşturuluyorsa girilmez.
HasRequired metodu; tablo alanlarının boş bırakılamayacağını işaretlemekte kullanılır.
HasMany metodu; bir kolleksiyona yönlenen lambda ifadesi içerir.
HasForeignKey metodu; tabloya başka bir tablonun PK alanını vermek için kullanılır.
http://stackoverflow.com/a/7644906/104085


Tersi yönündeki yönelmeyi de WithRequired, WithOptinal, WithMany metotları sağlar.

VT'yi oluşturmak için kullanacağımız Provider ve VT erişimi için kullanıcı bilgilerini .Config dosyasında tutalım ve DbContext'in yaratıcı metoduna parametre olarak verelim:
<connectionStrings>
    <add name="cnn" connectionString="data source=.; Initial Catalog=cop; Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
  </connectionStrings>

DbContext'i miras alan ve tüm DbSet'leri tutarak VT'nin yaratılması öncesi eylemleri yapacağımız sınıfta VT'yi her defasında silip tekrar yaratalım:
public class Kontext : DbContext
    {
        public Kontext()
            : base("name=cnn")
        {
            this.Database.Delete(); //VT yi silelim
            this.Database.CreateIfNotExists(); //Silinmiş VTyi yaratalım
        }
    }

HasRequired

Veritabanını oluşturmak için aşağıdaki kodlama yapılır ve One To One tablo yapısı oluşturulur. Burada principal Adres olacak ve Kisi sınıfında FK olarak yer alacak.

Eğer Adres bilgisi(Kisi->IkametAdresi) girilmeden Kisi nesnesini VT ye giremezsiniz. İşte aşağıdaki hata sonucu:

Böyle bir ilişkide eğer önce Foreign Key nesnesini girilmeli:


Aşağıdaki POCO yapısına göre daha aşağıda oluşan VT'yi göreceksiniz:
public class Kontext : DbContext
    {
        public Kontext()
            : base("name=cnn")
        {
            this.Database.Delete();
            this.Database.CreateIfNotExists();
        }

        #region DbSets
        public DbSet Kisiler { get; set; }
        public DbSet Adresler { get; set; }
        public DbSet Meslekler { get; set; }
        #endregion

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity().HasKey(p => p.Id)
                        .HasRequired(p => p.FaturaAdresleri)
                        .WithMany();
        }
    }

    public class Kisi
    {
        public int Id { get; set; }
        public string Adi { get; set; }
        public virtual ICollection Mesleks { get; set; }
        public virtual ICollection FaturaAdresleri { get; set; }
        public virtual ICollection TeslimatAdresleri { get; set; }
    }

    public class Meslek
    {
        public int Id { get; set; }
        public string Adi { get; set; }
        public virtual ICollection Kisis { get; set; }
    }

    public class Adres
    {
        public int Id { get; set; }
        public string AcikAdres { get; set; }
    }


Saat 00:35. Yarın ola hayrola ...

One to Zero or One


One to Zero or Many


7 Şubat 2013 Perşembe

Futbolu izlerken Mustafa Denizli'den Yöneticilik Dersi

Mustafa Denizli'nin bugün demecinde söyledikleri:
istediğimiz gibi oynamıyor ama sonuca gidiyoruz(tespit)
Takımın %50-60'ı değişti ve oturması zaman alacak(sebebin tespiti)
Maç ortalaması 2 puan olacak şekilde ilerlemeliyiz ama 2,2 olursa istediğimiz başarı gelecektir.(hedef)
2 Hafta sonra takım istediğimiz şekilde oynayacaktır(takvimlenmiş hedef tayini)

Futboldan çok şey öğreniyorum diye validemle sohbet ederken farkettimki aslında birkaç kişinin söz ve tespitlerine dikkat kesiliyorum.
Denizli sadece iyi futbol değil iyi bir idarecilik nasıl yapılır ve demeç nasıl verilirin dersinide veriyor.

31 Ocak 2013 Perşembe

_ViewStart.cshtml ile veya doğrudan Layout özelliği ile Layout vermek.


_ViewStart.cshtml içinde belirtilen Layout ayarını, bulunduğu klasör ve alt klasörlerdeki tüm "*.cshtml" dosyalarında eğer doğrudan "Layout" özelliği belirtilmemişse ayarlanmış olur.

_ViewStart.cshtml
@{
    Layout = "../Shared/_LayLay2.cshtml";
}

_LayLay2.cshtml
<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>@ViewBag.Title</title>
</head>
<body>
    <header>
        <h1>Benim Ev Sayfam</h1>
        <hr />
    </header>
    <div>
        @RenderBody()
    </div>
    <footer>
        <hr />
        <h5>Copy Right 2013</h5>
    </footer>
</body>
</html>

Index.cshtml
@{
    ViewBag.Title = "innnndex";
}
<div>
    <h1>Hakkımızda</h1>
</div>

Eğer View/Shared klasöründe _Layout.cshtml ve _Layout.mobile.cshtml(mobil cihazlar için ekran şablonu) dosyalarınız varsa isteğin geldiği browser'ın tipine göre layout otomatik seçilecektir.

_PageStart ve RunPage

RunPage() içerisinde tüm sayfa çalışıyor. Ve sayfalardaki istisnalar en üste fırlatılırsa _PageStart içinde yakalanmış ve işlenmiş olur.
@{
    try
    {
        RunPage();
    }
    catch (Exception ex)
    {
        Response.Redirect("~/Error.cshtml?source=" +
            HttpUtility.UrlEncode(Request.AppRelativeCurrentExecutionFilePath));
    }
}

Peki klasik ASP.NET sayfalarında ?

DbContext ile Code First VT Tasarımı

Bununla ilgili tonla video ve yazı var. Benim gözüme çarpan özel noktaları buraya not alacağım. Aralarda gördüklerim arasındaki ilişkilerden bahsedeceğim.

AutoDetectChangesEnabled = true MSDN der ki; Ayarladaki bir değişimi otomatik olarak algılar.
Patrick Desjardin'in blogunda der ki; DbSet'in Add, Attach, Find, Local, Remove metotlarını çağırırken aynı zamanda DbContext'in GetValidationErrors, Entry, SaveChanges metotlarında da çağırılır. DbSet metotlarının çağırlıdığı anda nesnenin veritabanına gitmeden önce değişim geçirip geçirmediği kontrolleri yapılan

public virtual void DetectChanges(bool force = false)
{
    if (this.AutoDetectChangesEnabled || force)
    {
        this.ObjectContext.DetectChanges ();
    }
}
metoduna gidilir. Bu da yüklü VT işlemi yaparken gereksiz bir performans kaybına neden olacağı için AutoDetectChangesEnabled özelliği false yapılır. Patrick tecrübesine dayanarak 100den az nesne için yapılan işlemlerde performans kaybı çok değilken 100'ün üstündeki işlemlerde hissedilir olacağıdır.
Arthur'un dediğine göre ise:
When using most POCO("plain-old" CLR objects) entities the determination of how an entity has changed (and therefore which updates need to be sent to the database) is made by detecting the differences between the current property values of the entity and the original property values that are stored in a snapshot when the entity was queried or attached.
POCO nesneleri VT ye gitmeden önce değişimlere bakılarak hangi nesnenin VT'ye gidip gitmeyeceğine karar verildiği bu DetectChanges metodunu şu kodla (bir dizi[bulk] işlem yaparken) verimli hale getirebilirsiniz:
using (var context = new UnicornsContext())
{
    try
    {
        context.Configuration.AutoDetectChangesEnabled = false;

        // Make many calls in a loop
        foreach (var unicorn in myUnicorns)
        {
            context.Unicorns.Add(unicorn);
        }
    }
    finally
    {
        context.Configuration.AutoDetectChangesEnabled = true;
    }
}

Arthur'un makalesinden yine döndüm dolaştım MSDN0'e geldim. Çünkü alternatif bir yol önermiş:

An alternative to disabling and re-enabling is to leave automatic detection of changes turned off at all times and either call context.ChangeTracker.DetectChanges explicitly or use change tracking proxies diligently. Both of these options are advanced and can easily introduce subtle bugs into your application so use them with care.

Devam etmeden önce Lazy Loading nedir?
Lazy loading is the ability for an entity to perform a query for related entities whenever a navigation property is accessed.
Yani siz nesneyi oluşturduğunuzda tüm bağlantılı diğer nesneleri bind olmasın ve sadece bağlantılı özelliğini çağırdığınızda değerleri bağlansın isterseniz "tembel yükleme" etkin olmalı. Elbette tüm context içinde bunu açıp kapatmanız mümkünken sadece sınıf bazlıda yapabilirsiniz. Aşağıda detaylarından bahsedeceğim.

MSDN derki: Eğer Lazy Loading ve POCO'larının değişimlerini takip etmek isterseniz, EF POCO'larınız için çalışma zamanında PROXY oluşturacaktır. Eğer Lazy Loading proxy istersen değişim takibine sahip olmadan yapabilirsin. Ama değişim takibi istersen Lazy Loading ister istemez proxylerinde gelecektir.
Proxy yaratılması için:
  1. Data sınıfı public erişimde olmalı.
  2. Data sınıfı sealed veya abstract tanımlanmamalı
  3. Data sınıfı parametresiz public veya protected yapıcı metoda sahip olmalı. Parametresiz protected yapıcı metodu CreateObject metodu kullanarak POCO'larınız için proxy oluşturmak istediğinizde kullanılabilir. CreateObject metodu proxy oluşturmayı garantilemez.
  4. Sınıfınız IEntityWithChangeTracker veya IEntityWithRelationships arayüzlerini uygulamaz çünkü PROXY sınıfları bu arayüzleri uygulayacaklardır.
  5. The ProxyCreationEnabled option must be set to true.(E yani.. Şöyleki: context.ContextOptions.ProxyCreationEnabled = true; )
Siz POCO'nuzu yukarıdaki kaidelere göre yaratırsanız aşağıdaki gibi bir yapı oluşur:
public class Kisi
{
    public virtual ICollection Adresler { get; set; }
}
ve bunun peşine dinamik olarak proxy sınıfınız aşağıdaki gibi üretilir:
public class EFKisiProxy : Kisi
{
    public override ICollection Adresler
    {
        get
        {
            DoLazyLoad();
            return base.Adresler;
        }
        set
        {
            base.Adresler= value;
        }
    }
}

Lazy Loading için:
Her bağlantı özelliği ("Her kurumun bir adresi vardır" demek Kurum sınıfı Adres tipinde bir özelliğe sahiptir demektir. Kurum içinde Adres sınıfına bir bağlantı verilecektir) public ve virtual tanımlanmalı ve get metodu mühürlenmiş olmamalı.

Değişim Takibi için:
  1. Bağlantı olarak kullanılan her özellik Data Model içinde mühürlenmiş olmamalı, public ve virtual olmalı.
  2. Eğer birden çok adresi olacaksa bir kurum nesnesinin o halde ICollection<Adres> olarak bu ilişki gösterilmeli.
  3. Eğer nesnen ile birlikte proxy tipini yaratmak istersen ObjectContext içindeki CreateObject metodunu her yeni nesne oluştururken "new" operatörü yerine kullanmalısın.

1:32(am) ve bu arada şunu dinliyorum ;)


Ne diyordu MSDN? Hah, eğer senin CreateObject metot çağrın proxy oluşturamazsa doğrudan POCO'ndan bir nesne yaratır ve sana verir. Bunu anlamak için üretilen nesnenin tipine bakarsın. Tipler aynı değilse bu proxy nesnesidir ve en azından Lazy Loading özelliği vardır. Detaylar How to: Identify that a POCO Entity is a Proxy adresinde.

Yatma saatini geçirdim ama konu konu açtı ve gördümki bu da güzel bir bağlantı olacak CreateObject ya da Create metodu kullanılarak yaratılmış nesnelerin hem alt ilişkileri(public virtual ... ile tanımlı özellikleri için) hemde bu nesnelerin VT ye işlenmeleri ile ilgili. Kaynak stackoverflow ve soru: Create<object> vs new <object> in Entity Framework. Cevaplar güzel ve derlerki: Eğer CreateObject ya da Create metotları ile bir nesne yaratırsan bu nesneler ObjectContext içinde olmayacaklardır. Bunları ObjectContext içine almak istersen Attach etmelisin.
using (var ctx = new MyDbContext())
{
    var user = ctx.Users.Create();
    user.Id = 1;
    ctx.Users.Attach(user);

    var roles = user.Roles;
}
Create ile yarattığın ve Attach ile contexte iliştirdiğin için user.Roles gelecektir. Ama sen new operatörü ile yapsaydın
using (var ctx = new MyDbContext())
{
    var user = new User { Id = 1 };
    ctx.Users.Attach(user);

    var roles = user.Roles;
}
Roles özelliğine asla erişemeyecektin. Tam bu noktada Attaching and Detaching Objects başlıklı MSDN makalesine baktım ve özetle şunları gördüm: Sen bu hariçten nesne yaratma ihtiyacını çeşitli hallerde isteyebilirsin. Mesela normal bir sorgu ile elde edeceğin nesneler object context içindedirler ve yönetilmeleri ve izlenmeleri object context tarafından yapılırken harici bir sorguyla elde ettiğin nesneler context harici oldukları için yönetimleri senin elinde olacaklar. Ya da senin ASP.NET viewstate içinde sakladığın, remote metot veya web servisi çağrısıyla elde ettiğin nesnelerin olabilir. Tüm bunları
  1. System.Data.Objects.ObjectSet.AddObject(...) veya System.Data.Objects.ObjectContext.AddObject(...)
  2. System.Data.Objects.ObjectSet.Attach(...) veya System.Data.Objects.ObjectContext.Attach(System.Data.Objects.DataClasses.IEntityWithKey)ve AttachTo
metotlarıyla ekleyebilirsin. 1 ve 2 farkı primary key değerlerinin olması veya çakışma halinde istisna fırlatılmasıyla ilgili.

İkinci resmimde altı kırmızıyla çizili satırları biraz izah etmiş biraz çevrisiyle kendime notumu almış oldum.
Devamı MSDN'de...

29 Ocak 2013 Salı

1 Ocak 2013 Salı

Tarım'a dair notlarım

Tropik Sera (tropiksera.com) konuşması:
Kumkat için: bol güneş, iz elementleri(5 lt suya 1 subardağı) 15 günde 1 => nitrat(asidik oranı düşürülmelidir) fosfor demir magnezyum bor bakır çinko
1 çorba kaşığı nitratı asidik oranı 2.5 tur ve yakar
eğer PH 5.5-6.5 arasında bitki
asidik X alkalik olanlar
demir, magnezyum, bor = alkalik
nitrat = asidik
5 LT suya bunlar atılıp 5.5-6.5 PH arasındaysa dolum yapılır ve 6.5 üstüyse seyreltilir.

Narenciyede kuzey kapalı olmalı(karayel) don getirir.Yaprak sabit ağaçlarla'da kuzey kapatılabilir.
dönümü 25-30 bine sera kurulabilir (sadece naylon 5-6 yılda bir değiştirilirse)
BATEM üretme çiftliği'nde dönümü 250 bin dolara sera yaptırılıyor.

2 ayaklı canlılar, dışkı ve idrarı aynı kanaldan attığı için nitrat oranı çok yüksek.

20 Aralık 2012 Perşembe

Kim hangi basamak sağlık kuruluşu

Ref: medeczane.sgk.gov.tr
Birinci Basamak Resmi Sağlık Kuruluşlarından; Kamu idareleri bünyesindeki kurum hekimlikleri,
sağlık ocağı,
verem savaş dispanseri,
ana-çocuk sağlığı ve aile planlaması merkezi,
sağlık merkezi ve toplum sağlığı merkezi,
112 acil sağlık hizmeti birimi,
üniversitelerin medikososyal birimleri,
Türk Silahlı Kuvvetlerinin birinci basamak sağlık üniteleri ve belediyelere ait poliklinikler
tarafından oluşturulmuş reçeteler,

Birinci Basamak Özel Sağlık Kuruluşlarından; İşyeri hekimleri tarafından düzenlenen reçeteler,

İkinci Basamak Resmi Sağlık Kurumlarından; Türk Silahlı Kuvvetlerinin 2 inci basamak hastaneleri tarafından oluşturulan reçeteler,

Üçüncü Basamak Resmi Sağlık Kurumlarından; Türk Silahlı Kuvvetlerinin 3 üncü basamak hastaneleri tarafından oluşturulan reçeteler,
e-reçete uygulaması kapsamı dışındadır.

Bu birimlerde üretilen tüm reçeteler, teknik alt yapılar hazır olana kadar eskiden olduğu gibi manuel olarak oluşturulacaktır. Yukarıda belirtilen resmi ve özel sağlık kuruluşları MEDULA hastane sistemini kullanmaya başlamaları veya teknik alt yapılarını oluşturmaları halinde e-reçete uygulamasına geçeceklerdir.

6 Aralık 2012 Perşembe

Q_OBJECT macrosu ne işe yarar?

Bunu izlerken bende kısaca sordum Q_OBJECT sorusunu ve aşağıdaki cevapları aldım.

StackOverflow MOC(Meta-Object Compiler), Qt'un C++ uzantılarıyla başa çıkan, C++ header dosyalarını okuyan, içinde Q_OBJECT makrosu olanlar sınıf tanımlamaları için içinde Meta Object Code içeren C++ kaynak dosyası üreten programdır. Derlemeden az önce çalışır bu MOC. Ve ürettiği bu meta-object kodu SIGNAL & SLOT mekanizması, çalışma zamanı bilgisi ve dinamik özellikler içindir.
StackOverflow Basitçe Q_OBJECT makrosunun bulunduğu bu sınıfın GUI elemanları içerdiğini ve SIGNALS&SLOTS mekanizmasını kullandığını BUILD zamanında belirtir.
StackOverflow C++ derleyicisinin anlayacağı şekilde SIGNALS&SLOTS mekanizmasının çevirilmesini sağlar.

5 Aralık 2012 Çarşamba

Kryptos(gizli dünya) logos(bilmi)
Kriptoloji = Kriptografi(şifreleme) + Kriptoanaliz(çözme)

Haberleşmede Güvenlik Öğeleri



  1. Gizlilik(İçeriğin gizliliği)
  2. Bütünlük(Giden ve Gelenin aynı olması)
  3. Kimlik Doğrulaması(Kaynağın doğrulanması)
  4. İnkar edememezlik
  5. Süreklilik

Basit Şifreleme Yöntemleri

Sezar Şifresi

Sezar Şifresi : ci= E(pi) = pi+3
Açık Mesaj : Gizli Bilgi
Şifreli Mesaj : Ilcol Dloıl

Simetrik Kriptografi

Anahtarın iki tarafın bildiği şifrelerken ve çözerken kullandığı yöntemdir.



Bu açma işlemi dikkat edilirse şifreleme işleminin tamamen simetriğidir. Yani aynı anahtar girmekte ve aynı algoritma kullanılmaktadır.




Asimetrik Şifreleme(Açık Anahtarlı)

Ref: Asimetrik Şifreleme

4 Aralık 2012 Salı

Sql Server'da Mirror yapılan DB nin LOG database'ini truncate etmek

arkadaşlar eger mirro olan databaelerin trans logu şitiyse sakın normal
yollarden yapmaya calısmayın, baska dosya isimleri kullanıp attach detach
filan yapmayın...

- sadece translog backup nı alın, genel ayarlarla oynamanıza gerek yok

- Databe uzerinde sql query acıp, DBCC LOGINFO('database ismi') diyip,
"status" değerinin sıfır oldugunu görün
- DBCC SHRINKFILE(logun virtual ismi, istediginiz boyut) ama sizin
database ler buyuk oldugu icin boyut 1gb altı olmasın yani1024
yazabilirsiniz
- eğer yukarıdaki işlem kucuktemdiyse SELECT name,log_reuse_wait_desc FROM
sys.databases; diyip duruma bakın, "NOTHING" yazmalı, yok LOG_BACKUP
yazıyorsa translog backup ı ilk adımdaki alıp yine shirink deneyin

bu yontemle medula 80gb dan 1 gb a indi, belki daha da inerdi ama cok
ihtiyac yok


Saygılarımla / Best Regards

Bülent Naci ALPAY
Sistem & Network Muduru
IT