MySql Performans Ayarları

MySql üzerinde bazı denetlemeleri kurulu olan mysqlcheck aracı ile yapabilirsiniz. Mysql veritabanı kontrolü için aşağıdaki komutu kullanabilirsiniz.

mysqlcheck -cA -u root -p

Mysql database optimizasyonu için;

mysqlcheck -oA -u root -p

Bozuk veritabanının onarımı için;

mysqlcheck -rA -u root -p

Bu komutları çalıştırmak için MySql>bin klasörü içinde olmalısınız.

MySql konfigürasyon dosyasında kullandığınız server özelliklerine göre bazı değişiklikler yaparak MySql in performanslı ve hızlı olmasını sağlayabilirsiniz. Bu ayarlar Windows ve Linux işletim sistemlerinin her ikisinde de uygulanabilir. Windows için my.ini dosyasını Linux için my.cfn dosyasını değiştirmelisiniz.

Dikkat: İlk olarak içinde değişiklik yapacağınız MySql konfigürasyon dosyasının bir yedeğini alın.

Aşağıdaki anlatımda 8GB Ram belleğe sahip bir server için yapılandırma yapacağım.

innodb_buffer_pool_size : Varsayılan değeri 128M'dir. InnoDB'nin belleğe yüklenen veri ve dizinleri için ne kadar bellek kullanacağını belirlediğinden, değiştirmek istediğiniz ana ayardır. Özel bir MySQL sunucusu için önerilen boyut, mevcut fiziksel belleğin % 50-80'idir. Bu değerin çok yüksek ayarlanmasının tehlikesi, işletim sistemi dosya sistemi önbelleğine ve InnoDB'nin işlem günlüklerine dayanan bazı MySQL alt sistemleri için bellek kalmamasıdır. InnoDB daha çok bellek içi veritabanı gibi davranır, verileri diskten bir kez okur ve ardından sonraki okumalar sırasında bellekten verilere erişir. Arabellek havuzu, ekleme ve güncelleme işlemleriyle değiştirilen verileri bile önbelleğe alır, böylece disk yazma işlemleri daha iyi performans için birlikte gruplanabilir.

innodb_buffer_pool_size = 5GB

innodb_log_file_size : Varsayılan olarak 48M'dir. Bir günlük grubundaki her günlük dosyasının bayt cinsinden max boyutudur. Yüksek yazma hızı gerektiren sistemler arka plan denetim noktası etkinliklerinin daha uzun süreler boyunca düzgün bir şekilde performans göstermesine olanak sağlamak için bunu artırmak isteyebilir. 4GB'a kadar olan değerler güvenlidir. Tarihsel olarak, büyük bir günlük dosyasıyla çalışmanın dezavantajı, çökme kurtarma sürelerinin artmasıydı. Ancak bu, MySql 5.5 ve 5.6'da büyük ölçüde iyileştirildi. MySQL 5.5 ve daha yüksek sürümlerde kurtarma performansında yapılan iyileştirmeler, günlük dosyası boyutunu daha az dikkate almasına rağmen, daha büyük günlük dosyaları da çökme kurtarmayı yavaşlatır.

innodb_log_file_size = 128M

innodb_file_per_table : Bu özellik devre dışıysa (varsayılan) InnoDB paylaşılan tablo alanında tablolar oluşturur. Innodb_file_per_table etkinleştirilirse (= 1) InnoDB, paylaşılan tablo alanı yerine veri ve dizinleri depolamak için kendi .ibd dosyasını kullanarak her yeni tabloyu oluşturur.

innodb_file_per_table=1

innodb_flush_method : O_DIRECT olarak ayarlandığında, işletim sisteminin önbelleğe alma işlemi atlanacaktır. Bir donanım RAID denetleyicisi kullanıyorsanız, bunu O_DIRECT olarak ayarlamak isteyebilirsiniz. Bu InnoDB arabellek havuzu sayfalarını okurken hem InnoDB'de hem de işletim sisteminin dosya sistemi önbelleğinde bir kopyasının bulunmasının "çift arabelleğe alma" etkisini önler. Bu innodb_buffer_pool_size de düzgün bir şekilde ayarlandığından, çift arabelleğe alma ek yükü olmadığını garanti eder. Bir donanım RAID denetleyiciniz yoksa veya bazı SAN'larda O_DIRECT daha kötü performansa neden olabilir, bu durumda kullanmamanız önerilir.

innodb_flush_method = O_DIRECT

key_buffer_size : Varsayılan değeri 64M'dir. MyISAM tabloları için MySQL'e bellek (RAM) ayırır. MyISAM tabloları için index blokları arabelleğe alınır ve tüm evreler tarafından paylaşılır. key_buffer_size index blokları için kullanılan arabellek boyutudur. Anahtar arabelleği, anahtar önbelleği olarak da bilinir. Key_buffer_size, MyISAM motorunda ince ayar yapmak için muhtemelen en kullanışlı tek değişkendir. MyISAM'ın kendisinin verileri değil, yalnızca indexleri önbelleğe aldığını unutmayın. Dolayısıyla, mümkünse, bu ayarın değeri tüm dizinlerinizin boyutunu kapsamalıdır.  Sunucunuzda kullanılabilir bellek varsa, key_buffer_size değerini artırmak veritabanı hızını önemli ölçüde artırabilir. MySQL belgeleri, 256MB'den daha büyük RAM'e sahip sunucular ve birçok tablo içeren bir veritabanı için 64M'lik bir ayar önerir. MyISAM tabloları için, sunucunuzdaki RAM'in % 25'inden büyük olmayan bir değer önerilir.

key_buffer_size = 256M

max_connections : Maksimum eş zamanlı bağlantı miktarını ayarlar (varsayılan olarak 151). Daha yüksek bir ayar, daha fazla eşzamanlı isteklere izin verir.  “too many connections” hatası görürseniz, daha fazla bağlantıya izin vermek için bu değeri artırmak isteyebilirsiniz. Bunun dezavantajı, daha fazla eşzamanlı bağlantı için daha fazla donanım gerektirmesidir.

max_connections = 250

innodb_log_buffer_size : Günlük dosyaları için arabellek boyutunu belirler. Verilerinize ve trafiğinize bağlı olarak, arabellek hızla dolabilir ve bu nedenle bu değeri yükseltmek performansa yardımcı olabilir.

innodb_log_buffer_size = 8M

query_cache_size : Siteniz ve veritabanınız arasındaki etkileşim daha açık yöndeyse ve siteniz veritabanından yazmaktan daha fazla okuma eğilimi gösteriyorsa, query_cache_type'ı açık tutmak ve query_cache_size değerini 128M veya 256M gibi bir değere ayarlayabilirsiniz.

query_cache_size = 256M

tmp_table_size : Dahili bellek içi geçici tabloların maksimum boyutu. (Gerçek sınır, minimum tmp_table_size ve max_heap_table_size olarak belirlenir.) Bellek içi bir geçici tablo sınırı aşarsa, MySQL bunu otomatik olarak disk üzerindeki MyISAM tablosuna dönüştürür. Çok sayıda gelişmiş GROUP BY sorgusu yapıyorsanız ve çok fazla belleğiniz varsa tmp_table_size değerini (ve gerekirse max_heap_table_size) artırın. Bu değişken, kullanıcı tarafından oluşturulan BELLEK tabloları için geçerli değildir. 

tmp_table_size = 32M

thread_cache_size : Sunucunun yeniden kullanım için kaç tane evreyi önbelleğe alması gerektiği. Bir istemcinin bağlantısı kesildiğinde, orada thread_cache_size'den daha az evre varsa istemcinin evreleri önbelleğe alınır. İş parçacığı istekleri, mümkünse önbellekten alınan iş parçacıklarının yeniden kullanılmasıyla karşılanır ve yalnızca önbellek boş olduğunda yeni bir iş parçacığı oluşturulur. Çok sayıda yeni bağlantınız varsa, performansı artırmak için bu değişken artırılabilir. Normalde, eğer iyi bir iş parçacığı uygulamasına sahipseniz, bu önemli bir performans artışı sağlamaz. Ancak, sunucunuz saniyede yüzlerce bağlantı görürse, yeni bağlantıların çoğunun önbelleğe alınmış evreleri kullanması için normalde thread_cache_size'yi yeterince yüksek ayarlamanız gerekir. 

thread_cache_size = 100

