Python IP Doğrulama (IPv4 IPv6 Public Private)

 Python içinde hazır gelen Ipaddress modülü bir IP adresini doğrulamak ve tanımlamak için bize yardımcı olacaktır. IP adresi IPv4, IPv6, Public veya private olabilir. Bu ayrımı küçük bir fonksiyon ile anlayabiliriz.

def validate_ip_address(ip_string):
    try:
        ip_object = ipaddress.ip_address(ip_string)
        if ipaddress.ip_address(ip_string).is_private == False:
            if ip_object.version == 4:
                print("IPv4")
                return "IPv4"
            else:
                print("IPv6")
                return "IPv6"
        else:
            print("The IP address is private")
            return "private"
    except ValueError:
        print("The IP address is not valid")
    return "NotValid"

validate_ip_address(192.168.0.1)

Bir IP adresinin Network IP'sini bulmak istiyorsak aşağıdaki kod bize yardımcı olacaktır.

ip_address=192.168.1.55/24
net_ip=ipaddress.ip_network(ip_address, strict=False)
print(net_ip)

Ayrıntılı bilgi için aşağıdaki adrese göz atabilirsiniz.

ipaddress — IPv4/IPv6 manipulation library

https://docs.python.org/3/library/ipaddress.html

Kaynak kod: https://github.com/python/cpython/blob/3.10/Lib/ipaddress.py

IP versiyon 4 - IP versiyon 6 - Public IP - Private IP 

IP Versiyon kontrolü.

IP bilgileri nasıl listelenir:

-------------------------------------------------
import ipaddress
 
# Initializing an IPv4 Network.
network = ipaddress.IPv4Network("192.168.1.0/24")

print(network)
 
# Network address of the network: 192.168.1.0
print("Network address of the network:", network.network_address)
 
# Broadcast address: 192.168.1.255
print("Broadcast address:", network.broadcast_address)
 
# Network mask: 255.255.255.0
print("Network mask:", network.netmask)
 
# with netmask: 192.168.1.0/255.255.255.0
print("with netmask:", network.with_netmask)
 
# with_hostmask: 192.168.1.0/0.0.0.255
print("with_hostmask:", network.with_hostmask)
 
# Length of network prefix in bits: 24
print("Length of network prefix in bits:", network.prefixlen)
 
# Total number of hosts under the network: 256
print("Total number of hosts under the network:", network.num_addresses)
 
# Overlaps 192.168.0.0/16: True
print("Overlaps 192.168.0.0/16:", network.overlaps(ipaddress.IPv4Network("192.168.0.0/16")))
 
# Supernet: 192.168.0.0/23
print("Supernet:", network.supernet(prefixlen_diff=1))
 
# The network is subnet of 192.168.0.0/16: True
print("The network is subnet of 192.168.0.0/16:",
      network.subnet_of(ipaddress.IPv4Network("192.168.0.0/16")))
 
# The network is supernet of 192.168.0.0/16: False
print("The network is supernet of 192.168.0.0/16:",
      network.supernet_of(ipaddress.IPv4Network("192.168.0.0/16")))
 
# Compare the network with 192.168.0.0/16: 1
print("Compare the network with 192.168.0.0/16:",
      network.compare_networks(ipaddress.IPv4Network("192.168.0.0/16")))


Python

Python Belli Bir Zaman Aralığında Çalıştırma

Python yazılımını belli saatler aralığında çalıştırmanız gerekirse aşağıdaki kodu bu amaçla kullanabilirsiniz. Kod aynı zamanda bir animasyon da içermektedir. Bist açılış kapanış saatleri arasında bir kod çalıştıracağınızı düşünelim. Kod işlem başladığında mevcut zaman aralık dışında ise ekrana animasyon çıktısı verir. Mevcut zaman aralık içerisinde ise yazılım bir sonraki adıma devam eder.

import time
import datetime
def time_in_range(start, end):
    current = datetime.datetime.now().time()
    return start <= current <= end

