Newton-Raphson Metodu ile Fonksiyon Kök Bulma

Newton-Raphson metodu, sayısal analizde, eşitlik köklerinin bulunmasında en yaygın kullanılan metotlardan birisidir. Başlangıç için tahmini bir kök değeri seçilerek, yapılan iterasyon sonucu gerçek kök değerine oldukça yakın bir değere ulaşılır.

Newton-Raphson

Newton-Raphson metodunun C# dilinde yazılmış kaynak kodu yer almaktadır.

public class NewtonRaphson
{
    public uint MaxIteration { get; set; } = 50;
    public double Epsilon { get; set; } = 0.000001;

    public double Solve(Func<double, double> f, Func<double, double> df, double initialGuess)
    {
        var xn = initialGuess;

        for (var i = 0; i < this.MaxIteration; i++)
        {
            var xn1 = xn - f.Invoke(xn) / df.Invoke(xn);

            if (Math.Abs(xn - xn1) < this.Epsilon)
            {
                return xn1;
            }

            xn = xn1;
        }

        return xn;
    }
}

Örneğin f(x) = x^2 - 2 fonksiyonun köklerini bulmak için, metodu aşağıdaki şekilde çağırabiliriz. Tahmini kök değeri olarak 1 seçilmiştir.

var solver = new NewtonRaphson();
var root = solver.Solve(x => x * x - 2, x => 2 * x, 1);

Benzer şekilde, f(x) = x - Cos(x) fonksiyonun köklerini bulmak için ise, metodu aşağıdaki şekilde çağırabiliriz. f(x) = 1 + Sin(x) fonksiyonun türevidir.

var solver = new NewtonRaphson();
var root = solver.Solve(x => x - Math.Cos(x), x => 1 + Math.Sin(x), 2);
Etiketler:  C#

Bitcoin Altında Yatan Teknoloji / Blockchain

Blockchain, Bitcoin altında yatan teknolojidir.

Bitcoin para transferi konusunda alternatif bir yaklaşım getirmektedir. Mevcut sistemde, iki hesap arasında para transferi için, bankalar, WesternUnion, PayPal gibi aracı kurumlar kullanılır. Bu yöntem ile para transferi maliyetli ve yavaştır. Bitcoin ile, çok daha düşük maliyetlerle ve daha hızlı bir şekilde transfer işlemi yapmak mümkündür. Bitcoin'in bu avantajı sunmasının altında yatan ana sebep, aracı bir kuruma ihtiyaç duymamasıdır.

Bitcoin ile, merkezi otorite tarafından kontrol edilmeksizin ve dolayısıyla herhangi bir regülasyona tabi olmaksızın para transferi işlemi yapmak mümkündür. Merkez bankası, PayPal vb. merkezi otorite, yapılan transferin geçerliliğini kontrol eden ve her iki tarafa güven veren sistemdir. Bu görev, Bitcoin altında yatan Blockchain sistemi ile yerine getirilmektedir. Blockchain, şeffaf, merkezi olmayan, aracı yapılara ihtiyaç duymayan bir çözüm önerir.

Blockchain

Blockchain sisteminde veriler, katılımcılara açık bir dağıtık (distributed) ağ üzerinde, ağ üzerindeki her makinede birer kopyası olacak şekilde, blok (block) adı verdiğimiz yapılar üzerinde tutulur.

Blok, blockchain üzerinde, verilerin saklandığı yapılardır. Bloklar, bir zincir şeklinde birbirine bağlanarak dizilirler. Örnek gösterim aşağıda verilmiştir.

Blockchain Blocks

Zincir üzerindeki her blok, kendinden önceki bloğu bilmektedir. Dolayısıyla, bir önceki bloğun adresine sahiptir.

Blok, içerisindeki veriler ve üst bilgi (header) şeklinde iki bölümden oluşur. Üst bilgi, veri bütünlüğünü kontrol etmek, blok oluşturulduktan sonra, içerisindeki verilerin değiştirilmesini önlemek için kullanılır. Bunu sağlamak için, kriptografik özetleme (cryptographic hashing) işlemlerinden yararlanılır.

Her blok tekil bir adrese sahiptir. Blok üst bilgisi (header) içerisinde temel olarak, bloğun adresi, önceki bloğun adresi ve blok içerisindeki verilere ait Merkle kök değeri yer alır.