table_open_cache : Tüm iş parçacıkları için açık tablo sayısı. Bu değeri artırmak, mysqld'nin gerektirdiği dosya tanımlayıcı sayısını artırır. Tablo önbelleğini artırmanız gerekip gerekmediğini kontrol ediniz. (Komut: SHOW GLOBAL STATUS LIKE 'open_tables';)

table_open_cache = 600

innodb_flush_log_at_trx_commit : Veritabanını tamamen ACID uyumlu hale getiren 1 varsayılan değerine sahiptir. Değeri 0 veya 2 olarak değiştirebilirsiniz, her ikisi de daha az güvenilirlik pahasına performans kazançları sunar.

innodb_flush_log_at_trx_commit = 1

Join_buffer_size, sort_buffer_size, read_buffer_size ve read_rnd_buffer_size gibi tamponlar, bağlantı başına tahsis edilir. Bu nedenle, read_buffer_size = 1M ve max_connections = 150 ayarı, MySQL'i başlangıçtan itibaren bağlantı başına 1MB x 150 bağlantı tahsis edecek şekilde yapılandırır. Varsayılan read_buffer_sizere değeri 128KB'dir. Varsayılanı artırmak yalnızca sunucu belleğinin boşa harcanması anlamına gelmez, çoğu zaman performansa yardımcı olmaz. Neredeyse tüm durumlarda, bu dört tampon yapılandırma satırını kaldırarak veya yorumlayarak varsayılanları kullanmak en iyisidir. Daha kademeli bir yaklaşım için, boşa harcanan RAM'i boşaltmak için mevcut büyük değerlerinizi azaltın, zamanla bunları varsayılan değerlere düşürmeye devam edin. Bunları keyfi olarak artırmaktan kaçının!

Bir sorgu paketinin maksimum boyutunu büyütün.

max_allowed_packet = 256M

innodb_additional_mem_pool_size : Bir bellek havuzunun bayt cinsinden boyutu InnoDB, veri sözlüğü bilgilerini ve diğer dahili veri yapılarını depolamak için kullanır. Uygulamanızda ne kadar çok tablo varsa, burada o kadar fazla bellek ayırırsınız. InnoDB bu havuzda bellek kalmazsa, işletim sisteminden bellek ayırmaya başlar ve MySQL hata günlüğüne uyarı mesajları yazar. Varsayılan değer 8MB'dir.

innodb_additional_mem_pool_size= 8M

innodb_lock_wait_timeout : Bir InnoDB işleminin pes etmeden önce bir satır kilidi için beklediği saniye cinsinden süre. Varsayılan değer 50 saniyedir. Başka bir InnoDB işlemi tarafından kilitlenen bir satıra erişmeye çalışan bir işlem, aşağıdaki hatayı vermeden önce satıra yazma erişimi için en fazla bu saniye kadar bekler: ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

innodb_lock_wait_timeout = 60


Konfigürasyon:

-------------------

[mysqld]

key_buffer = 256M

max_allowed_packet = 256M

sort_buffer_size = 512K

net_buffer_length = 8K

read_buffer_size = 256K

read_rnd_buffer_size = 512K

myisam_sort_buffer_size = 8M

innodb_buffer_pool_size = 5G

#innodb_additional_mem_pool_size = 8M

innodb_log_file_size = 128M

innodb_log_buffer_size = 8M

innodb_flush_log_at_trx_commit = 1

innodb_lock_wait_timeout = 60

query_cache_type = 1

query_cache_limit = 16M

query_cache_min_res_unit = 2k

query_cache_size = 256M

[mysqldump]

max_allowed_packet = 256M

[myisamchk]

key_buffer = 256M

sort_buffer_size = 20M

read_buffer = 4M

write_buffer = 4M

-------------------------------------

MySQL'de yaşanan en büyük performans sorunlarından biride gereksiz kaynak kullanımı, açılan bağlantıların kod içinden kapatılmamasıdır. Açılan tüm bağlantıları kapatmazsanız Mysql performansı zamanla düşer. PHP'de aşağıdaki komutu kullanarak bağlantıyı kapatabilirsiniz.

<?php
$mysqli = new mysqli("localhost","my_user","my_password","my_db");

if ($mysqli -> connect_errno) {
  echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
  exit();
}

// ....some PHP code...

$mysqli -> close();
?>

Tüm değişikliklerin server üzerinde nekadar kaynak RAM tüketeceğini görmek için aşağıdaki web sayfasını kullanabilirsiniz.

https://www.mysqlcalculator.com/ 




Python ile Twitter API Nasıl Kullanılır

TwitterSearch modülünü yükleyerek Twitter üzerinde arama yapabilirsiniz. İlk olarak bir Twitter Developer hesabı almalısınız. Bunun için developer.twitter.com adresine bir göz atın. Sonrasında aşağıdaki key bilgilerini portal üzerinden alın ve aşağıdaki koda uygulayın.

Modül yüklemek için

pip install TwitterSearch

Kod:

from TwitterSearch import *

try:

    tso = TwitterSearchOrder() # create a TwitterSearchOrder object

    tso.set_keywords(['bist', 'mavi']) # let's define all words we would like to have a look for

    tso.set_language('tr') # we want to see turkey tweets only

    tso.set_include_entities(False) # and don't give us all those entity information

    # it's about time to create a TwitterSearch object with our secret tokens

    ts = TwitterSearch(

        consumer_key = 'xxxxx',

        consumer_secret = 'xxxxx',

        access_token = 'xxxxx',

        access_token_secret = 'xxxxx'

    )

    n=0

     # this is where the fun actually starts :)

    for tweet in ts.search_tweets_iterable(tso):

        n=n+1

        #print(tweet)

        print(tweet['created_at'])

        print( '@%s tweeted: %s' % ( tweet['user']['screen_name'], tweet['text'] ) )

        print(n)

except TwitterSearchException as e:

    print(e)



Python da Pyinstaller ile Windows Exe nasıl yapılır.

 Python scriptlerinizi windows exe haline çevirmek için pyinstaller kullanabilirsiniz. İlk olarak Python için bu modülü kurmanız gerekmektedir.

pip install pyinstaller

Kurulumdan sonra py script dosyanızın bulunduğu dizine windows command da girin ve aşağıdaki gibi komutunuzu çalıştırın.

pyinstaller dosya.py

Windows yazılımınızı tek dosya olarak oluşturmak isterseniz.

pyinstaller dosya.py --onefile

Bu komut tek bir exe dosyası oluşturacaktır. Yazılımınızın içinde bir windows görseli tanımladıysanız aşağıdaki komutu kullanmanız gerekir.

pyinstaller --onefile --windowed dosya.py

veya

pyinstaller --windowed dosya.py

Oluşturduğunuz dosyaya birde icon görüntüsü eklemek isterseniz

pyinstaller -c -F -i "filepath.ico" dosya.py

Oluşturduğunuz exe dosyalarına dosyanızla aynı dizinde oluşan dist klasöründen ulaşabilirsiniz. Oluşturulan exe dosyasını çalıştırdığınızda hata alıyorsanız bilgisayarınıza Visual C++ Redistributable kurulu olduğundan emin olun.

Çalıştırdığınız exe dosyası aşağıdaki gibi bir hata veriyorsa

File "site-packages\pkg_resources\__init__.py", line 86, in <module>

ModuleNotFoundError: No module named 'pkg_resources.py2_warn'

Failed to execute script pyi_rth_pkgres

Yapmanız gereken komuta bir parametre eklemek olmalı.

pyinstaller dosya.py --onefile --hidden-import=pkg_resources.py2_warn

Bu hatayı alıyorsanız Pyinstaller yazılımınızı kaldırıp yeni versiyonunu da kurabilirsiniz.

pip uninstall pyinstaller

pip install pyinstaller

Pyinstoller ve Multiprocessing

Yazdığınız kod içerisinde multiprocessing modülünü kullanıyorsanız yaptığınız exe dosyasının windows işletim sisteminde sorunsuz çalışması için fonksiyonun altında aşağıdaki kodu kullanmalısınız. Bu kodu yazmazsanız windows içinde yazılımız için sürekli yeni prosesler açılacak ve yazılım çalışmayacaktır.

if __name__ == '__main__':

    # On Windows calling this function is necessary.

    # On Linux/OSX it does nothing.

    multiprocessing.freeze_support()



XAMPP Serverda MYSQL

 XAMPP server üzerinde MySQL Passwordünü değiştirmek için.

cd \xampp\mysql\bin

