All posts by M. Cahid AYDIN

Linq Expression larını birleştirmek

Bu yazıda DataSourceRequest nesnesi ile kendi yazdığımız bir linq expression ı nasıl birleştireceğimizi anlatacağım. Bu işlemi bir .net sınıfı olan ExpressionVisitor sınıfı ile yapacağız. Kullanacağımız custom ExpressionVisitor şu şekilde

class ParameterUpdateVisitor : ExpressionVisitor
    {
        private ParameterExpression _oldParameter;
        private ParameterExpression _newParameter;

        public ParameterUpdateVisitor(ParameterExpression oldParameter, ParameterExpression newParameter)
        {
            _oldParameter = oldParameter;
            _newParameter = newParameter;
        }

        protected override Expression VisitParameter(ParameterExpression node)
        {
            if (object.ReferenceEquals(node, _oldParameter))
                return _newParameter;

            return base.VisitParameter(node);
        }
        public static Expression<Func<T, bool>> UpdateParameter<T>(Expression<Func<T, bool>> expr,ParameterExpression newParameter)
        {
            var visitor = new ParameterUpdateVisitor(expr.Parameters[0], newParameter);
            var body = visitor.Visit(expr.Body);

            return Expression.Lambda<Func<T, bool>>(body, newParameter);
        }
    }
public Expression<Func<VType, bool>> KendoFilterExpression(DataSourceRequest req, Expression<Func<VType, bool>> predToJoin = null)
        {
            var str = "";
            if (req != null && req.Filter != null && req.Filter.Filters.Count() > 0)
            {
                str = req.Filter.ToExpressionMy(req.Filter.Filters.ToList(), CaseInSensitive);
                var dataVal = req.Filter.Filters.Select(a => (CaseInSensitive && a.Value.GetType() == "".GetType()) ? a.Value.ToString().ToUpperInvariant() : a.Value).ToArray();
                var kendoExp = System.Linq.Dynamic.DynamicExpression.ParseLambda<VType, bool>(str, dataVal);

                if (predToJoin != null)
                {
                    // linq içindeki parametreyi (a=> deki a) birleştireceğimiz expression ın parametresi ile aynı yapıyoruz
                    kendoExp = ParameterUpdateVisitor.UpdateParameter<VType>(kendoExp, predToJoin.Parameters.Single());
                    var e = Expression.Lambda<Func<VType, bool>>(Expression.And(predToJoin.Body, kendoExp.Body), kendoExp.Parameters);
                    return e;
                }
                else
                    return kendoExp;
            }
            else
            {
                if (predToJoin != null)
                    return predToJoin;
                else
                    return null;
            }
        }

Kendo Grid için varsayılan filtre operatörü özelliği

Kendo Grid için kolon varsayılan filtre operatörü eklentisi

kullanım basitçe şu şekilde:

columns: [{
field: “productName”,
// Buraya varsayılan olarak gelmesini istediğimiz filter operatörünü yazıyoruz
defaultFilter:”contains”
}, {
field: “category”
}
],

Örnek için tıklayınız