Blok adresi üretmek için özetleme (hash) fonksiyonlarından yararlanılır. Blok içerisindeki veriler ve önceki bloğun adresi kullanılarak bu değer hesaplanır.

Blok oluşturma işlemi, maliyetli bir işlemdir. Örneğin, Bitcoin sisteminde, bir blok üretimi 10 dakika kadar sürmektedir. Kötü niyetli bir kullanıcının bir bloğun verisini ve adresini değiştirmesi durumunda, blok adresi sonraki bloğun adres hesabında kullanıldığı için, kendinden sonraki tüm blok adreslerinin de yeniden hesaplanması gerekecektir. Bu sırada, ağ içerisinde yeni bloklar üretilmeye devam etmektedir. Blok oluşturma işleminin yüksek maliyetinden dolayı, blok içeriklerini değiştirmek pratikte mümkün değildir.

Blockchain üzerindeki tüm bloklar, dağıtık ağ (distributed network) üzerindeki tüm makinelerde kopyalar halinde bulunur. Dolayısıyla, ağ üzerindeki makinelerden birisinin, geçici ya da kalıcı olarak devre dışı kalması durumunda herhangi bir veri kaybı ya da aksama yaşanmaz. Bu durum, merkezi yapının getirdiği riskleri ortadan kaldırmaktadır.

Blockchain Network

Blockchain sistemi üzerinde sürekli yeni veriler dahil edilir. Dahil edilen veriler, ağ üzerindeki makinelerde bloklar şeklinde saklanır. Ağ üzerindeki makinelerin yeni bloklar üretme işlemine, madencilik (mining) denir. Blok oluşturma işlemi sırasında, blok içerisinde yer alacak verilerden Merkle ağacı ve kök değeri hesaplanır. Daha sonra, önceki bloğun adresi de kullanılarak, oluşturulacak yeni blok için uygun bir adres üretilmeye çalışılır. Adres bulma işlemi oldukça maliyetli bir işlemdir. Üretilecek blok adresi için bazı kısıtlamalar vardır. Dolayısıyla, uygun bir adres bulana kadar birçok deneme yapılır. Uygun adresi bulan ilk makine, oluşturduğu yeni bloğu ağ içerisindeki diğer makinelerle paylaşır. Diğer makinelerin çoğunluğunun yeni bloğu onaylaması durumunda, yeni oluşturulan blok blockchain içerisine eklenir. Bitcoin sisteminde, uygun adresi bulan makine Bitcoin ile ödüllendirilir.

.NET Proje - Website Visitor Tracker

Website Visitor Tracker uygulaması, web sitesine yapılan ziyaretlerin kayıt altına alındığı ve raporlandığı bir uygulamadır. Bu uygulama ile, yapılan tüm ziyaretler ve siteyi görüntüleyen kullanıcının bilgileri loglanarak, site sahibi için ziyaretçi raporları oluşturulur.

Proje ile, farklı müşterilerin ziyeretçi bilgilerinin ortak bir veritabanı üzerinde saklandığı, bulut üzerinden çalışan bir .NET uygulaması hazırlanması amaçlanmıştır.

Website Visitor Tracker

Projede bileşenleri ve kullanılacak teknolojiler aşağıdaki gibidir:

ASP.NET MVC Web Uygulaması

Web arayüzü kullanarak, site bilgilerini yönetmek ve ziyaretçi raporlarına erişmek için hazırlanacak web uygulaması

Apache Cordova Mobil Uygulaması

Ziyaretçi raporlarına mobil cihazlar üzerinden erişmek için hazırlanacak mobil uygulama

SQL Server

Ziyaretçi bilgilerinin tutulacağı veritabanı

LINQ to SQL

SQL Server üzerinde sorgulamalar yapma ve verileri yönetmek için kullanacağımız .NET bileşeni

C#, HTML, CSS

Uygulama C# ile yazılacaktır. Ekranlar için HTML ve CSS konuları konusunda bilgi sahibi olmak gerekecektir.

.NET Proje - Key Value Database

Key Value Database sistemleri, sadece bir anahtar ve bu anahtara sahip değerin saklandığı veritabanı sistemleridir. Saklanan veriler ilişkisel ya da hiyerarşik değildir ve veri saklama sırasında kullanılan anahtar ile istenen veriye tekrar erişilebilir.