def typewriter(text, delay=0.1):
  for letter in text:
    print(letter, end='', flush=True)
    time.sleep(delay)
  print()

def starttime():
    start = datetime.time(9, 35, 0)
    end = datetime.time(18, 15, 0)

    result=time_in_range(start, end)
    while result==False:
        typewriter("#########################", 0.05)
        typewriter("########-BIST-########", 0.05)
        typewriter("####-"+str(datetime.datetime.now().time())+"-####", 0.05)
        result=time_in_range(start, end)
    
starttime()





Python Pandas Kullanımı

 Pandas en çok kullanılan modül olarak karşımıza çıkıyor. Bu bölümde Pandas'ın bazı önemli özelliklerinden bahsedeceğiz, pandas komutları ve kullanımını inceleyeceğiz. Pandas en kullanışlı data frame yöntemlerinden birisidir. Python code içerisinde bir database oluşturmak için kullanılır ve ram'de saklanır. Bir database'e veri yazıp sonra okumaktansa ram üzerinden bir dataframe oluşturup işlemleri bu df ile yapmak işleri çok hızlandıracaktır. Peki pandas nasıl kullanılır bakalım. İlk olarak pandas yükleyip import etmemiz gerekir. Yüklemek için;

# conda
conda install pandas
pip install pandas
# pip

Python kodumuza import etmek için;

import pandas as pd

kodu kullanılmalıdır. import komutu sonundaki as pd yeniden isimlendirmek için kullanılmaktadır ve pandas python içinde genelde pd kısaltmasıyla kullanılır, dataframe kısaltması da df şeklinde kullanılmaktadır. Basit boş bir dataframe oluşturmak için;

Data frame:

df=pd.DataFrame()

kodunu kullanabiliriz. Kodu oluşturmadan önce kolon isimlerini ve kaç adet kolon kullanacağımızı biliyorsak bu bilgilerle boş frameimizi oluşturabiliriz.

df=pd.DataFrame(columns =['kolon1','kolon2'])

Pandar df'ye genelde dictionary ile oluşturulur. Df'ye elimizdeki bir data ile oluşturmak için;

data={'kolon1': [21, 23, 24, 21], 'kolon2': [1,2,3,4]}

df = pd.DataFrame(data)

veya

data = []
data.append([21, 1, 'India'])
data.append([23, 2, 'India'])
data.append([24, 3, 'India'])
data.append([24, 4, 'India'])
df = pd.DataFrame(data, columns=['kolon1', 'kolon2', 'kolon3'])

Bir dataframe'e sabit değerli bir kolon eklemek için aşağıdaki komutu kullanabilirsiniz. Bu komut frame sonuna bir kolon ekler ve kolondaki tüm değerleri 10 yapar.

df["Percentage"] = 10

Ekleyeceğimiz kolonu sona değilde en başa veya belirli bir yere eklemek için aşağıdaki komutu kullanabilirsiniz. En başa eklemek için 0, sonraki kolon sıraları için bir artırarak kolonun yerini belirtebilirsiniz. Biz 2. sıraya (Yani 1. sıraya) bir kolon ekleyelim.

df.insert(1, 'Percentage', '10')

Data frame'i bir data ile oluşturduk buna data içeren bir kolon daha eklemek istersek;

kolon3 = ['Delhi', 'Bangalore', 'Chennai', 'Patna']

df['kolon3'] = kolon3

veya

df2 = df.assign(kolon3=['Delhi', 'Bangalore', 'Chennai', 'Patna'])

veya

Eklenecek olan kolon 2. sıraya yerleştirilecek ise;

df.insert(1, "kolon3", ['Delhi', 'Bangalore', 'Chennai', 'Patna'], True)

şeklinde kolonlar arasına yeni bir kolon yerleştirilebilir.

Pandas Frame'e Veri Ekleme:

df + 1 veya df.add(1) dataframe içindeki tüm numeric değerleri bir artırır.