function InitColumnListMenu(e) {
  var menuColums = e.container.find("[role='menuitemcheckbox']");
	menuColums.each(function (index, item) {
		var columnChkInput = $(item).find("input");
		var columnName = columnChkInput.data("field");
  	var columnOption = e.sender.options.columns.filter(function (data) {
				return data.field == columnName;
			});
		if (columnOption.length &gt; 0) {
			var removable = columnOption[0].removable == false;
			var isDisabled = columnChkInput.prop("disabled");
			if (removable &amp;&amp; !isDisabled) {
				columnChkInput.attr("type", "radio");
				columnChkInput.parent().click(function (e) {
					var e = e || event;
					e.stopPropagation();
					return false;
				});
			}
		}
	});
}
function InitFilterMenu(e) {
  var drpDowns = $(e.container).find("[data-role='dropdownlist']").not('.k-filter-and');
	var numericInputs = $(e.container).find("[data-role='numerictextbox']");
	var inputs = $(e.container).find('input[type=text]').not(".k-formatted-value");
	if (inputs.length != drpDowns.length)
		return;

	var dfoCol;
	$(e.sender.options.columns).each(function (i, item) {
		if (item.field == e.field)
			dfoCol = item;
	});

	// defaultFilter
	drpDowns.each(function (i, select) {

    //kolon bulundu ise ve defaultFilter özelligi set edildi ise
		if (dfoCol &amp;&amp; dfoCol.defaultFilter &amp;&amp; inputs[i].value == "") 
		{
			var dfo = dfoCol.defaultFilter;
			var dfoOption = $(select).find("option[value='" + dfo + "']");
			if (dfoOption) {
				var dfoIndex = dfoOption.index();
				var d = $(select).getKendoDropDownList();
				d._initial = dfoCol.defaultFilter;
				d.select(dfoIndex);
				d.trigger('change');
			}
		}
	});
	numericInputs.each(function (i, nInput) {
		var editor = $(nInput).getKendoNumericTextBox();
     //kolon bulundu ise ve editorFormat özelligi set edildi ise
		if (dfoCol &amp;&amp; dfoCol.editorFormat)
		{
			editor.setOptions({
				format: dfoCol.editorFormat
			});
		}
    //kolon bulundu ise ve editorDecimals özelligi set edildi ise
		if (dfoCol &amp;&amp; dfoCol.editorDecimals) 
		{
			editor.setOptions({
				decimals: dfoCol.editorDecimals
			});
		}
	});
}
$("#grid").kendoGrid({
	selectable: "multiple cell",
	allowCopy: true,
	filterable: true,
	columns: [{
			field: "productName",
    defaultFilter:"contains"
		}, {
			field: "category"
		}
	],
  columnMenu:true,
 	filterMenuInit: function (e) {
    var that = e;
		e.sender.bind("open", function (e) {
			InitFilterMenu(that);
		});
	},
  columnMenuInit:function(e){
    if (e.sender.options.filterable) {
      var that = e;
			var filterMenu = e.container.find("[data-role='filtermenu']").getKendoFilterMenu();
			if (filterMenu) {
				filterMenu.popup.bind("open", function (e) {
					InitFilterMenu(that);
				});
			}
		}
  },
	dataSource: [{
			productName: "Tea",
			category: "Beverages"
		}, {
			productName: "Coffee",
			category: "Beverages"
		}, {
			productName: "Ham",
			category: "Food"
		}, {
			productName: "Bread",
			category: "Food"
		}
	]
});

Tekrar merhaba,

Öncelikle sunucu değiştirme ve diğer başka sebeplerden dolayı wordpres yazılarımı tekrar girmem gerekti, bu durumdan dolayı kısa bir aksama oldu. Özür dilerim sanki çok önemsiyen varmış gibi. 😀

Ama şunu belirtmek isterim ki barındırma için godaddy bir felaketti ve digitalocean bir harika.

Nasipse bu süreçte öğrendiklerimden yola çıkarak bir iki yazı yazmayı düşünüyorum.

Çalışan Sql Sorgularını ve Sürelerini Bulmak

Darboğazlarla karşılaştığımızda ne yaparız?
Tabiki sebep olan işlemi bulmak isteriz..

İşte size bu iş için kısa bir çözüm.

SELECT sqltext.TEXT,
req.session_id,
req.status,
req.command,
req.cpu_time,
req.total_elapsed_time
FROM sys.dm_exec_requests req
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS sqltext

Bir diğer Sql i de Pinal Dave den alıntı yapıyorum:

SELECT
db.name DBName,
tl.request_session_id,
wt.blocking_session_id,
OBJECT_NAME(p.OBJECT_ID) BlockedObjectName,
tl.resource_type,
h1.TEXT AS RequestingText,
h2.TEXT AS BlockingTest,
tl.request_mode
FROM sys.dm_tran_locks AS tl
INNER JOIN sys.databases db ON db.database_id = tl.resource_database_id
INNER JOIN sys.dm_os_waiting_tasks AS wt ON tl.lock_owner_address = wt.resource_address
INNER JOIN sys.partitions AS p ON p.hobt_id = tl.resource_associated_entity_id
INNER JOIN sys.dm_exec_connections ec1 ON ec1.session_id = tl.request_session_id
INNER JOIN sys.dm_exec_connections ec2 ON ec2.session_id = wt.blocking_session_id
CROSS APPLY sys.dm_exec_sql_text(ec1.most_recent_sql_handle) AS h1
CROSS APPLY sys.dm_exec_sql_text(ec2.most_recent_sql_handle) AS h2
GO