Proje ile, farklı müşterilerin anahtar-değer verilerinin ortak bir veritabanı üzerinde saklandığı, bulut üzerinden çalışan bir .NET uygulaması hazırlanması amaçlanmıştır.

Key Value Database

Projede bileşenleri ve kullanılacak teknolojiler aşağıdaki gibidir:

ASP.NET MVC Web Uygulaması

Web arayüzü kullanarak veritabanı üzerinde değer kaydetmek ve kaydedilen değerleri raporlamak için hazırlanacak web uygulaması

ASP.NET Web API

Veritabanı üzerinde değer saklama, değer sorgulama vb. işlemlerin servis aracılığıyla yapılması için hazırlanancak servis katmanı

noSQL

Değerleri saklamak için kullanılacak, anahtar-değer deposu. Hangi noSQL teknolojisinin kullanılacağı proje sırasında karar verilecektir.

SQL Server

Müşteri bilgilerinin tutulacağı veritabanı

LINQ to SQL

SQL Server üzerinde sorgulamalar yapma ve verileri yönetmek için kullanacağımız .NET bileşeni

C#, HTML, CSS

Uygulama C# ile yazılacaktır. Ekranlar için HTML ve CSS konuları konusunda bilgi sahibi olmak gerekecektir.

C# 6.0 Exception Filter

tip

try catch kullanımı sırasında, catch bloğunun çalışması için koşul yazılabilir.

Örnek

try
{
    // Code
}
catch (ArgumentException ex) when (ex.ParamName == "p1")
{
    // ex.ParamName == "p1" koşulu sağlanması durumunda catch bloğu çalışır.
}
Etiketler:  C#

Infix, Prefix, Postfix Notasyonu

Bilgisayarda 3 x 4 + 5 vb. aritmetik ifadeleri çözümlemek zor olabilir. Yazacağımız kodda, işlem öncelikleri ve parantezler ifade sonucunu bulmayı zorlaştırabilir. Bu yüzden, aritmetik ifadeleri göstermek için farklı notasyonlar geliştirilmiştir.

Infix Notasyonu

Halihazırda kullandığımız notasyondur. 3 + 4 örneğinde olduğu gibi, operatörler ifade içerisindedir.

3 + 4 x 5 örneğinde olduğu gibi, operatörler arasında işlem önceliği vardır. Verilen örnekte, ilk olarak çarpma işlemi, ardından toplama işlemi yapılır.

İşlem sırasını değiştirmek için parantezler kullanılır. Örneğin, (3 + 4) x 5

Prefix Notasyonu (Polish Notation)

+34 örneğinde olduğu gibi operatörler, işleme sokulacak ifadelerin öncesine yazılır. Verilen örnekte, iki sayı toplanmak istenmektedir.

+3x45 örneğinde olduğu gibi, operatörler arasında işlem önceliği vardır. Verilen örnekte, ilk olarak çarpma işlemi, ardından, bulunan çarpım sonucu ile toplama işlemi yapılır. (Daha anlaşılır olması için +3x45 ifadesini +3[x45] şeklinde anlayabiliriz.)

İşlem önceliğini değiştirmek için parantez kullanmak gerekmez. Örneğin, (3 + 4) x 5 ifadesi x+345 şeklinde ifade edilir. Toplama işlemi yapıldıktan sonra, bulunan toplam sonucuna çarpma işlemi uygulanır. (Daha anlaşılır olması için x+345 ifadesini x[+34]5 şeklinde anlayabiliriz.)

Postfix Notasyonu (Reverse Polish Notation)

34+ örneğinde olduğu gibi operatörler, işleme sokulacak ifadelerin sonrasına yazılır. Verilen örnekte, iki sayı toplanmak istenmektedir.

345x+ örneğinde olduğu gibi, operatörler arasında işlem önceliği vardır. Verilen örnekte, ilk olarak çarpma işlemi, ardından, bulunan çarpım sonucu ile toplama işlemi yapılır. (Daha anlaşılır olması için 345x+ ifadesini 3[45x]+ şeklinde anlayabiliriz.)