df.div(10) tüm değerleri 10'a böler.

df - [1, 2] veya df.sub([1, 2], axis='columns') 1. kolondan 1, 2. kolonda 2 değerini çıkarır.

Bir pandas frame ile dictionary dataframe'i birleştirmek için append kullanılır.

df2 = {'kolon1': '15', 'kolon2': '23', 'kolon3': 'India'}

df = df.append(df2, ignore_index = True)

Bir Pandas frame ile başka bir pandas frame'i birleştirmek için concat kullanabilirsiniz.

df2 = pd.DataFrame({'kolon1': [11], 'kolon2' : [23],  'kolon3' : ['India']})

df = pd.concat([df, df2], ignore_index = True, axis = 0)

Pandas Veri Görüntüleme:

Pandas'da büyük tabloları ekranda görüntülemeye çalıştığınızda pandas size özet bir ekran çıkarır, tüm satır ve sütünları görmek istiyorsanız bazı ekler kullanmalısınız.

Tüm satırları görmek isterseniz;

pd.set_option('display.max_rows', None)
df = pd.read_csv("data.csv")
print(df)

kodunu kullanmalısınız. None yazan yere görmek istediğiniz satır sayısını yazabilirsiniz. Tüm sütünları görmek isterseniz;

pd.set_option('display.max_columns', None)
df = pd.read_csv("data.csv")
print(df)

None yazan yere görmek istediğiniz sütün sayısını yazabilirsiniz. 

Dataframe hakkında genel bilgi

df.info()

Sütünların bilgileri

df.describe()

İlk 5 satırı görmek için

df.head()

Son 7 satırı göster

df.tail(7)

Datafame içinde belirli bir satır ve sütünu görmek için;

df.loc[row, column]

index

Pandas listelerinizin yanında bir index gösterir, dosyaya yazarken bu indexin görünmesini istemiyorsanız;

    data = pd.read_sql(query, con=connection)
    data.to_csv('data.csv', index=False)

Bu şekilde index'i kapatabilirsiniz.

Pandas Framelerini Birleştirme:

Elimizde üç ader dataframe olduğunu düşünelim. Bu dataframelerin kolonları aynı ise bunları tek bir dataframe'de birleştirmek için:

frames = [df1, df2, df3]

result = pd.concat(frames)

Elimizde olan bir data frame'e bir başka dataframe'den ekleme yapacak isek append komutunu kullanabiliriz.

DataFrame.append(dataframe, ignore_index=False, verify_integrity=False, sort=None) 
ör;
result=pd.DataFrame()
result=result.append(df, ignore_index=True, verify_integrity=False, sort=None)

Duplicate verileri silme
    Single_List=Single_IP_List.drop_duplicates()
Bu komutta index'i de yeniden oluşturmak için parantez içine ignore_index=True yazılabilir veya aşağıdaki işlem yapılır.
    Single_List = Single_IP_List.reset_index(drop=True) #Duplicate veriler silindiği için index yeniden oluşturulur.
    print(Single_List)

Python Pandas kullanımı ve pandas komutları.

Diğer Konular;

Pandas DataFrame

Pandas tutorial

Pandas read_csv

Pandas groupby

Pandas merge

Pandas documentation

Pandas functions

Pandas plot

Pandas data manipulation

Pandas data analysis

PHP ile Özel Karekter Filtreleme

PHP kullanılırken form üzerinden özel karekterlerin sunucuya gönderilmesi bazı zafiyetlere neden olabilir. Zafiyetlerin ve güvenlik açıklarının engellenmesi için kullanıcılardan gelen tüm özel karekterler filtrelenmelidir. Özel karekterleri filtrelemediğiniz durumda verilerinizi koruyamayabilirsiniz. Form veya kullanıcıdan sunucuya gelen tüm veriler için mutlakan özel karekterlerin filtrelenmesi önerilir. Aşağıdaki kod özel bazı karekterlerin filtrelenmesini sağlar. Burada POST ile alınan bir veride arama yapılmaktadır, aynı işlem GET ile alınan veriye de uygulanabilir.