mysqladmin --user=root password "your_password"

Komutu kullanılır.


PHP ile Web Server Üzerinden Ping Atma

Aşağıdaki PHP kodunu kullanarak server üzerinden istediğiniz bir web adresi veya IP adresine ping atbilirsiniz. Bu kod windows bir web server için yazılmıştır. Kod da bulunan değişkenlerin değerini değiştirerek veya başka bir yerden bu koda göndererek istediğiniz yere ping atabilirsiniz.

<?php
$host="127.0.0.1";
$count="10";
$timeout="1000";
$size="32";
$ttl="128";
$output=shell_exec('ping -i '.$ttl.' -l '.$size.' -w '.$timeout.' -n '.$count.' '.$host);

echo "<pre>$output</pre>"; 

if (strpos($output, 'out') !== false) {
    echo "Dead";
}
    elseif(strpos($output, 'expired') !== false)
{
    echo "Network Error";
}
    elseif(strpos($output, 'data') !== false)
{
    echo "Alive";
}
else
{
    echo "Unknown Error";
}
?>

IPv4 ve IPv6 ayrımı için koda ekleme yapmak gerekir, default haliyle IP versiyon 4 çalışacaktır.

Dikkat! Bu kod komutları windows command prompt üzerinde çalıştırdığından web server için güvenlik açığı oluşturabilir. Sadece kendi kullanımınız için kullanmayı tercih edebilirsiniz.

Python Çoklu Fonksiyonları Aynı Anda Çalıştırma

Fonksiyonları aynı anda çalıştırmak için pythonda iki modülden de faydalanabiliriz. Multiprocessing ve Threading birbirinden farklı iki yapı fakat ikisiyle de bu işlem yapılabilir. 

Multiprocessing : Çalıştırılan fonksiyonları CPU üzerinde farklı proseslerle çalıştırır, her fonksiyonun ram CPU kullanımı birbirinden bağımsızdır. Bu modul aynı zamanda cihaz üzerinde CPU çekirdeklerinin her birine bir işlem atamak için de kullanılır. Böylece CPU'nun tüm çekirdekleri efektif olarak kullanılır ve hızlı bir şekilde işlemler yapılabilir.

Threading : Aynı proses içinde fonksiyonları çalıştırır, burada bir sıra söz konusudur. Aynı anda CPU üzerinde sadece bir işlem yapabilir dolayısıyla işleri sıraya koyarak yapar. Kullanımı basittir, belirli peryotlarda çalıştırılacak işler için idealdir.

Daha anlaşılır şekilde şöyle anlatabiliriz; Elinizde bir takım işler var markete gideceksiniz, aracınızı yıkamalısınız, yemek yapmalısınız. Multiprocessing çalıştığında bu işlerin herbirini farklı bir kişi yapar, Threading kullanıyorsanız tüm bu işleri aynı kişi yapar.

Python'da iki fonksiyonu aynı anda eş zamanlı çalıştırmak için aşağıdaki kodu kullanabilirsiniz. Kodu kullanmadan önce "threading" modülünü yüklediğinizden emin olun.


---
from threading import Thread

def func1():
    print('Working')

def func2():
    print("Working")

if __name__ == '__main__':
    Thread(target = func1).start()
    Thread(target = func2).start()
---

Aşağıdaki kodu da kullanabilirsiniz.

---
from threading import Thread

def func1():

def func2():

t1 = Thread(target=func1)
threads = [t1]
t2 = Thread(target=func2)
threads += [t2]

t1.start()
t2.start()

for tloop in threads:
    tloop.join()

---

Bir diğer örnekte aşağıdaki gibi olabilir.

import threading

data_1=[1,2]
data_2=[2,3]
data_3=[3,4]

def fonksiyon(Data):
    print(Data)

    # Thread oluştur
    t1 = threading.Thread(target=fonksiyon, args=(data_1,))
    t2 = threading.Thread(target=fonksiyon, args=(data_2,))
    t3 = threading.Thread(target=fonksiyon, args=(data_3,))
 
    # Başlat
    t1.start()
    t2.start()
    t3.start()
 
    # Hepsi bitinceye kadar bekle.
    t1.join()
    t2.join()
    t3.join()

Aynı işlemi multiprocessing ile yaparsak aşağıdaki gibi kullanabiliriz. 
---

# importing the multiprocessing module 
import multiprocessing 
import os 
  
def worker1(): 
    # printing process id 
    print("ID of process running worker1: {}".format(os.getpid())) 
  
def worker2(): 
    # printing process id 
    print("ID of process running worker2: {}".format(os.getpid())) 
  
if __name__ == "__main__": 
    # printing main program process id 
    print("ID of main process: {}".format(os.getpid())) 
  
    # creating processes 
    p1 = multiprocessing.Process(target=worker1) 
    p2 = multiprocessing.Process(target=worker2) 
  
    # starting processes 
    p1.start() 
    p2.start() 
  
    # process IDs 
    print("ID of process p1: {}".format(p1.pid)) 
    print("ID of process p2: {}".format(p2.pid)) 
  
    # wait until processes are finished 
    p1.join() 
    p2.join() 
  
    # both processes finished 
    print("Both processes finished execution!") 
  
    # check if processes are alive 
    print("Process p1 is alive: {}".format(p1.is_alive())) 
    print("Process p2 is alive: {}".format(p2.is_alive())) 

---

Ayrıntılı bilgi

Python Modül Yükleme

Python'da yazdığınız kod için modül yüklemeye çalıştığınızda modül'ün bulunamadığı mesajı alıyorsanız modülün default'da yüklü olmadığı için yüklemeniz gerekir. Modül bilgisayarınıza yüklü ise komut satırında modülü yüklemeyi tekrar deneyin ör modülümüz dns.resolver olsun

import dns.resolver

Komut satırında aynı hatayı alıyorsanız ve modülün yüklü olduğundan eminseniz kodu kaydettiğiniz klasöre bakmanız gerekiyor. Klasör içerisinde dns.py isimli bir dosya varsa Pyhton modül kütüphanesine gitmez direk bu dosya içinde aradığınız modülü arar. Dolayısı ile bulamayacağı için hata verir. Python'da yüklediğiniz modüllerin dosya isimleri ile çakışmamasına dikkat edilmelidir.

Python import error

Dosya isismlerini kesinlikle modül isimleri ile aynı yapmayın, bu şekilde uygulandığında python dosyayı modul olarak görür ve yüklemeye çalışır, gerçek modüle ulaşamayacağı için yükleyemez.

Ör Selenium modülü için şöyle bir hata ile karşılaşabilirsiniz. Bu tüm modüller için geçerlidir.

runfile('C:/selenium.py', wdir='C:/')
Traceback (most recent call last):

  File "C:\selenium.py", line 10, in <module>
    from selenium import webdriver

ImportError: cannot import name 'webdriver' from 'selenium' (C:\selenium.py)

Firewall Üzerinden Internetten Modül Yükleme

Python Pip ile modul yüklemek için gerekli firewall erişimleri aşağıdaki gibidir. Eğer bir firewall arkasındaysanız ve çıkışınız kısıtlı ise aşağıdaki adresler için 80 ve 443 portlarını açtırmanız gerekir. 

Pip internet erişimi için firewall üzerinden yetki verilmesi gereken adresler:
pypi.python.org
pypi.org
pythonhosted.org
files.pythonhosted.org

Port TCP 80 ve 443 olmalıdır.


MySQL WorkBench Time Out

MySQL WorkBench kullanıcıları zaman zaman aşağıdaki hatayı görüyor, komutun defaultta 30 sn içinde cevap alamaması durumunda bu hata oluşmaktadır.

Error Code: 2013. Lost connection to MySQL server during query

Bu hatayı gidermek için 

 Edit → Preferences → SQL Editor → DBMS connection read time out (in seconds): 30

Değerini 180 yapabilirsiniz, bu durumda MySQL WorkBench komut çıktısını alana kadar bekleyecektir.

Raspberry PI Python 3,7 Kurulumu (Raspbian)

Raspbian üzerinde Python 2.7 ile gelmektedir. İlk olarak bu versiyonu Raspberry üzerinden kaldırmamız gerekiyor. Bunun için aşağıdaki komutu yazmamız yeterli.

sudo apt-get remove python2.7

Python 3.7'yi kurmak için aşağıdaki aşamaları izleyin.

sudo apt-get update