İşlem önceliğini değiştirmek için parantez kullanmak gerekmez. Örneğin, (3 + 4) x 5 ifadesi 34+5x şeklinde ifade edilir. Toplama işlemi yapıldıktan sonra, bulunan toplam sonucuna çarpma işlemi uygulanır. (Daha anlaşılır olması için 34+5x ifadesini [34+]5x şeklinde anlayabiliriz.)

Tüm notasyonlarda işlem önceliği; parantez, üs alma, çarpma / bölme, toplama / çıkarma şeklindedir. Aynı işlem önceliğine sahip birden fazla ifadenin gelmesi durumunda, üs alma hariç, soldan sağa doğru işlemler yapılır.

.NET Proje - Link Kısaltma Servisi

Link Kısaltma Servisi uzun linkleri kısaltmak için kullanılan bir yöntemdir. Genel olarak, Twitter, SMS vb. karakter sınırı olan ortamlarda uzun linkleri paylaşmak ve link tıklamalarını raporlamak için tercih edilir.

Proje ile, kullanıcıların uzun linklerini kısaltabileceği ve görüntüleme raporlarına erişebileceği, bulut üzerinden çalışan bir .NET uygulaması hazırlanması amaçlanmıştır.

Link kısaltma işlemi sırasında, linkleri açmak için parola ve süre belirleme, kullanıcı kısıtlama, link görüntülenme sırasında bildirimler alma vb. bir dizi özellik de uygulanacaktır.

Link Kısaltma Servisi

Projede bileşenleri ve kullanılacak teknolojiler aşağıdaki gibidir:

ASP.NET MVC Web Uygulaması

Linkleri kısaltmak ve link tıklama raporlarına erişmek için hazırlanacak web uygulaması

SQL Server

Link verilerinin ve yapılan tıklamaların tutulacağı veritabanı

LINQ to SQL

Veritanını üzerinde sorgulamalar yapma ve verileri yönetmek için kullanacağımız .NET bileşeni

SMTP

Link tıklamalarını link sahiplerine bildirmek için kullanılacak, elektronik posta gönderme protokolü

C#, HTML, CSS

Uygulama C# ile yazılacaktır. Ekranlar için HTML ve CSS konuları konusunda bilgi sahibi olmak gerekecektir.

AJAX

AJAX (Asynchronous JavaScript And XML)

AJAX ile web sayfası yüklendikten sonra, sunucu üzerine veri göndermek ve sunucudan veri almak mümkündür. Böylece, sayfa yenilenmeden, sayfanın belirli bir bölümünün, sunucu tarafından alınan verilerle yenilenebilir.

AJAX

Sunucu ile iletişimi sağlamak için XMLHttpRequest nesnesi kullanılır. Tüm modern tarayıcılar XMLHttpRequest nesnesini destekler.

XMLHttpRequest nesnesi metotları

open(method, url, async) isteği oluşturur. method GET ya da POST olabilir. url iletişimin kurulacağı adrestir. async ise, iletişimin senkron ya da asenkron bir şekilde yapılacağını belirler. Asenkron işlemde, sunucu cevabı beklenmeksizin sayfa çalışmaya devam eder.

send() oluşturulan istediği sunucuya gönderir. method GET olarak seçildiği zaman kullanılır.

send(str) oluşturulan istediği sunucuya gönderir. method POST olarak seçildiği zaman kullanılır.

XMLHttpRequest nesnesi özellikleri

readyState XMLHttpRequest nesnesinin mevcut durumunu gösterir. 4 değeri, sunucu ile iletişimin kurulduğunu ve cevabın hazır olduğunu gösterir.

onreadystatechange readyState özelliğinde bir değişim olduğu zaman çağrılır. Örneğin, sunucuya yapılan istediğin tamamlanması durumunda tetiklenir.

status sunucudan alınan cevabın durumunu gösterir. 200 OK, 404 Not Found, 500 Internal Server Error vb. Ayrıca statusText özelliği de mevcuttur.

responseText sunucudan alınan cevaptır. Eğer sunucudan XML sonuç alınıyorsa, responseXML özelliği de kullanılabilir.

Örnek AJAX Kullanımı

<script type='text/javascript'>

    var request = new XMLHttpRequest();

    request.onreadystatechange = function () {
        // Sunucu cevabı hazır ve sunucudan bir hata alınmadıysa (200: OK)
        if (this.readyState == 4 && this.status == 200) {
            // Sunucudan dönen cevap
            var txt = this.responseText;
        }
    };

    // İstek oluşturuluyor.
    request.open("GET", "demo.aspx", true);

    // İstek gönderiliyor.
    request.send();