İlk olarak whide list uygulamak güvenlik açısından daha öenmlidir. Aşağıda gelen değerin içinde özel karekterleri filtreleyen ve IP adresini doğrulayan bir fonksiyon görüyorsunuz.

$raw_input = $_GET['IPV4'];

$IPv4 = htmlspecialchars($raw_input, ENT_QUOTES, 'UTF-8');

if  (filter_var($IPv4, FILTER_VALIDATE_IP))
{ }

Kullanıcı girdilerini doğru bir şekilde filtreleyin: Verileri htmlspecialchars() veya filter_input() gibi fonksiyonlarla filtreleyerek HTML özel karakterlerini ve diğer potansiyel zararlı karakterleri temizleyin.

$name = filter_input(INPUT_POST, $_POST["veri"], FILTER_SANITIZE_SPECIAL_CHARS);

veya

htmlspecialchars($_POST["veri"], ENT_QUOTES, 'UTF-8')

veya

if (preg_match('/[\'^£$%&*()}{@#~?><>,|=+¬-]/', $_POST["veri"]))
{
  $_POST["veri"] = ''"; //Değeri sıfırla
}
else
{
  // Herhangi bir değişiklik yapma.
}

Aşağıda bir başka fonksiyon örneği bulunmaktadır.

function RemoveSpecialChar($str) {
      // Using str_replace() function 
      // to replace the word 
      $res = str_replace( array( '\'', '"',
      ',' , ';', '<', '>', '?', '-', '='), ' ', $str);
      // Returning the result 
      return $res;
      }
$_POST["veri"] = RemoveSpecialChar($_POST["veri"]);


Aşağıda da GET ile yazılan başka bir fonksiyon bulunmaktadır.

if  (preg_match('/[\'^£$";%&*()}{@#~?><>,|=+¬-]/', $_GET["veri"]))
{
$_GET["veri"]="";
}
else
{
}


Array içinde bir karekter filtreleme yapılması gerekiyorsa aşağıdaki kod örneği kullanılabilir.