sudo apt-get install -y build-essential tk-dev libncurses5-dev libncursesw5-dev libreadline6-dev libdb5.3-dev libgdbm-dev libsqlite3-dev libssl-dev libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev libffi-dev

İnternetten kurulum dosyasını indirelim.

wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz

Yazılımı kuralım.

sudo tar zxf Python-3.7.0.tgz
cd Python-3.7.0
sudo ./configure
sudo make -j 4
sudo make altinstall

Kurulum sonrası versiyon kontrolü yapalım.

python3.7 -V

Şuanda python kuruldu fakat default isimle çağrılamamkta. Aşağıdaki işlemleri de yapalım

vim ~/.bashrc

Açılan dosyaya aşağıdaki satırı ekleyin.

alias python='/usr/local/bin/python3.7'

Komut satırında aşağıdaki komutu yazalım.

source ~/.bashrc

Ve kontrol edelim

python -V
Python 3.7.0

Kurulum tamamlandı. Şimdi gereksiz dosyalardan kurtulalım.

sudo rm -r Python-3.7.0
rm Python-3.7.0.tar.xz
sudo apt-get --purge remove build-essential tk-dev -y
sudo apt-get --purge remove libncurses5-dev libncursesw5-dev libreadline6-dev -y
sudo apt-get --purge remove libdb5.3-dev libgdbm-dev libsqlite3-dev libssl-dev -y
sudo apt-get --purge remove libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev libffi-dev -y
sudo apt-get autoremove -y
sudo apt-get clean




Python Django Nasıl Kullanılır.

Python'da web geliştirme uygulaması Django'yu kurmak için aşağıdaki komutlar kullanılabilir.

Python Pip ile:
pip install django

Anaconda ile:
conda install -c anaconda django 

kurlum yapıldıktan sonra ilk olarak bir proje oluşturulur.

django-admin startproject PythonWebOne

Böylece PythonWebOne isimli bir proje oluşturmuş olduk. Proje komutu çalıştırdığınız dizinde oluşur ve dizinde aşağıdaki dosyalar bulunur.

PythonWebOne
├─PythonWebOne
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

Tüm ayarlar settings.py dosyası içinden yapılır. Bu dosyada bazı ayarları değiştirelim.

LANGUAGE_CODE = 'tr-TR'

TIME_ZONE = 'Europe/Istanbul'

Django, kimlik doğrulama ve oturum yöneticisi uygulamaları gibi önceden yüklenmiş bazı varsayılan uygulamalarla birlikte gelir. Oluşturacağımız uygulamalar veya ihtiyacımız olacak üçüncü taraf uygulamaları Installed Apps bölümünde varsayılan uygulamalar yüklendikten sonra listenin altına eklenir.

# /settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

Şimdi proje için bir uygulama oluştrumaya çalışalım. Proje klasörüne girip aşağıdaki komutu çalıştırın.

python manage.py startapp OneWeb

OneWeb isimli bir klasör oluşacaktır. Dizin yapısı aşağıdaki gibi olur.

PythonWebOne
├── PythonWebOne
│        ├── __init__.py
│        ├── settings.py
│        ├── urls.py
│        └── wsgi.py
├── OneWeb
│        ├── __init__.py
│        ├── admin.py
│        ├── apps.py
│        ├── migrations
│        ├── models.py
│        ├── tests.py
│        └── views.py
└── manage.py

Django'nun yeni uygulamamızı tanımasını sağlamak için, uygulama adını dosyamızdaki Installed Apps listesine eklememiz gerekir. Bu liste settings.py dosyasının içindedir.

# /settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'OneWeb'
]

Bu yapıldıktan sonra, sunucumuzu çalıştıralım ve neyin çıktı alacağını görelim. Django'nun, geliştirme sırasında yararlı olsa da, asla servis vermek için kullanılmaması gereken yerleşik bir web sunucusu ile geldiğini belirtmeliyiz. Sunucuyu aşağıdaki gibi çalıştırın:

python manage.py runserver

Komutu yazdıktan sonra aşağıdaki gibi bir mesaj çıkacaktır.

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
January xxxxxxx
Django version 2.2.5, using settings 'PythonWebOne.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

Dikkatli bakarsanız, uygulanmadığınız taşıma işleminiz olduğuna dair bir uyarı görürsünüz. Şimdilik bunu görmezden gelin. Tarayıcınıza gidin http://127.0.0.1:8000/ adresine girin. Her şey yolunda giderse, Django karşılama sayfasını görmelisiniz.

Taşıma ile ilgili hatayı görmemek için aşağıdaki komutu kullanabiliriz.

python manage.py migrate

Aşağıdaki gibi bir çıktı görmelisiniz.

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying sessions.0001_initial... OK

Tekrar çalıştırdığınızda çıktı aşağıdaki gibi olur hata görmezsiniz

python manage.py runserver

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
January xxxx
Django version 2.2.5, using settings 'PythonWebOne.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

Sunucuyu çalıştırdığımızda, varsayılan Django sayfası gösterildi. Kendi uygulamanız için Django'ya ana sayfa şablonunu nerede arayacağını söyleyecek bir URL tanımlamamız gerekiyor. PythonWebOne klasörü içindeki urls.py isimli dosyayı açın . Böyle görünmeli.

from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
]

Haydi uygulamamız için kendi url linkimizi ekleyelim. Dosyayı bu şekilde görünecek şekilde düzenleyin.

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include('OneWeb.urls')),
]

Uygulama klasörünün içine urls.py adlı bir dosya oluşturun ve aşağıdaki kodları dosya içerisine yazın.

from django.conf.urls import url
from OneWeb import views


urlpatterns = [
    url(r'^$', views.HomePageView.as_view()),
]

Uygulama altındaki views.py dosyasına bu kodu yazın.

from django.shortcuts import render
from django.views.generic import TemplateView

# Create your views here.
class HomePageView(TemplateView):
    def get(self, request, **kwargs):
        return render(request, 'index.html', context=None)

Bir klasör oluşturarak içine index.html dosyasını koyalım. Klasör adı templates olabilir. 

















Linux'da eski dosyalar nasıl silinir.

Linux işletim sisteminde eski dosyaları bulup silmek için aşağıdaki komut kullanılabilir.

find . -type f -mtime +365 -delete

Bu komut bulunduğunuz klasör içinde eski tarihli dosyaları bulur ve siler. delete komutu yerine ls konutunu kullanırsanız bu dosyaların listesini görüntüleyebilirsiniz. 365 günü ifade eder.

Dikkat bu komutu çalıştırdığınız tüm alt klasörlerdeki eski oluşturulma tarihine sahip tüm dosyalar silinecektir. Komut sizi uyarmadan dosyaları siler, çalıştırmadan önce liste alıp kontrol etmekte fayda var.

MySQL View

MySql'de sütünları aynı olan iki view'ı birleştirerek yeni bir view oluşturabilirsiniz. Bunun için aşağıdaki sorguyu çalıştırmanız yeterlidir.

CREATE VIEW toplamview AS
SELECT * FROM view_1
UNION ALL
SELECT * FROM view_2
    

Network Notları L3

Routing protokoller dahili ve harici olarak ikiye ayrılır. Sadece BGP harici protokoldür. OSPF ve IS-IS bant genişliğine bakar, cost değerine göre tercih yapar. EIGRP defaut'da bant genişliği ve delay'e bakar. EIGRP delay i kümülatif hesaplar yoldaki minimum bant genişliğini alır. Rip ve BGP Hop count'a bakar.

Link state OSPF ve IS-IS : Link state'de tüm routerlar birbirini bilirler. Link state'de loop olmaz tüm routerlar topolojiye hakimdir. Link state'de yolu cost yani bw belirler.

Distance Vektör RIP, BGP, EIGRP, IGRP. Distance vektör komşusundan aldığı bilgiyi komşusuna verir. Distance vektörde routing loop olma olasılığı var.

IGP protokolleri anaons yapmaz. BGP anons yapar. IGP update yapar.
IGP'lerde
1- proses enable edilir.
2- interfaceler proses'e dahil edilir.

Routing protokollerden en hızlısı EIGRP en yavaşı BGP'dir.

OSPF

OSPF IP 89 portunu kullanır L4'de çalışır. Routerlar her zaman en spesifik subnet'i seçer route metric'e bakmazlar.

Huawei routerlarda IS-IS 15, OSPF 10 metric'leri static route'u (60) ezer metricleri daha düşüktür.