</script>

JQuery ile AJAX Kullanımı

JQuery kütüphanesi ile, tüm tarayıcılar ile uyumlu ve daha basit bir şekilde AJAX kullanımı mümkündür.

$.ajax() AJAX istediği oluşturur.

Örneğin, ASP.NET demo.aspx sayfası arkasında yer alan aşağıdaki metodun sonucunu sayfada göstermek istediğimiz zaman:

// JavaScript tarafından bu metoda erişebilmek için eklenmesi ve metodun statik olarak tanımlanması gerekiyor.
[WebMethod]
public static string Method1(string name, int number)
{
    return name + number;
}

JQuery ile yazılmış ilgili AJAX isteği:

<script type='text/javascript'>

    $.ajax({
        type: "POST", // GET ya da POST olabilir
        url: "demo.aspx/Method1", // Url
        data: '{"name":"selami","number":"3"}', // Sunucuya gönderilen veri
        contentType: "application/json",
        success: function (msg) {
            alert(msg.d);
        },
        error: function (err) { alert(err.responseText); }
    });

</script>

Data fazla detay için http://api.jquery.com/jquery.ajax/

Etiketler:  JavaScript

SQL Server Sparse Columns

Bir sütunun verileri genellikle NULL değer alıyorsa, saklanan verinin daha az yer kaplaması için, sütunun Sparse özelliğinin ayarlanması gerekiyor. Böylece %20 ile %40 arasında yer tasarrufu sağlanmış olur.

SQL Server, Sparse özelliği atanmış bir sütunun verilerini saklarken, NULL olmayan değerler için normalden daha fazla yer kullanırken NULL değerler içinse disk alanı kullanmaz. Bu yüzden, sadece NULL değerlerin çokça olduğu sütunlar için Sparse özelliğinin ayarlanması gerekmektedir.

sparse

https://msdn.microsoft.com/en-us/library/cc280604.aspx adresinde, hangi veri tipinde ne kadar yer kazancı olduğu tablo şeklinde verilmiştir.

Etiketler:  SQL

JQuery Cheat Sheet

JQuery, açık kaynak kodlu ve oldukça popüler JavaScript kütüphanelerinden birisidir. JQuery ile daha az zahmetle, anlaşılır, daha az hataya sahip ve tarayıcıdan bağımsız JavaScript kodları yazmak mümkündür.

JQuery

En sık kullandığım JQuery ifadeleri aşağıda listelendi.

Örnek HTML içerik. Bu içerik üzerinde aşağıdaki JQuery metotları uygulanacak.

 <div id="container">
    <a href="#" class="link">Link 1</a>
    <a href="#" class="link">Link 2</a>
    <input type="text" />
</div>

JQuery metotları

Sayfaya JQuery kütüphanesi eklemek için (CDN üzerinden)