Detaylar için :

http://blog.sqlauthority.com/2010/10/06/sql-server-quickest-way-to-identify-blocking-query-and-resolution-dirty-solution/

Filtrelenmiş indexlerin nimetlerini araştırırken bulduğum güzel bir yazıyı  paylaşmak istiyorum. Aslında belli bir kritere göre nunclustered indexleri silme ile ilgili bir yazı arıyordum. Baktım güzel bilgiler var okuma ve paylaşma gereği hissettim. Buyrun (bu yazınınöncüsü de var aslında)

Gmail Üzerinden Mail Göndermek

Merhabalar,

Gmail üzerinden mail gönderme ihtiyacı benim gibi vasat yazılımcıların karşısına sıkça çıkmaktadır.
Genelde ufak çaplı, kurumsal olmayan işlerde ihtiyaç duyduğumuz Gmail Üzerinden Mail Gönderme işi ilk kez bunu deneyenlere biraz can sıkıcı gelebilmektedir. Bu yazıda bu can sıkıcı durumun üstesinden canımızı sıkmadan gelmenin yollarını anlatacağım.

Soruları duyar gibiyim ..

  • .Net ile nasıl göndereceğim?

System.Net ve System.Net.Mail namespace lerini kullanarak SmtpClient sınıfı ile.

  • Hangi portu kullanacağım?

587 nolu portu kullacaksınız.

  • ssl kullanacak mıyız?

Evet ssl kullanacağız

Basitçe metodumuz şu şekilde olacak

public static void GmailUzerindenMailGonder(string gonderen, string alici, string konu, string icerik, string kullaniciAdi, string kullaniciSifre)

{

var client = new SmtpClient("smtp.gmail.com", 587)

{

Credentials = new NetworkCredential(kullaniciAdi, kullaniciSifre),

EnableSsl = true

};

client.Send(gonderen, alici, konu, icerik);

}

C# ile mail göndermek nekadar basit değil mi?

İşte canınızı sıkan sorunlar burada başlıyor.

Herşeyi aynen yaptım niye hata alıyorum?

Çünkü “Google Güvenliğe Önem Veriyor”

İçeriğini anlamadığımız hataların sebebi üzerinde mail göndermeye çalıştığımız gmail hesabının güvenlik ayarları.

Google ın uygulamaya koyduğu 2 seviyeli güvenlik ayarlarını yaparak ve dahiyane bir fikir olan uygulamaya özel şifre üreterek bu problemlerden kurtulabilir ve aynı zamanda güvenliğimizi de üst seviyeye çıkarabiliriz.

Bunun için

  • ilgili gmail hesabını açarak hesap ayarlarından güvenlik sekmesini açıyoruz.

Google Hesap Ayarları

Google Hesap Ayarları – Güvenlik Sekmesi

  • 2 seviyeli güvenlik özelliğini aktif etmek için hazırlanmış sihirbazı açıyoruz.

2 Seviyeli Güvenlik

  • cep telefon bilgimizi sms ile doğruluyoruz.
  • cep doğrulama işleminden sonra ilk işimiz yedek kod üretmek olmalı, çünkü cep telefonumuz yanımızda olmadığı durumlarda bu kodları kullanacağız.

Google Hesap Ayarları – Yedek Kodlar

  • ardından uygulamaya özel şifreler tabına geçerek sadece mail göndermek için kullanacağımız bir şifre üretiyoruz.
  • gmail içindeki ayarlardan POP ve IMAP ı da açmayı unutmayalım..

Gmail Ayarlar Menüsü

Gmail Ayarlar Menüsü – Yönlendirme ve Pop Ayarları

  • ve işlem tamam.

Bundan sonrası çok kolay, mail atarken gmail e oturum açarken kullandığımız şifrenin yerine uygulamaya özel oluşturduğumuz şifreyi yazarak deneyelim.. işte oldu..

Hepinize kolay gelsin, umarım yardımcı olmuştur.

 

Javascript ile html nesnelerinin yerini değiştirme