Routing subnet aynı, metric aynı ise router Cost değerine bakar ve paketi cost'u düşük olandan geçirir. Cost eşit ise cisco ve huawei load balance yapar, equal cost path load balance. Juniper küçük sayılı interface'i seçer.

Prefix match > Metric > Cost

OSPF sadece IP taşımak için yapılmıştır.

LSDB - Link state database

OSPF'de bir LSA flood yapılır ve tüm router DB'leri aynı olur.

224.0.0.5 - Hello paketi

OSPF'de routerlar birbirine 8 adet bilgi gönderir. Sekiz bilgi de aynı ise bunlar Adj'dir.

Neighbor Routerlar
1- Hello Time
2- Died Time
3- Area ID
4- Area Type
5- Pass Type
6- Pass Auth.
7- Subnet Mask
8- MTU

Eğer 8 bilgi aynı ise LSDB ilk paketini gönderir. Kendinde olmayan network bilgisini LSR ile ister, LSU ile alır.

LSU içinde LSA'lar vardır. LSA'leri iyi bilmek gerek. LSA'i anla OSPF'i çöz :) Her router aynı LSA database'e sahip olur. Her router kendini kök'e koyar. Günün sonunda her router'ın uniq routing table'ı olur. SPF algoritması sonucu routing tablosu oluşur.

OSPF'de herkes kendi Router ID'si ile tanınır.Router ID OSPF'de routerların kimlik numarasıdır.

Router ID 32 bit ve 4 okted'dir. Router ID IP'ye benzer fakat IP değildir. 0.0.0.3 gibi olabilir.

Genelde routerların loopback adreslerini Router ID olarak kullanırız.

Ethernet - Broadcast
PPP, HDLC - P2P
ATM/ER - NBMA
Point to Multipoint

Designated Router DR
Her router DR routerla komşuluk kurar diğer routerlar DR other olur.DR 224.0.0.6 kullanır. Multipoint networklerde DR seçilir. Network tipini P2P yaparsak DR seçimi yapılmaz.

OSPF metric

Cost = Ref Bw / Bw

Cost düşük olan seçilir.

Ref BW ve BW değişir kullanmak önerilmez.Cost manuel girmek önerilir.

Area : Aynı LSA database'e sahip routerlar birlikteliğine area denir.

Bir router iki area üyesi olabilir. Area fiziksel topolojiye göre yapılır. Aynı area'daki cihazlar aynı LSDB'ye sahiptir.En az bir ayağı başka area'da olan routerlara Area Border Router denir. Area Border Router'ın bir bacağının area 0 da olması gerekir. Area 0'da interface'i olmayan router area border router olamaz. Sadece area 1 ve area 2 ye sahip router area border router olamaz.

OSPF'e özgüdür her areanın Area 0 'a bağlantısı vardır. Area 0 yoksa area'lar birbirleri ile haberleşemez.

Area 0'a backbone area denir. Area 0 bilgi taşıyan özel bir areadır. Her bir area için sadece bir adet area border router yani area 0 linki olabilir. ABR a, b x networklerine gitmek için bana gelin der. Bunun için farklı LSA türü kullanılır. Sumarry LSA kullanılır Type 3 Summary. Burada summary edilen database'dir. Database sadeleştirilir ve summary LSA ile gönderilir.

Günümüzde CPU lar çok güçlü olduğundan tek area kullanmak mümkündür, bu durumda farklı OSPF preseslerine ayrılabilir.

LSA Type 1 ve Type 2 area içinde kullanılır. Type 2 LSA DR seçimi için oluşmuş. Network tipi Multicast ise Type 2 LSA kullanılır. P2P networklerde Type 2 LSA olmaz.

Type 3 LSA area'lar arası  import veya redistribition enjekte etmek için kullanılır. Bunu yapan router ASBR Autonom system border router olur.

Router dışardan aldığı bilgiyi OSPF'e redistribute ederse Taype 5 LSA kullanır. Type 5 tüm area'lara gider. Type 4 area Type 5 ile gider ve Type 5'in eksik bilgisini taşır. Type 4 area değiştirirken kullanılır ve redistribute edilen Type 5'in route'a giden yolunu gösterir. Type 5 tüm arealara giderken ABR'larda Type 4 yapıştırılır.

Router ID vermiyorsak mevcut loopbacklerin en büyüğü seçilir, loopback yok ise interface IP'lerinin en büyüğü seçilir. İnterface yoksa IPv4 yoktur zaten.

Tüm interfaceler IPv6 ise Router ID'yi elle vermek gerekir. Bütün routerların Router ID'leri uniq olmalıdır.

clear ospf prosses > OSPF restart olur.

DR other'lar komşuluk kurmaz. Priority'si en yüksek olan DR olur. 224.0.0.5 de DR-BDR seçimi yapılır sonra 224.0.0.6 kullanılır.

Interface'i OSPF'e dahil edecek fakat hello paketi göndermeyecek isek pasive interface yapılır.

default-information orginate > Bütün domain'e default route verir.
Virtual Link : Area 0'a ulaşmak için virtual link kullanılır. Virtual link tunel yapar.

Router LSA - Type 1
Net link LSA - Type 2
Summary LSA - Type 3

BGP

eBGP External BGP - TTL 1  -  AS'ler fasklı
iBGP Internal BGP - TTL 255  -  AS'ler aynı

BGP RIP'e benzer. BGP path vektör algoritması olarak algılanır. BGP her protokol bilgisini taşır. BGP ile mac adres tabloları taşınabilir. BGP authonom sistemler arasında prefix taşır. BGP MPLS lable taşıyabilir.

IP iana dan alınır.

BGP
1- AS arası
2- AS içerisinde
3- Kendi IP anonsu
4- MPLS müşterileri için
5- Yedeklilik
6- MPSL müşterileri için PE CE routing
7- MPLS L3 VPN ISP omurgası içinde PE-PE taşımacılığı.
8-SD-Wan

BGP'de hello paketi link ayaktamı bakar.

BGP TCP 179 adresini kullanır. 60sn de bir keep alive gönderir, 180sn sonra karşı tarafın düştüğünü öğrenir. Source IP ile peer IP aynı değilse connection kurulmaz.

BGP update yapmaz anons yapar.

ATTREBUTE | NLRI |

NLRI'ye ne koyarsan onu taşır bir konteynır gibi davranır. IPv4, IPv6, Mac vb....

AFI ve SAFI listeleri

BGP L3'deki protokolleri AFI ve SAFI ile taşır.

Attributes
ORIGIN : Prefix'in BGP'ye nasıl dahil edildiği bilgisini taşır.

Network komutu bir prefix'i anons etmek için kullanılır. Prefix routing tablosunda olması gerekir olmaz ise anons edilmez. Aggregate summary yapar. Aggregate ve Network komutları ile IP BGP'ye sokulur veya bilgi EPG'den alınır. redistribute ile de alınır.

Origin
IGP - i -network, aggregate
EGP - e
Redistribute - ?

As Path : x networkünün kendi AS'inden kaç hop uzakta olduğunu gösterir. As Path kaç AS atlamak gerektiğini söyler.

As Path her update'de vardır., geçilen AS sayısını söyler. Router gelen bilgise kendi AS numarasını görürse loop'u engellemek için bu bilgiyi almaz. BGP AS hop sayısı olarak kullanır. iBGP'de As Path attribute kullanılmaz.

iBGP'de kendini loop'a karşı korumak için komşudan alınan bilgi diğer komşuya verilmez. BGP'de direk bağlı olmak gerekmez.Routerları iBGP'de full bağlayamadığımızda  root reflektör kullanılır. RR herkesten bilgi alıp gönderebilir.RR'dan genelde trafik geçirilmez ve sadece iBGP'de kullanılır. RR bilgi için kullanılır ve data plane'de bulunmaz.

Next Hop :

External alınan bilgi internal'a aktarılırken  next hop değişmez.
Established - Tamam
Active - Hiç Erişemiyor
idle - Config hatası

Routerlar BGP tablosunu komşusuna gönderir, route tablolarını değil. BGP tablosunda olan tüm yolların en iyisi routing tablosuna tek kayıt olarak geçer. Buna best path selection denir. BGP'de peering için direk bağlanmak gerekmez.

AS numaraları 32 bittir. 4 milyon AS no olabilir.

Local-Pref : İçerdeki routerlar local pref yüksek olanı tercih eder.default'da 100'dür. İçerdeki routerları manupüle etmek için kullanılır.

