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

25 Nisan 2013 Perşembe

jQuery üzerinden observer pattern oluşturulması

$ içinde tanımlı olan ve jQuery nesnelerine sarılan on, off, trigger metotları vardır. trigger Metodu bir tetikleyicidir ve hangi olayın tetiklenmesini istiyorsak, ilgili değişkenleri ikinci parametrede vererek çalıştırırız.


on Metodu bir olayın tetiklenmesi halinde çalışır. Birinci parametre hangi event durumunda çalışacağını, ikinci parametre ise hangi fonksiyonun çalışacağını gösterir.


off Metodu ise daha önce bir olaya eklenmiş bir metodun kaldırılması esasına dayanır.


Yukarıdaki bu metotların çalışabilmesi için önce hangi nesneye kilitlediğinizi seçmelisiniz ve bu nesne tabii ki jQuery örneği olmalı. Mesela her div'e tıklandığında zapa zupa olsun: $('div').on('click',zapaZupaFonksiyonunuCagir());
Eğer bir tıklama olmadan programatik olarak çağırmak isterseniz $('div').trigger('click',['extra parametreler']); ile çağırabilirsiniz olayları.

Şimdi biliyoruzki jQuery nesneleri on,off,trigger metotlarına sahiplerken $ buna sahip değil. Bunu sağlamak için bir jQuery nesnesi yaratalım:
var o = $({});
Bu nesneden o.trigger() diyerek metot çağırmakla o['trigger']() diyerek metot çağırmak arasında bir fark yoktur. Neticede javascript nesnesinin bir özelliğini çağırıyoruz ve fonksiyonlarda bu nesnelerin bir propertysi gibidirler.


Peki 'on' metodunun içeriği zaten jQuery içinde tanımlanmış ve sadece nesnelere bağlanabiliyorsa biz jQuery örneğimiz için on fonksiyonunun adını değiştirebilir miyiz?
o['hebeleOlsun'] = function(){ o.on.apply(o, arguments); }; burası azıcık karışık gelebilir. Baş taraf çok basit. hebeleOlsun diye bir özellik ekliyoruz "o" nesnemize. Bu nesneye anonymous bir function atıyoruz. Bu durumda o['hebeleOlsun']() ya da o.hebeleOlsun() çağrıları bu anonymous fonksiyona çağrı yapacak ve tüm parametrelerde bu metot içinde arguments dendiğinde elde edilebilecek. Şimdi sırada apply var. apply da bir metot çağrısı ama kime yapılıyor? Bir başka metotan yapılabiliyor ki burada bizim "on" metodumuzun üstünden yapıldığını farketmişsinizdir. Peki parametrelerin anlamı ne? Birinci parametre bu fonksiyon içinde this diyerek elde edebileceğimiz değişken olacak. Ki; biz burada o nesnesini gönderdik. Böylece apply ile çağırdığımız on fonksiyonu içinde artık this = o olmuştur. ON fonksiyonunun içine diğer diğer parametreleride arguments ile gönderiyoruz.

Peki biz jQuery içinden özelleştirilmiş bir olay oluşturma, bu olaya abone olma ve aboneliği silmek konusununu nasıl yazabiliriz:
<script>
        var o = $({});

        jQuery['yayinYap'] = function () {
            o.trigger.apply(o, arguments);
        };

        jQuery['uyeOl'] = function () {
            o['on'].apply(o, arguments);
        };

        jQuery['uyeOlma'] = function () {
            o['off'].apply(o, arguments);
        };

        $.yayinYap('onBasimKasindi',['bu bir event parametresi','bu da digeri',2,3,{oz:'el',li:'ck'}]);

        $.uyeOl('onBasimKasindi',function(e){ console.log('Başı kaşınan birisi var'); console.log(e); $.uyeOlma('onBasimKasindi','**'); });

Bunun pratik halleride var ama bu şeklini anladığınızda diğerleri daha anlamlı gelecektir.

Geç oldu, ben gider...

6 Nisan 2013 Cumartesi

Düzenlediğim resimler

Transparan(transparent) e-imza (e-signature) usb flash parmak bellek

5 Nisan 2013 Cuma

WCF incelemesi

WCF çağrısı:


Behaviour eklemek:



public class CustomBehaviour : IEndpointBehavior
{
    public void Validate(ServiceEndpoint endpoint)
    {


public class CustomBehaviour : IEndpointBehavior
{
    public void Validate(ServiceEndpoint endpoint)
    {
    }
    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
    {

bindingParameters:


endpoint:

public class CustomBehaviour : IEndpointBehavior
{
    public void Validate(ServiceEndpoint endpoint)
    {
    }
    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
    {
    }
    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
        CustomBehaviour custom = ((CustomBehaviour)(endpoint.Behaviors[typeof(CustomBehaviour)]));
        MessageInspector mi = new MessageInspector()
            {
                M_Key = custom.M_Key,
                M_Value = custom.M_Value
            };
            
        clientRuntime.MessageInspectors.Add(mi);
    }
clientRuntime:

4 Nisan 2013 Perşembe

Code First ile Migration

Context sınıfınızın default yapıcısı olmalı ve doğru dbnin adını vermelisiniz.


PM konsolunuzda ilgili projenizin(context'i barındıran) kök klasörüne gelmelisiniz ve "Enable-Migrations –EnableAutomaticMigrations" kodunu çalıştırmalısınız. Bu kodu bulamadım diyerek çalışmazsa entity framework'ünüzü güncellemeyi deneyin. Enable-Migrations –EnableAutomaticMigrations çalıştıktan sonra Migrations diye bir klasör ve içinde Configuration.cs sınıfının oluştuğunu göreceksiniz.


Ardından "Update-Database -Verbose" kodunu kullanrak kodunuzdaki güncellemeyi veritabanınıza yansıtabilirsiniz. -Verbose parametresi ile çalıştırılan SQL ifadelerini gözlemleyebilirsiniz.


Son olarak hem PM de hangi klasörede olduğumuzu hemde update sonucundaki sql ifadelerini görebileceğiniz ekran:

2 Nisan 2013 Salı

Action kullanarak multi thread sql update

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading;

namespace caThreadSqlUpdate
{
    class Program
    {
        private static SqlConnection cnn = new SqlConnection("Data Source=10.130.214.200,8585;Initial Catalog=ERecete;User Id=kullanici;Password=sifre;");
        static void Main(string[] args)
        {
            if (cnn.State != ConnectionState.Open)
            {
                cnn.Open();
            }

            SqlCommand cmd = cnn.CreateCommand();
            cmd.CommandText = "select ereceteIlacListe_id,barkod FROM dbo.EReceteIlacListesi";
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            da.Fill(ds);

            Dictionary<IAsyncResult, Action<int, string>> li = new Dictionary<IAsyncResult, Action>();
            int i = 0;
            foreach (DataRow row in ds.Tables[0].Rows)
            {
                i++;
                Action<int, string> act = f_BarkodGuncelle;
                IAsyncResult ai = act.BeginInvoke((int)row[0], (string)row[1], delegate { Console.WriteLine("Bitti: " + row[0] + " ve " + row[1]); }, null);
                li.Add(ai, act);
                if (i == 5)
                {
                    break;
                }
            }
            while (true)
            {
                foreach (var key in li.Keys)
                {
                    if (key.IsCompleted && li[key] == null)
                    {
                        Console.WriteLine("End invoke çağırdım");
                        li[key].EndInvoke(key);
                        li[key] = null;
                    }
                }
                Thread.Sleep(1000);
            }

        }

        static public void f_BarkodGuncelle(int _iIlacId, string _sBarkod)
        {
            SqlCommand cmd = cnn.CreateCommand();
            cmd.CommandText = String.Format("UPDATE dbo.yedekEReceteIlaclari SET barkod={0} WHERE refEreceteIlacListe_id={1} ", _sBarkod, _iIlacId);
            cmd.ExecuteNonQuery();
        }
    }
}

22 Mart 2013 Cuma

XXX to FLAC, to WAV, to MP3, to OGG, to APE

Basit bir ses dosyası dönüştürülme işlemi için iki program denedim.
1- Flac To Mp3 ü indirdim ama serial istiyordu:


2- Bedava kolay ve küçük bir portable program FlicFlac.

Audio File
to FLAC
to WAV
to MP3
to OGG
to APE

19 Mart 2013 Salı

SimpleCursorAdapter vs CursorAdapter

Not olsun:
Tüm satırları tutacak olan LinearLayout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TableRow
        android:id="@+id/trHeader"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/tvAdiSoyadi"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/kisi_adi_soyadi" />

        <TextView
            android:id="@+id/tvAlani"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/kisi_alani" />
    </TableRow>

    <ListView
        android:id="@+id/lvKisiler"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
        
    </ListView>

</LinearLayout>
Her bir ListView item satırı:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <CheckBox
        android:id="@+id/cbKisiId"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/tvKisiId"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/rbKisi"
        android:layout_alignBottom="@+id/rbKisi"
        android:layout_toRightOf="@+id/rbKisi"
        android:text="ID"
        android:visibility="invisible" />

    <TextView
        android:id="@+id/tvAdi"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/tvKisiId"
        android:layout_alignBottom="@+id/tvKisiId"
        android:layout_marginLeft="15dp"
        android:layout_toRightOf="@+id/tvKisiId"
        android:text="Adi" />

    <TextView
        android:id="@+id/tvAlani"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/rbKisi"
        android:layout_toRightOf="@+id/rbKisi"
        android:text="Alani" />

    <TextView
        android:id="@+id/tvSoyadi"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/tvAdi"
        android:layout_alignBottom="@+id/tvAdi"
        android:layout_marginLeft="10dp"
        android:layout_toRightOf="@+id/tvAdi"
        android:text="Soyadi" />

</RelativeLayout>
SimpleCursorAdapter ile bağlanması:
  ListView lvKisiler = (ListView) getActivity().findViewById(R.id.lvKisiler);
  Cursor crs = KisiDataSource.fetchAllKisiler(getActivity());

  String[] fields = new String[] { VTHelper.COL_KISILER_ID,
          VTHelper.COL_KISILER_ADI,
          VTHelper.COL_KISILER_SOYADI,
          VTHelper.COL_KISILER_ALANI };

  int[] toWidgets = new int[] { R.id.tvKisiId,
          R.id.tvAdi,
          R.id.tvSoyadi,
          R.id.tvAlani };
  
  SimpleCursorAdapter sca = new SimpleCursorAdapter(getActivity(), R.layout.kisi_satir, crs, fields, toWidgets, 0);
  lvKisiler.setAdapter(sca);
Custom CursorAdapter ile bağlanması:
CursorAdapter ca = new CursorAdapter(getActivity(), crs) {

 @Override
 public View newView(Context _ctx, Cursor _crs, ViewGroup _parent) {
  LayoutInflater inflater = LayoutInflater.from(_ctx);
  View v = inflater.inflate(R.layout.kisi_satir, _parent, false);
  bindView(v, _ctx, _crs);
  return v;
 }

 @Override
 public void bindView(View _view, Context _ctx, Cursor _crs) {
  CheckBox cbKisiId = (CheckBox)_view.findViewById(R.id.cbKisiId);
  TextView tvKisiId = (TextView)_view.findViewById(R.id.tvKisiId);
  tvKisiId.setText(_crs.getString(_crs.getColumnIndex(VTHelper.COL_KISILER_ID)));
  cbKisiId.setOnCheckedChangeListener(fk);
  TextView tvAdi = (TextView)_view.findViewById(R.id.tvAdi);
  tvAdi.setText(_crs.getString(_crs.getColumnIndex(VTHelper.COL_KISILER_ADI)));
  TextView tvSoyadi = (TextView)_view.findViewById(R.id.tvSoyadi);
  tvSoyadi.setText(_crs.getString(_crs.getColumnIndex(VTHelper.COL_KISILER_SOYADI)));
  TextView tvAlani= (TextView)_view.findViewById(R.id.tvAlani);
  tvAlani.setText(_crs.getString(_crs.getColumnIndex(VTHelper.COL_KISILER_ALANI)));

 }
};
lvKisiler.setAdapter(ca);


17 Mart 2013 Pazar

öğrenme üzerine

  1. Algı
    • DuyuLarla
    • SezgiLerle
  2. Yargı
    • Duygusal
    • Mantıksal
 
Algı-Yargı kombinasyonlarıyla değerlendiriyoruz
 
Verileri alırken somutlaştıran, sezgisel algılayan tarafından abesle iştigal ediyor gibi algılanır.
Arkadaşının hatasını 0 kırılmasın diye ikaz etmeyen(nezaketi önde tutan) duygularıyla yargılayan kişinin yöntemidir. Kusurunu, arkadaşını geliştirmek adına söyleyen kişi mantıksal,rasyonel kişidir. İkiside doğrudur.
3. boyut Algı - Yargı içinde zıtlık içerir. Algılayan(algısallar) insanlar sürekli veri isteyen, karar erteleyerlerdir. Bu insanlar öğreneceğim çok şey vardır derler.
Yargısallar için veri, zaten verdikleri kararı desteklemek içindir. Kararları sabittir. düzenli günleri düzenlidir haftaya yapacakları şeyler bellidir. AlgısallarAntalyaya giderken Ağrıya dönebilir. Yargısalar ise emin olduklarından değişmez ayrılmazlar.
Sezgi algısallar soyut konular, duyusalar için somut konular çok kolay.
 
Kişilik ve tercih değişimi her zaman mümkündür
Algı-Yargı
içe / dışa dönüklük
Yazarak, dokunarak ya da dinleyerek öğrenmenin arkasında kişilik yatar.
Parmak izi kadar eşsizdir insan, kategori edilemez.
 
duyusal düşünenle X sezgisel hisseden
duyusal hisseden X sezgisel düşünen
 
Bir insanda sorun çözme becerisi varsa. o kişinin diplomalı olup olmaması anlamsızdır.
 
Dağınık, düzenli çalışamayan dikkatini toplayamayan Sezgi - algısal bir karakterdir. Sezgi olgISaIı sabun gibidir. sezgi algısal kişiler düzenli çalişmak yerine işleri erteleyebilmek isterler.
 
Eğer çocukla bir çatışma yaşanıyorsa, çocuk ne istediğini belli edecektir. Çocuk dediğin böyle olur, yatağını toplar, yemeğini kendi yer gibi yaklaşımlar yargısal yaklaşımdır. Yargısal lığın hafiflemesi gerekir.
Algısallığımızda, onun kararlarını, kendi kararlarımızı değiştirdiğimiz için ON
da dağıtacaktır.İstikrarsızlaştıracaktır.
 
Yapmayı küçümsediği alaninda önemli olduğunu göstermeli. Dağınık bir çocuğa odasının düzenli olmasının faydasını anlatmak için odasının dekorasyonunu değiştirme imkanı vermeli. Çocuk değişikliği sevdiği için odayı değiştirmek isteyeadet
 
Yargısallar ders programı yaptığında programa sadık kalır. Algısallar değişken oldukları için sadık kalamaz. Algısattığını, yargısallığa dönüştürmek gerekir. Bunun için son bir tarih verecek ama kısa bir aralıkta istediği zamanda bitirmesini sağlamak.Algısallarda uzun bir aralıkta hedefi yakalamaları mümkün olmaz. Onlara hedef koymak gerekir.
 
Zor koşullar çocukların gelişiminde daha iyi etkendir. Nladdi imkanlar arttıkça öğrenme düşebilir.
 
Dağınıklık, suç değildir bir yapıdır ve enerjisi yüksektir.
 
 
 
 
 
 
 
 
 
 
 
 

14 Mart 2013 Perşembe

Java'da Comparable ve Comparator ile kıyaslayarak sıralama


import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

class A implements Comparable<A>
{
 public int a;
 public String b;

 public A(int _a, String _b) {
  a = _a;
  b = _b;
 }

 @Override
 public int compareTo(A _kiyaslanan)
 {
  return this.a - _kiyaslanan.a;
 }

 @Override
 public String toString()
 {
  return a + ":" + b;
 }
}




public class test
{
 public static void main(String[] args)
 {
  A a = new A(10, "on");
  A b = new A(9, "dokuz");
  A c = new A(8, "sekiz");
  A d = new A(7, "yedi");
  A e = new A(6, "altı");




  final List list = new ArrayList<A>();
  list.add(a);
  list.add(c);
  list.add(b);
  list.add(e);
  list.add(d);




  System.out.println("// Kendi compareTo metoduyla sıralama");
  Collections.sort(list);
  yaz(list);
  System.out.println("// İnterface olarak eklenen compareTo metoduyla sıralama");
  Collections.sort(list, new Comparator<A>() {
   @Override
   public int compare(A a2, A a1)
   {
    // b, String tipinde ve String sınıfının compareTo metoduna göre
    // sıralama
    return a2.b.compareTo(a1.b);
   }
  });
  yaz(list);
 }




 public static void yaz(List list)
 {
  for (int i = 0; i < list.size(); i++)
  {
   System.out.println(list.get(i));
  }
 }
}

BaseAdapter içinde işlenen sıralı metotlar

Daha önce bu yazımı okuyabilirsiniz: En Temel Generic Adapter


package com.example.adapters;

import java.util.ArrayList;
import com.example.fragmentornegi.R;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class SunumAdapter extends BaseAdapter {

 Context ctx;
 ArrayList<SunumSinif> alSunumlar = new ArrayList<SunumSinif>();
 ArrayList<SunumSinif> alHD = null;
 ArrayList<SunumSinif> alPD = null;
 ArrayList<SunumSinif> alNC = null;
 ArrayList<SunumSinif> alRP = null;
 LayoutInflater inf;

 public SunumAdapter(Context _ctx) {
  ctx = _ctx;
  inf = LayoutInflater.from(_ctx);
 }

 public void Ekle(SunumSinif _sunum) {
  if (_sunum.AitOlduguKonu == SunumSinif.KonuHD) {
   if (alHD == null)
    alHD = new ArrayList<SunumSinif>();
   alHD.add(_sunum);
  } else if (_sunum.AitOlduguKonu == SunumSinif.KonuNC) {
   if (alNC == null)
    alNC = new ArrayList<SunumSinif>();
   alNC.add(_sunum);
  } else if (_sunum.AitOlduguKonu == SunumSinif.KonuPD) {
   if (alPD == null)
    alPD = new ArrayList<SunumSinif>();
   alPD.add(_sunum);
  } else {
   if (alRP == null)
    alRP = new ArrayList<SunumSinif>();
   alRP.add(_sunum);
  }
  alSunumlar.add(_sunum);
 }

 @Override
 public int getCount() {
  Log.w("Adapter", "getCount:int");
  return alSunumlar.size();
 }

 @Override
 public Object getItem(int position) {
  Log.w("Adapter", "getItem:Object");
  return alSunumlar.get(position);
 }

 @Override
 public long getItemId(int position) {

  Log.w("Adapter", "getItemId:long");
  return 0;
 }

 public static SunumAdapter getAdapter(Context _ctx) {

  SunumSinif HD1 = new SunumSinif();
  HD1.AitOlduguKonu = SunumSinif.KonuHD;
  HD1.Baslik = "Hemodiyaliz Sunum 1";
  HD1.Tipi = SunumSinif.SunumTipleri.Resim;
  HD1.DosyaYolu = "file:///android_asset/hd1/";

  SunumSinif HD2 = new SunumSinif();
  HD2.AitOlduguKonu = SunumSinif.KonuHD;
  HD2.Baslik = "Hemodiyaliz Sunum 2";
  HD2.Tipi = SunumSinif.SunumTipleri.Resim;
  HD2.DosyaYolu = "file:///android_asset/hd2/";

  SunumSinif HD3 = new SunumSinif();
  HD3.AitOlduguKonu = SunumSinif.KonuHD;
  HD3.Baslik = "Hemodiyaliz Sunum 3";
  HD3.Tipi = SunumSinif.SunumTipleri.Resim;
  HD3.DosyaYolu = "file:///android_asset/hd3/";

  SunumSinif HD4 = new SunumSinif();
  HD4.AitOlduguKonu = SunumSinif.KonuHD;
  HD4.Baslik = "Hemodiyaliz Sunum 4";
  HD4.Tipi = SunumSinif.SunumTipleri.Resim;
  HD4.DosyaYolu = "file:///android_asset/hd4/";

  SunumSinif HDhtml1 = new SunumSinif();
  HDhtml1.AitOlduguKonu = SunumSinif.KonuHD;
  HDhtml1.Baslik = "Ayı Videolu HTML";
  HDhtml1.Tipi = SunumSinif.SunumTipleri.Html;
  HDhtml1.DosyaYolu = "file:///android_asset/hdHtml1/index.html";

  SunumAdapter sa = new SunumAdapter(_ctx);
  sa.Ekle(HD1);
  // sa.Ekle(HD2);
  // sa.Ekle(HD3);
  // sa.Ekle(HD4);
  // sa.Ekle(HDhtml1);
  return sa;
 }

 static class ViewHolder {
  TextView tvBaslik;
  TextView tvKonu;
 }

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  ViewHolder holder;
  Log.w("Adapter", "getView:View");
  if (convertView == null) {
   convertView = inf.inflate(com.example.fragmentornegi.R.layout.sunum_satir, null);
   holder = new ViewHolder();
   convertView.setTag(holder);
   holder.tvBaslik = (TextView) convertView.findViewById(R.id.tvBaslik);
   holder.tvKonu = (TextView) convertView.findViewById(R.id.tvKonu);
  } else {
   holder = (ViewHolder) convertView.getTag();
  }

  holder.tvBaslik.setText(alSunumlar.get(position).Baslik);
  holder.tvKonu.setText(alSunumlar.get(position).AitOlduguKonu);
  return convertView;
 }

}

Eklemek istediğim şey ise, event sırası ve adediydi.
Ama önce aşağıdaki statik sınıfı neden yarattığımızı(bak aklıma ne geldi, yarattık dedi diye Allah'a -haşa rakip değil kimse ama- kafir ilan ederdik milleti, bence kelimeyi kutsallaştırmak en tehlikelisi, neyse konuya döneyim)anlatayım. ListView içinde satır sayısı çok olacaksa sürekli findViewById ile satır elemanlarını bulmak yerine statik bir sınıfa bu elemanları bağlamak ideal olanı (bkz static sınıf tanımlanması). Adapter sınıfımız içindeki ViewHolde static sınıfından türettiğimiz her nesne, static sınıfın bellekte tanımlı aynı yerine işaret edeceği için bileşenleri bulup bu static sınıf nesnesine atıyoruz ve böylece her View(liste satırı) oluştururken tekrar tekrar findViewById işlemi yapmıyoruz.
static class ViewHolder {
  TextView tvBaslik;
  TextView tvKonu;
}
Sınıf hazır ve getView içerisinde holder isminde değişken yaratıp eğer containerView boş ise değerini oluşturuyor değilse View sınıfının setTag metoduyla daha önce oluşturup atadığımız holder metodundan çekiyor ve satır bileşenlerinin değerlerini atıyoruz.
İlk yüklemede getCount metoduna 4 kez giriyor ve peşine getView metodu ve bir kez daha getCount ve getView daha.
Dokunduktan sonra ise getItem ve 3 kez getCount ardından iki kez getItemId .


Ekran görüntüsü ise:

13 Mart 2013 Çarşamba

Android içinde WebView kullanarak HTML gösterimi

Kendime not:
Video oynatılamıyor çünkü droid web browserlar html5 video oynatmaya yeterli değil
Android webview cannot render youtube video embedded via iframe

<!DOCTYPE html>
<html>
<body>
<img src="img/dac_logo.png"/>

<video width="320" height="240" controls>
  <source src="mm/movie.mp4" type="video/mp4">
  <source src="mm/movie.ogg" type="video/ogg">
  Your browser does not support the video tag.
</video>

</body>
</html>

package com.example.fragmentornegi;

import java.io.IOException;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebSettings;
import android.webkit.WebView;

public class Sag extends Fragment {
 @Override
 public View onCreateView(LayoutInflater inflater, 
   ViewGroup container, 
   Bundle savedInstanceState) {
  return inflater.inflate(R.layout.sag, container, false);
 }

 @Override
 public void onStart() {
  super.onStart();
  try {
   String[] sarrH1Dosyalari = getActivity().getAssets().list("html");
   for (int i = 0; i < sarrH1Dosyalari.length; i++) {
    Log.w("HD 1 içindekiler", sarrH1Dosyalari[i]);
   }

   WebView wv = (WebView) getActivity().findViewById(R.id.webv);
   wv.getSettings().setJavaScriptEnabled(true);
   wv.getSettings().setPluginState(WebSettings.PluginState.ON);
   wv.loadUrl("file:///android_asset/html/index.html");

   final String mimetype = "text/html";
   final String encoding = "UTF-8";
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}

VMWare guest sanal makinesi yavaş kapanıyor

Ref: communities.vmware.com
Solution: VMWare Guest Shutdowns very slow

In certain scenarios, you may find that shutting down a VM is very slow for no apparent reason. I found this to be true under the condition I’m running:
Windows 7 64-Bit
Utilizing an external USB drive to host the guest VHD
8GB RAM
Using a Dell laptop (tried on a D630 and Precision M4500)
To fix this issue, navigate to the following file and add these settings:
C:\ProgramData\VMware\VMware Workstation\config.ini AND C:\ProgramData\VMware\VMware Player
prefvmx.minVmMemPct = "100"
mainMem.useNamedFile = "FALSE"
mainMem.partialLazySave = "FALSE"
mainMem.partialLazyRestore = "FALSE"
You should notice immediate improvement in shutdown speed.

Peki VMWare içinde Config.ini bulamadıysanız:
Ref: Creating and editing config.ini on Windows hosts
Solution
The config.ini file may not exist if you have not changed the default configuration setting from the Edit > Preferences menu.

To see if the file already exists, look for it in:

C:\Documents and Settings\All Users\Application Data\VMware\VMware_Product_Name

Where VMware_Product_Name is the name of the product you are using.

Notes:

Make sure you are looking on the Windows host on which you have installed the VMware software. You should not look for this file in your virtual machine.
On Windows Vista, Windows 7, Windows 8, Windows Server 2012, and Windows 2008 Server R2 hosts, look for the file in:

C:\ProgramData\VMWare\VMware_Product_Name\config.ini

Note: This folder is normally hidden by default. In order to make this folder viewable/accessible:

Open a new folder.
Go to Tools > Folder Options.
Click the View tab, and select Show hidden files, folders and drives.
To create the file if it does not exist:
Open Notepad.

Caution: Do not use Word or Wordpad, because these editors create extra characters in the text file that render the configuration settings that you add unreadable.

Save a new, empty text file named config.ini in the location above.

27 Şubat 2013 Çarşamba

Action ve Func ile asenkron metot çağrı

using System;
using System.Collections.Generic;
using System.Threading;

namespace KlinikOzetTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("----------------- aksiyonParametresiz ---------");
            #region 
            // Action tipli değişkenlerin asenkron çağrıların, BeginInvoke ile çağırdığımız metotları 
            // EndInvoke ile sonlandırılımalıdır sonuç dönsün ve varsa hafızadaki thread fırlatılsın.
            Action aksiyonParametresiz = DonussuzParametresizMetot;
            Console.WriteLine("BeginInvoke Öncesi: " + DateTime.Now.ToString());
            object o = null;
            IAsyncResult iResult = aksiyonParametresiz.BeginInvoke(delegate { Console.WriteLine("döndüm ben"); }, o);
            Console.WriteLine("BeginInvoke sonrası: " + DateTime.Now.ToString());
            while (!iResult.IsCompleted)
            {
                Console.WriteLine("BeginInvoke tamalanmadı: " + DateTime.Now.ToString());
                if (iResult.IsCompleted)
                {
                    Console.WriteLine("EndInvoke öncesi: " + DateTime.Now.ToString());
                    aksiyonParametresiz.EndInvoke(iResult);
                    Console.WriteLine("EndInvoke sonrası: " + DateTime.Now.ToString());
                }
                
            }

            #endregion

            Console.WriteLine("----------------- aksiyonParametreli ---------");
            #region Parametreli Action değişkeninin çalıştırılması
            int paramInt = 12;
            float paramFloat = 12f;
            Action<string, int, float> aksiyonParametreli = DonussuzParametreliMetot;
            aksiyonParametreli("param string", paramInt, paramFloat);
            #endregion

            Console.WriteLine("----------------- fonksiyonParametresiz ---------");
            Func<string> fonksiyonParametresiz = DonuslüParametresizMetot;
            string sDonenSonuc = fonksiyonParametresiz();

            Console.WriteLine("----------------- fonksiyonParametreli ---------");
            Func<string, int, float, int> fonksiyonParametreli = DonuslüParametreliMetot;
            Console.WriteLine("Invoke Öncesi: "+DateTime.Now.ToString());
            int iDonen = fonksiyonParametreli.Invoke("param param", 14, 10f);
            Console.WriteLine("Invoke Sonrası: " + DateTime.Now.ToString());
            
        }

        #region VOID dönüşlü metotlar ACTION ile referans edilebilir.
        static void DonussuzParametresizMetot()
        {
            int i = 0;
            while (i < 10)
            {
                Thread.Sleep(500);
                i++;
            }
            Console.WriteLine(DateTime.Now);
        }

        static void DonussuzParametreliMetot(string _s, int _i, float _f)
        {
            Console.WriteLine(DateTime.Now);
        } 
        #endregion

        #region DÖNÜŞ tipli metotlar FUNC ile değişkene atanabilir
        static string DonuslüParametresizMetot()
        {
            Console.WriteLine(DateTime.Now);
            return DateTime.Now.ToShortDateString();
        }

        static int DonuslüParametreliMetot(string _s, int _i, float _f)
        {
            int i = 0;
            while (i < 10)
            {
                Thread.Sleep(500);
                i++;
            }
            Console.WriteLine(DateTime.Now);
            return 19;
        } 
        #endregion

    }
}
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:47
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
27.02.2013 15:08:48
BeginInvoke tamalanmadı: 27.02.2013 15:08:48
EndInvoke öncesi: 27.02.2013 15:08:48
döndüm ben
EndInvoke sonrası: 27.02.2013 15:08:48
----------------- aksiyonParametreli ---------
27.02.2013 15:08:48
----------------- fonksiyonParametresiz ---------
27.02.2013 15:08:48
----------------- fonksiyonParametreli ---------
Invoke Öncesi: 27.02.2013 15:08:48
27.02.2013 15:08:53
Invoke Sonrası: 27.02.2013 15:08:53
Press any key to continue . . .
Action,Func ya da Predicate: Func vs. Action vs. Predicate
Action için Türkçe kaynak: http://www.yazilimdevi.com/Makaleler-1198-cSharp-action-tipini-dogru-kullanmak.aspx
Daha önceden yazdığım: Form harici bir sınıftan formun kontrollerine erişmek
Dışarıdan bir referans: www.muratguvenc.net
[Begin/End]Invoke Ne işe yarar: Delegate.BeginInvoke()/EndInvoke() implementation ve dotnetcurry.com

21 Şubat 2013 Perşembe

Android - SDCard erişimi

String sdcard = System.getenv("EXTERNAL_STORAGE");

// File.separator = /
java.io.File f = new java.io.File(baseDir + java.io.File.separator + fileName);



Galaxy GT-N8005'in Bağlı Cihazlar Listesinde Görünmesi

Sorun sürücü problemi ve Samsung'un sürücü sayfasından indirilerek çözülüyor.




19 Şubat 2013 Salı

Visual Studio'nun uzun satırları keserek aşağı almasından şikayetçiyim hakim bey

Keske stackoverflow cevabını buraya hızlıca embed edebilecek bir şey olsaydı:
Aşağıdaki cevabın referansı şudur:http://stackoverflow.com/a/238737/104085

Cevap ise Resharper'da aşağıdaki resme ulaşım işareti kaldırmakta:

15 Şubat 2013 Cuma

E-Reçete İlaç Listesi sayfasından excel dosyasını indirmek ve içeriğini SQL tablosuna girmek

SKRS E-Reçete İlaç Listesi adresindeki excel dosyalarını indirmek ve MSSQL veritabanına atmak isitiyorum.

Adım adım ne nasıl yapılıyor bakalım.

İnternet sayfasından dosya adreslerini bulup indirmek

Bir web sayfasını indirmek istiytorsanız yöntem çok: WebClient Class, HttpRequest Class
Ben yaygın olan WebClient'ı kullandım:
string sDomain = "http://www.iegm.gov.tr/";
string sPage = "Default.aspx?sayfa=erecete_liste&lang=tr-TR";
WebClient wc = new WebClient();
// sayfa UTF8 kodlamasıyla yayında olsun
wc.Encoding = Encoding.UTF8;
string s = wc.DownloadString(sDomain + sPage);

Html içindeki bir elementi bulmak istiyorsanız en kestirmeden Parsing HTML Tags in C# makalesindeki kodu uygulayabilirsiniz.
HtmlTag tag;
var parse = new HtmlParser(s);
while (parse.ParseNext("a", out tag))
{
    string value;
    if (tag.Attributes.TryGetValue("href", out value))
    {
        // Excel dosyalarının isimlerindeki ortak metin
        if (value.IndexOf("farmasotik_urunler_listesi") > 0)
        {
            Uri uri = new Uri(sDomain + value);
            // URL üzerinde dosya adını split etilmiş Segmenets özelliğinin sonunda bulacağız. 
            wc.DownloadFile(uri, @"c:\Temp\" + uri.Segments[uri.Segments.Length - 1]);
        }
    }
}

Dosyalar indiğinde bir excel dosyasına bakalım ve yapısını görelim:


Excel içindeki verileri çekip VT'ye aktarma

Provider sağlam olmalı. Eğer *.xlsx dosyalarıyla boğuşmak istiyorsanız Microsoft Access Database Engine 2010 Redistributable indirmeli ve kurulmalı.

Excel dosyasına az önce kurduğumuz artık Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\\klasorAdi\dosyaAdi;Extended Properties="Excel 8.0;HDR=YES;IMEX=1;" bağlantı cümlesi ile bağlanabiliriz. Bunun için OleDbAdapter sınıfını kullanacağız.
Excel içinde her bir sheet içindeki satırları SELECT * FROM ["sheetAdı"$] ifadesi ile bir DataTable'a çekebiliriz.
public static DataTable f_SheetToDataTable(string _sExcelPath, string _sSheetName)
{
    // OleDbAdaptor'de oluşturduğumuz nesneneyle excel dosyamıza bağlanmak için kullanacağımız bağlantı cümlesi
    string connectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;""", _sExcelPath);
    // Excel içinde çalıştırmak istediğimi sorgumuz
    string query = String.Format("select * from [{0}$]", _sSheetName);
    OleDbDataAdapter dataAdapter = new OleDbDataAdapter(query, connectionString);
    DataTable dataSet = new DataSet();
    // Sonucu DataTable içine atalım.
    var dt = new DataTable();
    dataAdapter.Fill(dt);
    return dt;
}
}

DataTable ile dönen bilgilerimizi şimdide veri tabanına aktaralım. Ama önce tabloyu oluşturup bu tablo için otomatik insert ifadelerini oluşturacak şekile getirelim.
CREATE TABLE [dbo].[IlaclarAktif](
 [id] [int] IDENTITY(1,1) NOT NULL,
 [ad] [nvarchar](255) NULL,
 [Barkodb] [float] NULL,
 [firma] [nvarchar](255) NULL,
 [skrs_recete_turu] [nvarchar](255) NULL,
 [skrs_durum] [nvarchar](255) NULL,
 [aciklama] [nvarchar](255) NULL,
 CONSTRAINT [PK_IlaclarAktif] PRIMARY KEY CLUSTERED 
(
 [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

Tabloyu oluşturduktan sonra yansısını kodumuzda oluşturalım ki bize sql cümleleri oluşturtmak zorunda bırakmasın:
string connectionString = "Data Source=10.130.214.20,8586;Initial Catalog=cop;User Id=sa;Password=xxx;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
  connection.Open();
  // SQL cümlemizde maksadımız tablonun şemasını alabilmek. Bu yüzden tek satır veri çekiyoruz.
  using (var adapter = new SqlDataAdapter("SELECT top(1) * FROM TabloAdi", connection))
  {
    using (var builder = new SqlCommandBuilder(adapter))
    {
        // adapter nesnenimizin xxxCommand ozelliklerini set etmek için:
        adapter.UpdateCommand = builder.GetUpdateCommand();
        adapter.InsertCommand = builder.GetInsertCommand();
        adapter.DeleteCommand = builder.GetDeleteCommand();
    }
  }
}

Eğer SqlCommandBuilder sınıfına ait bir nesne oluşturmazsanız InsertCommand oluşturulmamış olacaktır ve aşağıdaki hatayı alırsınız:
Update requires a valid InsertCommand when passed DataRow collection with new rows.

Bir DataTable nesnesi yaratıp içine bir kaç satır ekleyerek bunları VT'ye basacağız. Bunu yapmak için SqlDataAdapter nesnemizin Update() metodunu çağıracağız.
DataTable dtExcel = f_SheetToDataTable("c:\\Temp\\ilacListesi.xls, "AKTİF ÜRÜNLER LİSTESİ");
string connectionString = "Data Source=10.130.214.20,8586;Initial Catalog=cop;User Id=sa;Password=xxx;";
using (var cnn = new SqlConnection(connectionString))
{
    cnn.Open();
    using (var adapter = new SqlDataAdapter("SELECT top(1) * FROM IlaclarAktif", cnn))
    {
        var dtIlaclarAktif = new DataTable("IlaclarAktif");
        try
        {
            // Tablomuzun yapısını(şemasını) dataTable nesnemize aktaralım
            adapter.Fill(dtIlaclarAktif);

            // Excel'de ilk satır sutun adlarını içerdiği için Skip(1)
            // Tablomuzda ilk sütun olan id alanı için her yeni satıra 0 değeri atıyor,
            // dtExcel İçindeki satırları tablomuzdaki sıraya göre object[] tipinde arr nesnesinde oluşturuyor,
            // VT Tablomuzun şemasını ve 1 satırını içeren dtIlaclarAktif tablomuzun satırlarına ekliyoruz.
            var v = dtExcel.Rows.Cast().Skip(1).Select(
                delegate(DataRow row)
                    {
                        var arr = new[] {0, row[0], row[1], row[2], row[3], row[4], row[5]};
                        dtIlaclarAktif.LoadDataRow(arr, LoadOption.Upsert);
                        return arr;
                    });
                        
            // InsertCommand'ın null olması sorun çıkartmasın diye SqlCommandBuilder sınıfından bir nesne yaratıyoruz
            using (var builder = new SqlCommandBuilder(adapter))
            {
                adapter.Update(dtIlaclarAktif);
            }
        }
        catch (Exception ex)
        {
            throw (ex);
        }
    }
}

Excel dosyasındaki bir sheet'i DataTable yapan metot budur:
public static DataTable f_SheetToDataTable(string _sExcelPath, string _sSheetName)
{
    // 
    string connectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;""", _sExcelPath);
    string query = String.Format("select * from [{0}$]", _sSheetName);
    OleDbDataAdapter dataAdapter = new OleDbDataAdapter(query, connectionString);
    var dt = new DataTable();
    dataAdapter.Fill(dt);
    return dt;
}

Tüm kodu buraya yapıştırmak isterdim ama zaten siz nasıl olduğunu anladınız ve parçaları bir araya getirmek sizin için artık çocuk oyuncağı değil mi?

Projenin açık kaynak koduna:
http://code.google.com/p/skrs-erecete-ilac-listesi/
adresinden erişebilirsiniz.

DbContext ile Code First yöntemi ve LinqToExcel projesiyle yeniden yaptım

E tabi kod son derece küçüldü. Excel dosyalarını SQL'de tutma kararım uygulamaların taşınması esnasında veri kaybı yaşanmaması içindi.
Önce POCO(Plain Old CLR Object) sınıfları:
ExcelDosya Sınıfı, VT'da excel dosyasını indirdiğimiz URL'yi, hangi tarihli ilaç listesi olduğunu ve excel dosyasını barındıracak.
using System;
using System.Configuration;
using System.Linq;

namespace ExcelToVT
{
    public class ExcelDosya
    {
        public int id { get; set; }
        public string Adres { get; set; }
        public byte[] Dosya { get; set; }
        public DateTime DosyaTarihi { get; set; }
        public DateTime EklenmeTarihi { get; set; }

        public void f_ToVT()
        {
            Kontext ktx = new Kontext(ConfigurationManager.ConnectionStrings["VtCnn"].ConnectionString);
            var a = ktx.ExcelDosyalari.Where(e => e.Adres.Equals(this.Adres)).FirstOrDefault();
            if (a == null)
            {
                ktx.SaveChanges();
            }
        }
    }
}
f_ToVT() metodu hızlı bir şekilde bu dosya yoksa VT'na ekleme işini yapıyor.

Ilac sınıfında excel içinden çekilen satırların VT'na aktarımını(varsa ve değişmişse güncellemesini, yoksa eklenmesini) sağlayacak.
using System.Configuration;
using System.Linq;

namespace ExcelToVT
{
    public class Ilac
    {
        public int id { get; set; }
        public string skrs_ilac_adi { get; set; }
        public decimal skrs_barkod { get; set; }
        public string skrs_firma { get; set; }
        public string skrs_recete_turu { get; set; }
        public string skrs_durum { get; set; }
        public string Aciklama { get; set; }

        public Ilac() { }

        public override bool Equals(object _iegm)
        {
            var iegm = _iegm as IEGMIlac;
            if (iegm == null)
            {
                return false;
            }

            bool bDegisti = iegm.skrs_ilac_adi.Equals(this.skrs_ilac_adi) &&
                            iegm.skrs_durum.Equals(this.skrs_durum) &&
                            iegm.skrs_firma.Equals(this.skrs_firma) &&
                            iegm.skrs_recete_turu.Equals(this.skrs_recete_turu) &&
                            iegm.Aciklama.Equals(this.Aciklama);
            if (!bDegisti)
            {
                this.skrs_ilac_adi = iegm.skrs_ilac_adi;
                this.skrs_durum = iegm.skrs_durum;
                this.skrs_firma = iegm.skrs_firma;
                this.skrs_recete_turu = iegm.skrs_recete_turu;
                this.Aciklama = iegm.Aciklama;
            }
            return !bDegisti;
        }

        public Ilac(string _sCnnStr, IEGMIlac _iegm)
        {
            Kontext ktx = new Kontext(ConfigurationManager.ConnectionStrings[_sCnnStr].ConnectionString);
            Ilac ilac = ktx.Ilaclar.FirstOrDefault(k => k.skrs_barkod.Equals(_iegm.skrs_barkod));
            if (ilac == null)
            {
                this.skrs_barkod = _iegm.skrs_barkod;
                this.skrs_durum = _iegm.skrs_durum;
                this.skrs_firma = _iegm.skrs_firma;
                this.skrs_ilac_adi = _iegm.skrs_ilac_adi;
                this.skrs_recete_turu = _iegm.skrs_recete_turu;
                this.Aciklama = _iegm.Aciklama;
                ktx.Ilaclar.Add(this);
                int a = ktx.SaveChanges();
            }
            else
            {
                if (ilac.Equals(_iegm))
                {
                    ktx.SaveChanges();
                }
            }
        }
    }
}

IEGMIlac sınıfı excel içindeki her satır ilacın önce geçici bir nesneye aktarılmasını, ardından VT'na aktarımında Ilac sınıfından nesne oluşturmada yapıcı metoda parametre olarak geçirilmede kullanılacak.
namespace ExcelToVT
{
    public class IEGMIlac
    {
        public int id { get; set; }
        public string skrs_ilac_adi { get; set; }
        public decimal skrs_barkod { get; set; }
        public string skrs_firma { get; set; }
        public string skrs_recete_turu { get; set; }
        public string skrs_durum { get; set; }
        public string Aciklama { get; set; }
    }
}

Code First için DbContext sınıfından bir türetme yapmanız ve VT yapınızı burada belirtmeniz gerekiyordu(önceki yazılarımda konuyla ilgili bilgi bulabilirsiniz):
using System.Data.Entity;

namespace ExcelToVT
{
    public class Kontext : DbContext
    {
        public Kontext(string connectionString)
            : base(connectionString) { }

        protected override void OnModelCreating(DbModelBuilder mb)
        {
            mb.Entity().Map(p => p.ToTable("Ilaclar"));

            mb.Entity().Property(p => p.id).HasColumnName("id").IsRequired();
            mb.Entity().Property(p => p.skrs_barkod).HasColumnName("skrs_barkod").IsRequired();
            mb.Entity().Property(p => p.skrs_durum).HasColumnName("skrs_durum");
            mb.Entity().Property(p => p.skrs_firma).HasColumnName("skrs_firma");
            mb.Entity().Property(p => p.skrs_ilac_adi).HasColumnName("skrs_ilac_adi");
            mb.Entity().Property(p => p.skrs_recete_turu).HasColumnName("skrs_recete_turu");

            mb.Entity().HasKey(p => p.id);

            mb.Entity().Map(a => a.ToTable("ExcelDosyalari"));
            mb.Entity().HasKey(a => a.id);
        }
        public DbSet Ilaclar { get; set; }
        public DbSet ExcelDosyalari{ get; set; }
    }
}

İşin toplu olarak yapıldığı SKRS3ExcelToDB sınıf:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using HtmlAgilityPack;
using LinqToExcel;

namespace ExcelToVT
{
    static class ExtensionIEnumerable
    {
        /// 
        /// IEnumerable tipinde dizi içinde parametrede verilen metoda dizi elemanlarını ve indeksini geçirir.
        /// 
        /// İçinde dönülecek dizinin tipi
        /// İçinde dönülecek dizi        /// Dizi elemanlarının ve elemanın indeks değerinin gönderileceği metot        public static void ForEachIndex(this IEnumerable e, Action del)
        {
            var i = 0;
            foreach (var cur in e)
            {
                del(cur, i);
            }
        }
    }

    public class SKRS3ExcelToDB
    {
        private string m_CnnStrName;
        public SKRS3ExcelToDB(string _sConnectionStringName)
        {
            m_CnnStrName = _sConnectionStringName;
        }
        public FileInfo f_ToVT(ExcelDosya _excel, string _sSheetName = "AKTİF ÜRÜNLER LİSTESİ")
        {
            if (!Directory.Exists("c:\\Temp"))
            {
                throw new FileNotFoundException("C:\\Temp klasörü bulunamadı! Bu yüzden excel dosyası oluşturulamıyor ve sorgulanamıyor.");
            }

            string sExcelFileName = string.Format("C:\\Temp\\excel_{0}.xlsx", DateTime.Now.ToString("dd.MM.yyyy_hh.mm.ss"));
            var fi = new FileInfo(sExcelFileName);
            File.WriteAllBytes(fi.FullName,_excel.Dosya);

            // Excel'deki verilerimizi DataTable nesnemiz dtExcel'e aktarıyoruz.
            IQueryable dtExcel = f_SheetToDataTable(fi.FullName, _sSheetName);
            var a = "";
            dtExcel.AsEnumerable().ForEachIndex((g, h) =>
                                                    {
                                                        new Ilac(m_CnnStrName, g);
                                                    });
            var b = from iegmIlac in dtExcel
                    select new[] {new Ilac(m_CnnStrName, iegmIlac)};
            return fi;
        }

        public string f_SayfayiIndir(string _sUrl)
        {
            Uri uri = _sUrl != null
                      ? new Uri(_sUrl)
                      : new Uri("http://www.iegm.gov.tr/Default.aspx?sayfa=erecete_liste&lang=tr-TR");

            try
            {
                return new WebClient
                {
                    Encoding = Encoding.UTF8
                }.DownloadString(uri);
            }
            catch (Exception ex)
            {
                throw new Exception(String.Format("{0} Adresinden HTML kaynak kodu indirilirken istisna fırlatıldı.", uri.AbsoluteUri));
            }
        }


        FileInfo f_DosyaIndir(Uri _Uri, DirectoryInfo _dirKaydedilecekKlasor)
        {
            try
            {
                string sDosyaYolu = _dirKaydedilecekKlasor.FullName + "\\" + _Uri.Segments[_Uri.Segments.Length - 1];

                new WebClient().DownloadFile(_Uri, sDosyaYolu);
                return new FileInfo(sDosyaYolu);
            }
            catch (Exception ex)
            {
                throw (ex);
            }
        }

        public List f_DosyaIndir(string _sDomain, string _sHtmlCode, DirectoryInfo _dirKaydedilecekKlasor, string _sATaginda = "E-Reçete İlaç Listesi - ")
        {
            var doc = new HtmlDocument();
            doc.LoadHtml(_sHtmlCode);

            var ed = from lnks in doc.DocumentNode.Descendants()
                        where lnks.Name == "a"
                              && lnks.InnerText.StartsWith(_sATaginda)
                        select
                            new ExcelDosya()
                            {
                                Adres = lnks.Attributes["href"].Value,
                                DosyaTarihi = Convert.ToDateTime(lnks.InnerText.Substring(lnks.InnerText.IndexOf(" - ") + 2).Trim(), new DateTimeFormatInfo() { ShortDatePattern = "dd.MM.yyyy" }),
                                EklenmeTarihi = DateTime.Now,
                                Dosya = File.ReadAllBytes(f_DosyaIndir(f_HrefToUri(_sDomain, lnks.Attributes["href"].Value), _dirKaydedilecekKlasor).FullName),
                            };
            return ed.ToList();
        }


        private Uri f_HrefToUri(string _sDomain, string _sAdres)
        {
            return _sAdres.StartsWith("http")
                                  ? new Uri(_sAdres)
                                  : new Uri(_sDomain.Insert(_sDomain.Length, "/") + _sAdres);
        }

        public IQueryable f_SheetToDataTable(string _sExcelPath, string _sSheetName)
        {
            var excel = new ExcelQueryFactory(_sExcelPath);
            var aktif = from c in excel.WorksheetRangeNoHeader("A3", "F65000", _sSheetName)
                        select new IEGMIlac()
                                   {
                                       skrs_ilac_adi = c[0],
                                       skrs_barkod = Convert.ToDecimal(c[1]),
                                       skrs_firma = c[2],
                                       skrs_recete_turu = c[3],
                                       skrs_durum = c[4],
                                       Aciklama = c[5],
                                   };
            return aktif;
        }

        public ExcelDosya f_SonExcelDosyasi()
        {
            List lstExcelDosyalari = f_DosyaIndir("http://www.iegm.gov.tr/", f_SayfayiIndir(null), new DirectoryInfo(@"c:\temp"));
            if (lstExcelDosyalari.Count == 0)
            {
                throw new Exception("Excel dosyaları bulunamadı!");
            }

            Kontext ktx = new Kontext(m_CnnStrName);
            lstExcelDosyalari.ForEachIndex((cur, idx) => ktx.ExcelDosyalari.Add(cur));
            ktx.SaveChanges();
            

            ExcelDosya sayfadakiSonExcel = lstExcelDosyalari.OrderByDescending(p => p.DosyaTarihi).FirstOrDefault();
            return sayfadakiSonExcel;
        }
    }

}

Console Application olduğuna göre bir tetikleyiciye ihtiyacımız var o da:
using ExcelToVT;

namespace NameSpaceProgram
{
    class Program
    {
        private static void Main(string[] args)
        {
            SKRS3ExcelToDB skrs = new SKRS3ExcelToDB("VtCnn");
            ExcelDosya sayfadakiSonExcel = skrs.f_SonExcelDosyasi();
            skrs.f_ToVT(sayfadakiSonExcel, "PASİF ÜRÜNLER LİSTESİ");
            skrs.f_ToVT(sayfadakiSonExcel, "AKTİF ÜRÜNLER LİSTESİ");
        }
    }
}


Proje sayfasına yenisini güncelledim: http://code.google.com/p/skrs-erecete-ilac-listesi/

10 Şubat 2013 Pazar

Fluent API - WithMany İlişkisi

Ref: Julia Lerman
Önceki haliyle sadece HasRequired metoduyla bağlandığında aşağıdaki gib oluşacaktı:
Buradaki durum bir makalenin kesinlikle bir bir Blog'a ait olması haliydi. Sol tarafta Post'un olduğunu düşünürseniz 1-1 ilişkiden söz ediyor oluruz. Bu ilişkide Blog eklenebilir çünkü Post olmasada olur ama Post HasRequired ile Blog özelliği belirtilmeksizin kayıt eklenemez.
Entities in 'Ctx_Blog.Posts' participate in the 'Post_Blog' relationship. 0 related 'Post_Blog_Target' were found. 1 'Post_Blog_Target' is expected.
Hatası alınır. Bu hatanın oluştuğu ekran şudur:
Buna göre Blog soldayken One To Zero Or Many kayıt girişi yapılabilir ki o da şöyledir:

Yukarıdaki gibi bir Blog birden fazla makaleye sahip olabilir. One To Many ilişkisini yaratmak için Fluent API'de WithMany metodunu kullanacağız. Bu metodu zincir bir linq cümlesinde HasRequired metodundan sonra görebiliriz. WithMany metodunu parametresiz çağırdığnız vakit Post tablosunda otomatik olarak bir FK oluşturacaktır. Bu FK, Blog tablosundaki Id ye işaret edecektir çünkü HasRequired metodu hangi tablonun Post tablosunda FK olarak yer aldığını gösterdik.
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
    modelBuilder.Entity<Post>()
                .HasRequired(p => p.Blog)
                .WithMany();
}
Resimde dikkat edilecek nokta ikinci oluşan FK dır(Blog_Id1).
Bu durum elbette istediğimiz hâl değildir. WithMany metodunda Blog sınıfının hangi özelliğinin Post sınıfından çoklu nesne taşıdığını işaretlemeliyiz. Yani; Post sınıfında bir Blog tanımlanması gerekir (HasRequired(p=>p.Blog) ve Blog sınıfında birden çok(many) Post barındıran özelliğin (WithMany(b=>b.Posts)) işaretlemesi yapılır.
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
    modelBuilder.Entity()
                .HasRequired(p => p.Blog)
                .WithMany(b=>b.Posts);
}
Buna göre aşağıdaki yapı oluşur:

Buna birde Post tablosundaki Blog_Id FK'sının adını FKBlogId gibi yaratmak istediğimizde önce Post sınıfına FKBlogId özelliğini ekleyelim:
public class Post {
        public int Id { get; set; }
        public string Title { get; set; }
        public DateTime DateCreated { get; set; }
        public string Content { get; set; }
        public int FkBlogId { get; set; }
        public Blog Blog { get; set; }
    }
Bu durumda hem FKBlogId alanı oluşacak hem de HasRequired(p=>p.Blog) ilişkisinden dolayı FK olarak Blog_Id oluşacaktır. Aşağıdaki gibi bir ekran oluşacak ve yapacak diğer işimizi görebileceksiniz:
FKBlogId tabloda oluştu ama Post-Blog ilişkisinde kullanacağımız FK'nın bu olacağını bildirmemiz gerekiyor o da HasForeignKey metoduyla şöyle yapılır:
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
    modelBuilder.Entity()
        .HasRequired(p => p.Blog)
        .WithMany(b=>b.Posts)
        .HasForeignKey(p=>p.FkBlogId);
}


Tüm Kod:
using System;
using System.Collections.Generic;
using System.Data.Entity;

namespace caFluentAPI {
    class Program {
        static void Main(string[] args) {
            var ctx = new Ctx_Blog();
            var b = new Blog() {
                BloggerName = "CemT",
                Title = "Notlarımdan",
                Posts = new[]{
                    new Post() {Title="Başlık 1", Content = "İçerik 1",DateCreated = DateTime.Now},
                    new Post() {Title="Başlık 2", Content = "İçerik 2",DateCreated = DateTime.Now}
                }
            };
            ctx.Blogs.Add(b);
            ctx.SaveChanges();
        }
    }
    public class Ctx_Blog : DbContext {
        public Ctx_Blog() : base("name=cnn") {
            Database.SetInitializer Ctx_Blog>(new DropCreateDatabaseAlways<Ctx_Blog>());
        }
        protected override void OnModelCreating(DbModelBuilder modelBuilder) {
            modelBuilder.Entity<Post>()
                .HasRequired(p => p.Blog)
                .WithMany(b=>b.Posts)
                .HasForeignKey(p=>p.FkBlogId);
        }
        public DbSet<Blog> Blogs { get; set; }
        public DbSet<Post> Posts { get; set; }
    }
    public class Blog {
        public int Id { get; set; }
        public string Title { get; set; }
        public string BloggerName { get; set; }
        public virtual ICollection<Post> Posts { get; set; }
    } 
    public class Post {
        public int Id { get; set; }
        public string Title { get; set; }
        public DateTime DateCreated { get; set; }
        public string Content { get; set; }
        public int FkBlogId { get; set; }
        public Blog Blog { get; set; }
    }
}

Fluent API - HasRequired - One To Zero Or One ilişkisi

Ref: Julia Lerman
"Bir makale daima bir Blog'a ait olmalıdır" tanımını gerçeklemek için Blog ve Post sınıfları arasında şöyle bir ilişki tanımlanmalıdır:
public class Blog
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public string BloggerName { get; set; }
        public virtual ICollection<Post> Posts { get; set; }
    }
    public class Post
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public DateTime DateCreated { get; set; }
        public string Content { get; set; }
        public int BlogId { get; set; }
        public Blog Blog { get; set; }
    }