<script src="https://code.jquery.com/jquery-latest.min.js"></script>
$(document).ready(function () { // Sayfa yüklenmesi bittikten sonra çalışacak JavaScript kodu });

$("#container"); // id değeri 'container' olan elaman seçiliyor.
$(".link"); // class değeri 'link' olan elamanlar seçiliyor.
$("input"); // Tüm input elamanları seçiliyor.
$("input[type='text']"); // Attribute kullanılarak elamanlar seçiliyor.
$("#container, .link, input"); // Birden fazla elaman aynı anda seçiliyor.
$("div > .link"); // Parent -> child ilişkisi (örnekte, div içerisinde .link sınıfına sahip tüm elemanlar seçiliyor)
$("div .link"); // Parent -> child ilişkisi (sadece bir alt seviye değil, tüm seviyelerdeki elemanlar seçiliyor)
$(".link").hide(); // Elemanları gizle
$(".link").show(); // Gizlenmiş elemanları görünür yap
$(".link").text(); // Eleman metnini al
$(".link").text("Link new text"); // Eleman metnini al
$("#container").html(); // Eleman HTML içeriğini al
$("#container").html("<a href='#'>new HTML content</a>"); // Eleman HTML içeriğini değiştir.
$("input").val(); // Eleman değeri alınıyor. (bu örnekte input metni)
$("input").val("newValue"); // Eleman değeri değiştiriliyor.
$(".link").attr("href"); // Elemanın özelliğini al (href özelliği alınıyor)
$(".link").attr("href", "http://www..."); // Elemanın bir özelliğini değiştir. Yoksa özelliği ekler.
$(".link").removeAttr("href"); // Elemanın özelliğini siliniyor.
$(".link").addClass("className"); // CSS sınıfı ekler
$(".link").removeClass("className"); // CSS sınıfını kaldırır
$(".link").hasClass("className"); // Eleman belirtilen CSS sınıfına sahip mi?
$("#container").css("propertyName"); // CSS style özelliğini geri döndürür. (örneğin, color)
$("#container").css("propertyName", "value"); // CSS style özelliği değiştiriliyor.
$("#container").width(); // Elemanın genişliği
$("#container").height(); // Elemanın yüksekliği,
$("#container").empty(); // Elemanın tüm içeriğini temizler
$(".link").remove(); // Elemanı siler
$(".link").wrap("<div class='new'></div>"); // Seçilen elemanların her birini, parametre olarak verilen elemanın içine koyar. (örnekte, .link sınıfına sahip her bir elemanı div içerisine alıyor.)
$(".link").wrapAll("<div class='new'></div>"); // Seçilen elemanların tümünü, parametre olarak verilen elemanın içine koyar. (örnekte, .link sınıfına sahip tüm elemanları div içerisine alıyor.)
$(".link").unwrap(); // Seçilen elemanların parent elemanını siler. (örnekte, .link sınıfının yer aldığı div siliniyor.)
$("#container").append("<div class='new'></div>"); // Seçilen elemanların içerisine yeni bir eleman ekler.
$("#container").after("<div class='new'></div>"); // Seçilen elemanın peşine yeni bir eleman ekler.
$("#container").before("<div class='new'></div>"); // Seçilen elemanın öncesine yeni bir eleman ekler.
$(".link").parent(); // Seçilen elemanın içerisinde bulunduğu elaman alınıyor. (örnekte, .link sınıfına ait elamanların yer aldığı div)
$("#container").children(); // Seçilen elemanın tüm alt elemanları alınıyor. Sadece birinci seviyedeki elemanlar alınır.
$("#container").next(); // Sonraki eleman alınır.
$("#container").prev(); // Önceki eleman alınır.
$("#container").find("a"); // Seçilen elemanın, verilen kritere alt elemanları alınıyor. Tüm seviyedeki elemanlar alınır. (örnekte, div içerisindeki tüm a elamanları alınıyor)
$(".link").first(); // Seçilen elemanların ilki alınıyor.
$(".link").eq(1); // .link sınıfına ait ikinci eleman seçiliyor. (zero based index)
$(".link").slice(1, 2); // Seçilen elemanlardan sadece verilen aralıktakiler alınıyor. (örnekte, 2. ve 3. eleman alınıyor. üst sınır verilmezse, 2. elemandan itibaren tüm elemanlar alınır.)
$(".link").add("#container"); // Seçilen elemanlara yeni elemanlar ekler.
$(".link").filter(function () { return $(this).css("display") == "none"; }); // Filtre şartına uyan elemanlar seçiliyor. (örnek, .link sınıfına sahip ve gizlenmemiş tüm elemanlar seçiliyor)
$(".link").each(function (index) { return $(this).hide(); }); // Seçilen elemanların her biri için, verilen fonksiyondaki işlemi uygular.
$(".link").click(function () { alert(1); }); // Seçilen elemana tıklanıyor
$(".link").mouseover(function () { $(this).text("mouse over"); }); // Fare ile elemanın üzerine gelindi
$(".link").mouseout(function () { $(this).text("mouse out"); }); // Fare elemanın üzerinden ayrıldı
$(".link").first().focus(); // Seçilen elemana odaklan
$(window).resize(function () { alert(1); }); // Ekran büyültüldü ya da küçültüldü
Etiketler:  JavaScript
Sayfa 1 2 3

Kategoriler

Algoritma (4), Cheat Sheet (2), İpucu (4), Kendime Not (1), Kod (5), Proje (4), Veritabanı (3), Workshop (3)

Etiketler

C# (10) HTML (1) JavaScript (2) SQL (3)

İngilizce / Türkçe

İngilizce / Türkçe kelime listesi kendime not