MED : Karşı router'ı manupüle etmek için kullanılır. Metriği düşük olan yol kazanır.

Weight : Router'ın kendisini manupüle eder router içinde yazılan bir attribute'dür. pad weight artırılır yüksek olan kazanır.

Mad = Karşı
Local = arkadaki routerlar
Weight = Router'ın kendisi için

eBGP loop'a karşı daha korumalıdır. eBGP iBGP'den daha değerlidir.

64512-65535 Private AS Number

Genelde loopback interfaceler üzerinden komşuluk kurulur.update-source loopback BGP protokolünün source IP adresini loopback yapar. Router ID'ler aynı olmamalı büyük soruna sebep olabilir. Source IP ile peer IP aynı değilse connection kurulmaz.

Route Map
1- Route filtering during
2- Policy base routing
3- BGP

Prefix List
BGP'de prefix list kullanılır.access list subnet'e bakmaz.

IS-IS
Is-Is konteynır mantığı ile çalışır. TLV  ile taşımacılık yapar. IPv4 özel bir TLV ile taşınır.
OSPF L4 de veriyi gönderir L3'de IP'ye bağımlıdır. IS-IS L2 üzerinde çalışır ve daha stabildir tercih edilir.

IS-IS Mac adres gibi farklı bilgileri taşıyabilir.

TLV - Type Lengt Value - Konteynır

OSPF'de loop riski olduğundan herkes area 0 ile konuşur IS-IS'de bu yok.

Metric anlayışı farklıdır. 6 bit metric alanı var. toplam metric maximum 1024 olabilir. Metric toplamı 1024'ü geçemez. Metric styl whide ile 20 bit, kümülatif 32 bit'e çıkabilir. Default halde metric bırakılır ise iş hop count'a düşer.

IS-IS'de default davranışı OSPF'deki Totally NSSA gibidir.

IS-IS'de ABR'a benzeyen cihazlar Level 1 ve level2 ile konuşabilen cihazlardır. L2 tüm IS-IS domaininin tüm bilgilerinin toplandığı databasedir. L1 ise sadece içinde bulunduğu areanın bilgilerini tutan databasedir. L1 içinde bulunduğu area bilgisini içerir.

OSPF LSA ile çalışır
IsIs Level 1 ve Level 2 LSP ile çalışır. Routerlar default'da L1 L2 olarak gelir sonradan değiştirilir.

Routerlar 20byte NSAP adresi kullanır. CLNS NSAP formatı kullanılır.

CLNS- NSAP - NET

49 private adrestir. Net adresi min 8 max 20 byte olabilir.

NSAP ISIS'in L3 adresidir. İki portun ISIS konuşabilmesi için NSAP adresi gerekir. Bu adres sadece cihaza verilir interface'e verilmez.

L2 database'i tüm ISIS camiasının bilgisini taşır.

L1 ile L2 konuşamaz ve komşu olamazlar.Router Leaking ile L2'deki bilgi L1'e aktarılır.

Redistribution ile L1'deki bilgi L2'ye aktarılır.

ISIS'de link tipi broadcast veya P2P seçilebilir. Bir cihaz DIS seçilir, DIS sanaldır.


L2 tüm ISIS domain bilgisini taşır area bağımsız tüm cihazlarda aynıdır.

Tüm cihazlar IPV4 veya IPV4, IPV6 olmalıdır. ISIS her versiyon için ayrı topoloji oluşturabilir.

Multible topolojide farklı kullanımlar olabilir fakat single topolojide hepsi aynı IP versiyonunda olmalıdır.

CLNS adresinin sonu 00 olmak zorundadır. 49.0001.------------.00  1 areadır

BFD ile komşunun gittiği daha hızlı öğrenilir.

MPLS

Multible protocol lable switching. L2 ve L3 protokollerinden bağımsızdır. L3VPN MPLS ve BGP ile yapılır.

L2VPN-VPLS Mac switching e benzer.
L2VPN - VLL Mack learning yok P2P Leasline a benzer.

L2 ile L3 arasına sokulan lable'lar ile MPLS sağlanır.

LSP Lable switch path

Push - Paketi lable ile işaretlemek.
Swap - Lable'lı paketi iletmek.
Pop - Lable sökmek

Lable'lar FEC'e göre verilir.

LDP lable üretmek ve dağıtmak için kullanılır.BGP'de lable taşır ve üretir.
RSVP Lable üretebilir ve dağıtır
Statik olarak da lable üretilip taşınabilir.

Data plane'i kontrol plane belirler. Data plane ile kontrol plane yönleri terstir.

MPLS tüm interfacelerde enable olmalı ve LDP oluşmuş olmalıdır.Hat koparsa lable'lar kapanır.

MPLS'in iki formatı vardır.
Frame Format
Cell Format (kulanılmıyor)

MPLS Shim Heder
MPLS Lable 20 bittir. 1 milyon farklı lable oluşturulabilir.

MPLS Lable Nesting : MPLS lableları ard arda koymak anlamına gelir. birden fazla lable ile MPLS VPN ve MPLS TE yapılır.

Customer lable uçtan uca taşınabilir transport lable yolda eklenebilir.Customer Lable'ı BGP belirlr. Çok fazla lable eklenecek ise MTU unutulmamalıdır 9000 yapılabilir.

FEC aynı yolun yolcusu paketlerdir.

Her routera Lable kullanma range'i tanımlanabilir. Müşteri TTL'i de taşınabilir taşırken başka bir TTL kullanılır. LDP bir protokoldür.

LDP Lable/FEC mapping bilgisini dağıtır. LDP BGP'ye benzer. Cihazların direk bağlı olması gerekmez.

Routerlar LDP komşuluğu kurar. LDP'de iki şekilde komşuluk vardır, direk ve remote şeklinde.

LDP auto disvcover yapabilir.

LDP TCP 646 portunu ve UDP 646 portunu kullanır.
Hello - UDP 646
Establish - TCP 646
Remote için hello unicast remote, direcly için hello multicast kullanılır.

PHP
Sondaki routerdan bir önceki router boşa swaplamasıdır. Son router'ın işini kolaylaştırır. Boşa swap'da 3 nolu private lable kullanılır. Son router bir öncekine bana lable 3 ile gel der. bir önceki router paketi lable 3 ile boşa swaplar. QoS kullanılıyor ise lable 0 ile explicit-null kullanılır. Sıfır lable ile son router'a geldiğinde QoS taşınabilir.

MPLS trafik engineering için DB gerekir OSPF veya ISIS



Network Notları L2

Günümüzde bağlantıların gelişmesi ile LAN ve WAN tanımı değişti, Lan sahip olduğun network, WAN kiraladığın network haline geldi.

Cam Table : Switch mac adres tablosudur, Ram'de tutulur.

Flood : Switch'in mac adresini bilmediği cihazlar için paketi tüm portlardan göndermesi demektir. Switch'ler flood and learn mantığı ile çalışmaktadır.

Switch test yazılımı : HyenaeFe

Vlan No maximum 4096 olur ve 12 bit'dir.
Vlan tag toplam 4 bytedır: ilk 16 bit type adresi 0x8100 802.1q, 3 bit PCP, 1 bit CFI, 12 bit Vip.

PCP = 802.1p Cos bitleri. Cos L2'de Qos yapmak için kullanılır.

802.3 Access
802.1q Trunk

Standartta sadece Trunk portta switch'den çıkan paketler için tag eklenir. Switch kendi içinde Vlan'lar için tag kullanmaz. Trunk port üzerinden sadece bir adet port native olabilir. Native=Untaged
Default'da Vlan1 untag'dir fakat bu değiştirilebilir. İki switch arasında untag vlan farklı seçilebilir, çalışır fakat hata verir. Hata mesajı : Native Vlan Missmatch

Cisco switchlerde yeni switch portu dynamic'dir, Huawei'de hybrid'dir.

Dynamic = Trunking protocol DTP Cisco geliştirmiştir, iki switch birbirine bağlandığında otomatik çalışır.

no negotiate yapmadan DTP kapanmaz, port no negotiate yapılmalıdır. Dynamic auto veya disabre olabilir.

Yeni Cisco cihazlar ISL desteklemiyor. Ayrıca cisco dışında tüm cihazlarda  Vlan'lara erişim vermek gerekir, Cisco'da tüm vlanlar default'da geçer kısıtlama yoktur. Cisco üzerinde native Vlan'ı Trunk üzerinden geçirmemek için kullanılmayan bir vlan native yapılır.