Javascript ile html nesnelerinin yerini değiştirme, yukarı aşağı kaydırma ve nesne silme işlemlerini basitçe nasıl yapabiliriz, işte size ufak bir örnek.

Başlık

<input type='text' id='baslik' name='baslik' />Değer

<input type='text' id='deger' name='deger' />

<input type='button' value='Ekle' onclick="AddItem()" />

<input type='button' value='Temizle' onclick="Clear()" />

<div id="data-list" name="data-list">

    <ul>

    </ul>

    <div id="data-list-count"></div>

</div>

function AddItem() {

    var baslik = $("#baslik").val();

    var deger = $("#deger").val();

    var dataListCount = GetCount();

    var dataListObj = $("#data-list").find("ul");

    var removeBtnText = "<a href='#' onclick='RemoveItem(event)'>Çıkar</a> ";

    var upBtnText     = "<a href='#' onclick='UpItem(event)'     >Yukarı</a> ";

    var downBtnText   = "<a href='#' onclick='DownItem(event)'>Aşağı</a> ";

    var itemText = "<li>"+dataListCount+" - " + removeBtnText + downBtnText + upBtnText + "<span class='badge'>" + deger + "</span>" + baslik + "</li>";

    dataListObj.append(itemText);

    UpdateCount();

}

function RemoveItem(e) {

    var evt = e || window.event; // this assign evt with the event object

    var current = evt.target || evt.srcElement; // this assign curr

    if($(current).parent().is("li")) {

        $(current).parent().remove();

    }

    UpdateCount();

}

function UpItem(e) {

    var evt = e || window.event; // this assign evt with the event object

    var current = evt.target || evt.srcElement; // this assign curr

    var upItem = $(current).parent().prev();



    if (upItem !== null && upItem.is("li")) {

        $(current).parent().swapWith(upItem);

    }

    UpdateCount();

}

function DownItem(e) {

    var evt = e || window.event; // this assign evt with the event object

    var current = evt.target || evt.srcElement; // this assign curr

    var downItem = $(current).parent().next();



    if (downItem !== null && downItem.is("li")) {

        $(current).parent().swapWith(downItem);

    }

    UpdateCount();

}

function Clear() {

    var baslik = $("#baslik").val();

    var deger = $("#deger").val();

    var dataListObj = $("#data-list").find("ul");

    dataListObj.empty();

    UpdateCount();

}

$.fn.swapWith = function(swap_with_selector) {

    var el1 = this;

    var el2 = $(swap_with_selector);



    if ( el1.length === 0 || el2.length === 0 )

        return;



    var el2_content = el2.html();

    el2.html(el1.html());

    el1.html(el2_content);

};

function GetCount()

{

    return $("#data-list").find("ul").find("li").length;

}

function UpdateCount() {

    $("#data-list-count").text("Toplam " + GetCount() + " seçenek");

}

Sql Server Çok Sayıda Satırı Silme

Bazen çok sayıda satırı silmeniz gerekebilir. “Çok sayıda” biraz göreceli bir kavram olduğu için izah etmekte fayda var. Burada bahsedilen “çok sayıda” benim karşılaştığım 100 milyon satır gibi durumlar olabileceği gibi 10 bin satır gibi de olabilir. 10 bin satır altında böyle bir işleme bence gerek yok. Yalnız bazı istisnai durumlarda 10 binlik silme işleminde de gerekebilir. Örneğin çok fazla trigger a sahip olan tablolardan silme işlemi yaparken.

Ben genelde bu tür işlemleri sqlserver görevi oluşturarak ve sistemin en az yoğun olduğu saatlere zamanlayarak gerçekleştiriyorum. Size de tavsiyem budur. Yalnız burada dikkat edilmesi gereken bir konu daha mevcut, o da bu adreste izah edilmekte.

 

 DECLARE @RowsDeleted INTEGER
 DECLARE @RowPerDeletion INTEGER
 DECLARE @Yil INTEGER
 
 SET @RowPerDeletion = 10000
 SET @RowsDeleted = 1
 
 WHILE (@RowsDeleted &gt; 0)
 BEGIN
 DELETE TOP(@RowPerDeletion)  — isterseniz filtreleme de yapabilirsiniz
 SET @RowsDeleted = @@ROWCOUNT
 END