<?php
function filtre(&$value) {
 $value = htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
    while($row = oci_fetch_assoc($parse)){

        array_walk_recursive($row, "filtre");

        $data[]=$row;
?>


Unutmayın güvenlik her şeyden önce gelir.



Python Konsol Animasyonları

 Python yazılımını konsol ekranında çalıştırıyorsanız açılışta veya bir çıktı beklerken kullanıcıya bir animasyon izletebilirsiniz. Bu bölümde birkaç animasyon paylaşıyorum.

Loading animasyonu

#!/usr/bin/env python
from time import sleep
def progress(percent=0, width=30):
    hashes = width * percent // 100
    blanks = width - hashes
    print('\r[', hashes*'#', blanks*' ', ']', f' {percent:.0f}%', sep='',
        end='', flush=True)
print('Yükleniyor...')
for i in range(101):
    progress(i)
    sleep(0.1)
print()

Dikey Sinüs

import os 
import sys
def console_frame(output):
os.system('clear' if os.name == 'posix' else 'CLS')
sys.stdout.write(output + "\n")
sys.stdout.flush()
import time
import math
for t in range(100):
console_frame("\n".join(["*" * (30 + int(30 * math.sin(.1 * x + .1 * t))) for x in range(30)])) # time-varying sine wave
time.sleep(.04)

Loading Çizgi Animasyon

import itertools
import threading
import time
import sys
done = False
#here is the animation
def animate():
    for c in itertools.cycle(['|', '/', '-', '\\']):
        if done:
            break
        sys.stdout.write('\rloading ' + c)
        sys.stdout.flush()
        time.sleep(0.1)
    sys.stdout.write('\rDone!')
t = threading.Thread(target=animate)
t.start()
#long process here
time.sleep(10)
done = True

Kalın çizgi

import time
def typewriter(text, delay=0.1):
  for letter in text:
    print(letter, end='', flush=True)
    time.sleep(delay)
  print()
typewriter("############")
typewriter("############", 0.05)



XAMPP Sunucu Konfigürasyonu (MySql+Apache+Php)

XAMPP sunucusu konfigürasyonunu kontrol panelden yaparken ini dosyasına yazma yetki sorunu ile karşılaşabilirsiniz.

XAMPP server error xampp-control.ini Access is denied

Bu hatayı açmak için kurduğunuz xampp klasörü içinde xampp-control.exe üzerine sağ klik yapıp Properties alanına girin, burada Compatibility sekmesine tıklayın. En altta Run this program as an administrator seçeneğini seçin ve Apply butonuna tıklayın. Windows artık konfigürasyon kaydederken, servis oluştururken veya startup'da servisleri başlatmak için yapılan konfigürasyonları sorunsuz yazacaktır ve bu özellikler kullanılabilir olur. 

Aşağıdaki videoda Windows 10 Xampp kurulumu ve ayarların nasıl  yapılacağı anlatılmaktadır.




Python Windows Mesaj Kutusu

Python kodu içerinsinde windows için bir hata mesajı oluşturmak istiyorsanız çok küçük bir kod ile bunu yapmanız mümkün. Yazılım çalışırken istediğiniz alana geldiğinde aşağıdaki kalın harflerle gösterilen kodları mesajın verileceği yere yerleştirmeniz yeterli olacaktır. İlk iki satırı kodun en başına koyabilirsiniz. Bu kod büyük kütüphane bağımlılığı olmadan windows mesajı göstermenizi sağlar.

import ctypes
MessageBox = ctypes.windll.user32.MessageBoxW
MessageBox(None, 'Dikkat!!! Mesaj 1...', 'Mesaj Başlığı 2', 0)
MessageBox(None, 'Dikkat!!! Mesaj 2...', 'Mesaj Başlığı 2', 0)

Bu kod Python versiyon 3.x. içindir Python versiyon 2.x, için MessageBoxW yerine MessageBoxA kullanmalısınız.

Daha gelişmiş mesaj ekranları kullanmak istiyorsanız Tkinter kütüphanesi sizin için çok kullanışlı olabilir. 

from tkinter import * 
from tkinter import messagebox
root = Tk()
root.geometry("300x200")
w = Label(root, text ='Mesaj Alanı', font = "50") 
w.pack()
messagebox.showinfo("showinfo", "Information")
messagebox.showwarning("showwarning", "Warning")
messagebox.showerror("showerror", "Error")
messagebox.askquestion("askquestion", "Are you sure?")
messagebox.askokcancel("askokcancel", "Want to continue?")
messagebox.askyesno("askyesno", "Find the value?")
messagebox.askretrycancel("askretrycancel", "Try again?")  
root.mainloop() 

Python Windows Mesage Box (popup)

Python List Comprehension

Python List Comprehension liste içinde yapılacak basit işlemlerin tek satırda yapılmasını sağlayan bir yöntemdir. Örneğin sayılar içinden pozitif sayıları bulan ve bir fazlasını yazan kodu klasik ve List Comprehension yöntemleri ile yapalım.

ör:

Klasik Yöntem:

sayilar=[1,2,3,4,5,0,-1,-2,-3,-4,-5]

pozitif=[]

for sayi in sayilar:

    if sayi >=0:

        pozitif.append(sayi+1)

pozitif

List Comprehension:

pozitif=[x +1 for x in sayilar if x >=0]

pozitif

Python String Buffer Tanımlama ve Flush

Python yazılımı içinde string buffer tanımlama ihtiyacı olursa bu parametreyi tanımlarken bazı durumlara dikkat etmek gerekir. String Buffer özelliği Buffer’da değiştirilebilir bir karekter dizisi oluşturur. Oluşturulan dizi String gibidir fakat ondan farkı değişebilir olmasıdır. Hafızada her seferinde yeni bir alan açılmadan var olan alan üzerinde değişiklik yapılabilir. StringBuffer dizisine (array) bileşen ekleyen, bileşen silen, uzunluğu değiştiren ve başka işleri yapan çok sayıda metot vardır. StringBuffer thread-safe yani synchronized ‘tır. Bu durum da StringBuffer’ı thread’li işlemlerde kullanılmasını güvenli yapar. String buffer şu şekilde tanımlanır.

from ctypes import create_string_buffer
item = create_string_buffer(buffer size)

Ör: item = create_string_buffer(128)

Bu şekilde tanımladığınızda bazı sorunlar ile karşılaşabilirsiniz. Aşağıdaki gibi tanımlamanız daha sorunsuz bir sonuç ortaya çıkaracaktır.

item = create_string_buffer('\000' * 128)

Bu tanım string buffer için yeterlidir fakat gönderdiğiniz değişken tipi tutarlı olmazsa Type Error hatası alabilirsiniz. Bunu da düzeltmek için aşağıdaki halini kullanabilirsiniz. 

create_string_buffer(('\000' * bufferSize).encode())

ör:

item = create_string_buffer(('\000' * 128).encode())

Python orjinal buffer size'a bakmak için aşağıdaki komut kullanılabilir.

import io
print('Original buffer size:', io.DEFAULT_BUFFER_SIZE)

Çıktısı:

Original buffer size: 8192

Buffer'daki bilgileri silmek için

import sys
sys.stdout.flush()

Kodu kullanılabilir. Bu kod buffer'da bulunan verinin silinmesini sağlar, tabiki çıkış yönündeki veriyi silecektir. Bir print işlemi yapıyorsanız bufferda kalan veri böylece silinmiş olur. Bir print çıktısı sonrası buffer silinmek isteniyorsa

print(veri, end =' ', flush = True)

Şeklinde de yazdırma sonrası buffer silinebilir.

DBeaver için Driver Nasıl Yüklenir

 DBeaver SQL yazılımı neredeyse tüm databaselere bağlanabilmektedir. Bağlantı yapabilmek için yazılım tanımlanan database'e ilk kez bağlanılıyorsa internetten driver indirilmesi gerekir. Java tabanlı jdbc driverı internet mevcutsa yazılım kendisi indirir. İnternet bağlantısı olmayan yerlerde bu driver'ı sizin bulup indirmeniz ve tanımlamanız gereklidir. Driver download etmek için aşağıdaki adreslerden faydalanabilirsiniz.

Driver Kaynak URL:

https://mvnrepository.com/ 

https://repo1.maven.org/

JDBC driverı *.jar uzantılı bir dosyadır. 

Ör: 

MySQL JDBC driverı = https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.30/mysql-connector-java-8.0.30.jar

Postgre SQL JDBC Driverı: https://repo1.maven.org/maven2/postgresql/postgresql/9.1-901.jdbc4/postgresql-9.1-901.jdbc4.jar

Oracle SQL JDBC Driverı : https://www.oracle.com/tr/database/technologies/appdev/jdbc-downloads.html

Bu dosyayı bilgisayarınıza indirdikten sonra DBeaver SQL yazılımını açın. Database > Driver Manager ekranına girin. İlgili database'i seçin ve Copy butonuna basın. Yeni bir isim verin ör:Mysql2 Libraries tabına girin ve ekli olan satırı kaldırın. Add File seçeneğinden indirdiğiniz driverı bulun ve seçin. Ok butonuna tıklayarak ekranı kapatın. Artık yeni driver'lı bağlantınız hazır. 

Database oluşturma ekranında yeni oluşturduğunuz database ismini seçerek bağlantıyı oluşturun. Database driver'ını kendiniz indirdiğiniz için internet bağlantısına ihtiyaç olmadan database bağlantısını sağlayabilirsiniz. İnternete bağlı olmayan sunucularda bu şekilde yazılımı kullanabilirsiniz. 

      

Google