VTP
Default'da Switchler VTP server gelir.

Router üzerinde trunk porta IP verirseniz native çalışır. Diğer vlan'lar için sanal interface oluşturulur.

L3 switchlerde router interfacelere SVI (switch virtual interface) denir.

Switchlerde loop başladıktan sonra  loop'u durdurabilecek bir protokol maalesef yok.

Broadcast storm ilk gönderilen IP arama arp paketinin bir sonucudur, Arp broadcast yaparken oluşuyor. Arp request mac öğrenmek veya DHCP'den IP almak için kullanılır. Bir bilgisayara IP girersen arp paketi gönderir ve kendi IP'si için cevap almayı bekler. Kendi IP'si için cevap alırsa IP çakışması algılar. IP çakışması Arp ile tespit edilir. Arp request L3 çalışır.(Who has 10.0.0.1?)

Local network'de ping kaybı mevcut ise loop olasılığı yüksektir.

Aynı frame switch'de farklı portlardan geliyorsa buna mac flaping denir. Switch mac adresini farklı portlardan öğrenmiş olur ve tablo sürekli değişir. Mac Flap algılamak zordur.

Lan Loop
1- Broadcast storm
2- Multible Frame Loop
3- Unstable mac address table.

Min ethernet frame size 46 bayt olmalıdır, frame size yeterli olmuyorsa pacing eklenir.

STP
STP topolojiyi tekilleştirir. Her 2sn de bir gönderilen BPDU paketleri ile bilgiyi taşır. BPDU dört bilgi taşır. 802.1d ve 802.1w BPDU formatıdır.

STP L2 çalışır.STP ethernet frame'inden sonra gelir.

BPDU 4 Önemli bilgi
1- Bridge ID
İki farklı değerin text toplamıdır.
Bridge ID = Bridge priority + Mac address

Bridge priority = 0-65536 arasındadır. 16 bit'dir. 4069'nin katı olarak değiştirilir.

Klasik switchlerde bir mac adresi olur. Bu mac adresi BPDU için kullanılır. CPU mac adresi olarak görünür. Switch portlarının normalde mac adresi olmaz fakat sanal mac adresi üretilrbilir.

Bridge ID : 32768:63:16:08:19:7c

2- Root Bridge ID
Topolojide bir switch root olur.

3- Cost
Bant genişliği ile ters orantılı bir değerdir. Standart olarak bellidir. Bakınız 802.1t

Link speed  Cost
10                  100
100                19
1Gb               4
10Gb             2

Cost root bridge'e giderken hesaplanır. Cost küçük olan yol tercih edilir.

4- Port ID
İki farklı değerin text toplamıdır
Port ID = Port priority + Port numarası
Port priority 0-255 arasında 16'nın katı bir değerdir, default olarak 128 dir. 12. portun port ID'si

128.13 olur.

STP Nasıl çalışır
1- Her network'de mutlaka bir root bridge seçilir. Bridge ID'si en düşük olan root bridge olur.

2- Her switch kendine bir adet root port seçer. Root bridge'e giden en düşük cost'a sahip port root port olarak seçilir. Root port root bridge'e giden en düşük cost'lu bağlantıdır.

Cost eşit ise sender bridge ID'ye bakılır, küçük olan switch ID seçilir. Sender switch ID eşitse sender switch port ID'leri karşılaştırılır, küçük olan tercih edilir. switch port ID'leri eşit ise local port ID'ye bakılır, küçük olan seçilir. Port priority küçükse switch o portu seçer.

3- Her segmentte mutlaka ve mutlaka bir port designate port olmalı. Küçük cost port designate port olur.

4- Tüm switchlerde ara bağlantılar için route port ve designate port olmayan portlar bloklanır, kapatılır.

Aynı switch'in portları kablo ile birleştirilirse STP buna çözüm bulamaz. Bu duruma loop protection ve loop guard ile engel olunur.

Üç tip port vardır
Root port    fw mod
Designated port     fw mod
No designated port   Block mod

Switch portun çalışır duurma gelme süreci STP

Disable > 15sn > Listening > 15sn > Learning > 20sn > Forwarding/Blocking
Portun çalışma süresi 30sn'dir.

STP'de switch hop count sınırı vardır.

STP default priority 32876

Route Guard route bridge'i koruma altına alır. Route'u koruma altına almak için kenar bacaklara yazılır.

Global config'de port fast yapılırsa tüm access portlar port fast olur. Access port'dan kullanıcı BPDU paketi gönderirse network çökebilir. Portfast portlarda BPDU bloklanmalıdır.

802.1w RSTP
Discarting > Learning > Forwarding

RSTP per vlan çalışmaz.

Alternate port root port yedeğidir, root port düşerse yerine geçer. Backup port designated port yedeğidir.

Alternate Port Bloc mode
Backup Port Block mode

Cisco STP hesaplamasını per vlan (vlan bazlı) yapar. PVST cisconun tescilli per vlan spaning tree algoritması.

802.1s MST Multible Spaning Tree
MST cisco IEEE ile aynıdır.

MST'de instance oluşturulup istediğiniz kadar vlan ekleyebilirsiniz. instance her switch'de aynı olmalıdır. Vlan'lar başka bir instance oluşturulmadı ve vlan aktarılmadıysa instance 0'da dır.

UDLD Tx ve Rx ikisininde çalışıp çalışmadığına bakar.

Edge port port fast yapılırsa mutlaka BPDU filter veya BPDU guard uygulanmalıdır.

BPDU guard BPDU paketi algılarsa portu kapatır. BPDU filter BPDU paketlerinin geçmesini engeller.

BPDU guard nedeniyle port disable olursa portta error disable mesajı görünür.

STP vpls üzerinde çalışır.

Ether Channel

Nic Teaming - Microsoft
Bount - Linux
Ether Channel - Cisco
Port Channel
Eth Trunk - Huawei
Lag - Alcatel
MLT
Bundle - Cisco

Bunların hepsi aynı şeyi ifade eder üreticiden üreticiye değişir.

Arada ISP varsa kontrol protokolü gerekir. Etherchannel'da, anahtarlayıcılar bağlantı yapılandırmalarının dinamik olarak yapılmasını sağlayabilir. Bunun için iki protokol kullanılır: PAgP (Port Aggregation Protocol-Port Birleştirici Protokol) ve LACP (Link Aggregation Control Protocol-Hat Birleştirme Kontrol Protokolü). PagP Cisco cihazlara özgü bir protokol iken LACP cihazdan bağımsız standart bir protokoldür.

Kontrol protokolü ile portlara priority konulabilir.
Default'da 8 port bundle yapılabilir, diğerleri yedekte bekler.

Max bundel links
Priority'si düşük olan tercih edilir diğer bağlantılar yedekte bekler.

Stack
Stack 8 switch'e kadar bağlanabilir, ciscoda 9 switch bağlamak mümkündür.

Stack STP'den kurtulmak için kullanılıyor.
MC-LAG
M-LAG
VPC
SMLT
Bunların hepsi aynı anlama gelir.

Vendorless cözüm maalesef yoktur her vendor'un bir çözümü var.

SDN
Software definid network. SDN'de STP kullanılmıyor.
TRILL
Fabric path - Cisco
QFabric - Juniper
802.1aq - IEEE
Cisco ACI - Cisco

Farklı vendor'ların SDN çözümleri

BGP + EVPN ve Vx Lan ile SDN yapılabilir.

HSRP -VRRP
Routerlarda HSRP yapılırken grup numarası veriliyor, sanal IP adresinin sanal MAC adresi oluşuyor.Mac adresinin son 8 bit değerine göre grup ID değiştirir.

prempt = master olan gittikten sonra tekrar geri gelirse tekrar master olmasını sağlar. VRRP'de prempt default'dur. prempt'e delay koymak faydalı olabilir.

HSRP 224.0.0.2 224.0.0.102
VRRP 224.0.0.18

HSRP'de üç IP kullanılır. VRRP'de iki IP ile yapılabilir.

Birde GLBP (gateway load balance protocol) var. yedeklilik için kullanılır. Cisco'da var.

HSRP Default priority 100 yüksek olan master olur. Priority'ler eşitse ilk kim ayağa kalkarsa o master olur.

HSRP - VPC Active Active
HSRP - SLA ile kullanılabilir. dış interface'e bir SLA yazılarak priority değiştirilebilir.