Buna göre şu DB oluşur. Dikkat etmeniz gereken yer BlogId alanının Not Null olarak Post tablosunda oluşmasıdır. Bunu yapanın public int BlogId { get; set; } özelliği olduğuna dikkat ediniz.


Eğer Post içindeki BlogId özelliğini "EF zaten public Blog Blog { get; set; } özelliğini görür görmez oluşturacak" derseniz
O zamanda Null bırakılabilir bir makale girişi yapabiliyor olacaksınız. One - To - [Zero Or One](1-0..1) ilişkisini solda Blog olacak şekilde kurdunuz demektir.

Peki public int BlogId { get; set; } özelliğini sınıf içinde tanımlamadan Fluent API ile OnModelCreating metodunda tanımlamak isterseniz:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
}
Post sınıfındaki Blog özelliğinin gerekli olduğunu belirmek için:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Post>().HasRequired(p => p.Blog);
}

Son şekliyle kodumuz:
using System;
using System.Collections.Generic;
using System.Data.Entity;

namespace caFluentAPI {
    class Program {
        static void Main(string[] args) {
            var ctx = new Ctx_Blog();
            var v = new Blog() {
                    BloggerName = "CemT",
                    Title = "Notlarımdan",
                };
            ctx.Blogs.Add(v);
            ctx.SaveChanges();
        }
    }

    public class Ctx_Blog : DbContext {
        public Ctx_Blog() : base("name=cnn") {
            Database.SetInitializer<Ctx_Blog>(new DropCreateDatabaseAlways<Ctx_Blog>());
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder) {
            modelBuilder.Entity<Post>().HasRequired(p => p.Blog);
        }
        public DbSet<Blog> Blogs { get; set; }
        public DbSet<Post> Posts { get; set; }
    }

    public class Blog
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public string BloggerName { get; set; }
        public virtual ICollection<Post> Posts { get; set; }
    }
    public class Post
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public DateTime DateCreated { get; set; }
        public string Content { get; set; }
        //public int BlogId { get; set; }
        public Blog Blog { get; set; }
    }
}