Multible HSRP- İki tane grup yapılır, farklı Vlan'lar için farklı routerlar master olabilir.

Priority - 0-255 Priority yüksek olan master olur.


Python ile HTML Formatında Mail Gönderme

Aşağıdaki kodu kullanarak HTML bir sayfayı SMTP üzerinden mail atabilirsiniz. Mail içeriği html formatında gidecektir. Çok faydalı bir code mutlaka kütüphanenizde bulunsun.


----------------------------------------------------------
# Import smtplib for the actual sending function
import smtplib

# Import the email modules we'll need
from email.message import EmailMessage

# Open the plain text file whose name is in textfile for reading.
with open("Message.html") as fp:
    # Create a text/plain message
    msg = EmailMessage()
    msg.set_content(fp.read())
 
# me == the sender's email address
# you == the recipient's email address
msg['Subject'] = 'Konu bölümü'
msg['From'] = "Gönderici <Gönderici Mail@adresi>"
msg['To'] = "gönderilecek@kişi"
msg.set_type('text/html')

# Send the message via our own SMTP server.
s = smtplib.SMTP('SMTP IP adresi')
s.send_message(msg)
s.quit()
----------------------------------------------------------

Cisco Cihazı Belli Bir Süre Sonra Yeniden Başlatma


Cisco bir switch veya routerı belirli bir saate reboot etmek için:

Ciscoe#reload at 03:00 30 apr
Reload scheduled for 03:00:00 UTC Sat Apr 30 2011 (in 42 hours and 10 minutes) by console
Reload reason: Reload Command
Proceed with reload? [confirm]

Cisco bir switch veya routerı belirli bir süre sonra reboot etmek için:

Cisco#reload in 1:30
Reload scheduled for 10:20:49 UTC Thu Apr 28 2011 (in 1 hour and 30 minutes) by console
Reload reason: Reload Command
Proceed with reload? [confirm]

Cisco bir switch veya routerın ne zaman reboot olacağını görmek için:

Cisco#show reload
Reload scheduled for 10:20:49 UTC Thu Apr 28 2011 (in 1 hour and 29 minutes) by console
Reload reason: Reload Command

Reload komutunu iptal etmek için:

Cisco#reload cancel
Cisco#

***
*** --- SHUTDOWN ABORTED ---
***

Komutları kullanılır.
    

Python 3

Python indirmek için

www.python.org/downloads

Programı kurduktan sonra çalışıp çalışmadığını test etmek için aşağıdaki komut kullanılabilir

Command promp'da

python --version

Komut çıktısında hangi versiyonun çalıştığı görüntülenir.

python komutu ile yazılım çalıştırılabilir veya windows arama bölümünden IDLE yazarak ekrana çıkan yazılım çalıştırılır.

İlk kodu yazmak isterseniz

print("Hello Wolrd")

Çıktısı
Hello World

Şeklinde görüntülenir.

Python kullanırken bir editör ihtiyacı varsa Jupyter kullanılabilir. Jupyter kurulumu için

pip jupyter install

Komutu kullanılabilir. yazılımı çalıştırmak için

jupyter notebook

komutu yazılarak editor açılabilir. Bu editör genelde eğitim amaçlı kullanılır, bunun yerine notepad++ kullanabilirsiniz. Bu editorün avantajı yazdığınız kodu direk run butonuna basarak çalıştırabilmektir.

Python da data tipleri aşağıdaki gibidir.

•Numbers
•String
•List
•Tuple
•Dictionary
•Set

Numbers

Değişkenlere atanan veya işlemlerde kullanılan sayıları ifade eder, aşağıdaki gibi atama yapılabilir.

a=3
b, c = 4, 7

print (a)
print (b)
print (c)

3
4
7

a 3 değerini b 4 ve c 7 değerini almış olur.

String

Tüm karekterler string olarak tanımlanabilir.

a="istanbul"
print (a)

istanbul

Tanımlama yapılırken çift tırnak kullanılmalıdır. String tanımlanırken " veya ' işaretleri arasında tanımlanır. String içinde ' işareti var ise python bu işareti string sonu kabul eder.

a='İstanbul'un bir bölümü'

görüldüğü gibi bu cümlede string içinde bir 2 işareti kullanılmış. Bu işareti string olarak yazması için ' işaretinden önce \ karekteri kullanılır.

a='İstanbul\'un bir bölümü'

Benzer şekilde \n python'da enter anlamına gelir. String içerisinde yazılması gerekiyorsa string başına r karekteri eklenmelidir.

b=r"Enter \n şeklinde ifade edilir."

Stringler indexlenebilirler, ilk karekter 0. karekterdir.

a='istanbul' için index
0=i
1=s
2=t
3=a
....

şeklindedir.

String içinden bir karekteri yazdırmak için a[2] şeklinde kullanmak gerekir ve değeri t dir.

a[3] - indexde işaret edilen karekteri gösterir.
a[3:] - 3. karekter ve sonrasını alır.
a[3:5] -3. karekterden 5. karektere kadar olan bölümü alır, 5. karekter dahil değildir.
a[:5] - 5. karekterden öncesini alır.
a[-1] - Son karekteri gösterir.


List

Python'da numara veya stringleri bir liste yardımıyla tutabilirsiniz. Listeler köşeli parantezlerle oluşturulur ve her bir liste parçası virgüllerle ayrılır. Aynı liste içinde sayı veya string yer alabilir. Listeler stringler gibi index'e sahiptir ve index 0 dan başlar.

list=["istanbul", "ankara", 123, 999]

bir listeyi silmek için del komutu kullanılır

del list

bir listenin içindeki herhangi bir bölümü silmek için index numarası kullanılır.

del list[2]

Listeden çıkartılacak içerik belli ise remove komutu ile listeden silinebilir.

list.remove("istanbul")

Listeler stringler gibi davranış serviler, bir liste diğeri ile + işareti ile birleştirilebilir. indexleme aynıdır.




Tuple
Dictionary
Set










Break komutu

While veya for döngülerini durdurmak için kullanılır. break komutu işlendiği anda döngüden çıkılır. Döngüler içinde herhangi bir yerde kullanılabilir.


    

Windows Bilgisayara Loopback Interface Nasıl Eklenir.

Windows işletim sistemine sahip bir bilgisayarınız var ve bu bilgisayar veya server'a sanal loopback interface eklemek istiyorsanız aşağıdaki adımları izleyebilirmisiniz.

  1. Start menü ye tıklayın
  2. “cmd" yazın ve aratın.
  3. “cmd” icon'una sağ klik yaparak “Run as Administrator” seçeneğini seçin.
  4. Command'da “hdwwiz.exe” yazın ve enter'a basın

Donanım ekleme sihirbazı açılacaktır.

  1. "Welcome to the Add Hardware Wizard" ekranında Next butonuna tıklayın.
  2. "Install the hardware that I manually select from a list (Advanced)" seçeneğini seçin ve Next butonuna tıklayın.
  3. Bir sonraki ekranda "Network adapters"  seçeneğini seçin ve Next butonuna tıklayın.
  4. Bir sonraki ekranda soldan "Microsoft"  sağ listeden "Microsoft Loopback Adapter" seçin ve Next butonuna tıklayarak bitirin.

Bilgisayarınızın ethernet interfaceleri alanında yeni bir interface oluşacaktır. Her zaman up olacak bu interfacei kullanabilirsiniz.

Linux Ubuntu Komutları



Şeklindedir.

Linux Ubuntu'da içinde bulunduğunuz zamanın tarihini bir değişkene atamak için;

now=$(date +"%Y_%m_%d")

formatı kullanılır. Görmek için

echo $now



Linux'da Expect ile SCP Dosya Transferi

Linux'da expect kullanarak SSH bağlantı üzerinden scp ile dosya transferini aşağıdaki bash script ile yapabilirsiniz

#!/bin/bash

PASSWORD="şifre"

FOLDER="/Dosyaların_bulunduğu_klasör"

for HOST in IP_ADRESİ1 IP_ADRESİ2;
do
    expect -c "
    spawn /usr/bin/scp $FOLDER/File1 $FOLDER/File2 user@$HOST:/Directory
    expect {
    "*password:*" { send $PASSWORD\r;interact }
    }
    exit
    "
done

Script'de bulunan kırmızı alanları değiştirebilirsiniz. Birden fazla server'a dosya transferi yapabilirsiniz. Sadece bir server'a dosya transferi yapacaksanız kodu buna göre değiştirebilirsiniz.



Google