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. 

      

Spyder ve PyCharm için Python Versiyon Değişikliği

Kullandığınız Spyder veya PyCharm editörleri bilgisayarınızda buldukları default Python versiyonu ile çalışırlar. Bilgisayarınıza farklı bir Python versiyonu kurduğunuzda bu editörlerin bu versiyonla çalışması için bir değişiklik gerekiyor. Bir projeyi veya editörün default ayarlarını değiştirerek tüm projeleri farklı Python versiyonları ile yazabilirsiniz. Bir sonraki versiyon bir önceki versiyon özelliklerini desteklediğinden en son versiyonu yükledikten sonra editör defaultta bu versiyonda çalışmıyorsa aşağıdaki ayarlamayı yapmalısınız.

PyCharm Yazılımı için

Proje versiyonunu değiştirmek için:

File | Settings | Project: <project name> | Python Interpreter for Windows and Linux

PyCharm | Preferences | Project: <project name> | Python Interpreter for macOS

Default Python versiyonunu değiştirmek için:

File | New Projects Setup | Settings for New Project for Windows and Linux

File | New Projects Setup | Preferences for New Project for macOS

Spyder yazılımı için:

Tools | Preferences | Python Interpretor

Spyder için bu işlemi yaptıktan sonra yeni versiyon için aşağıdaki modülü indirmeyi unutmayın.

pip install spyder-kernels







Python'ı Komut Satırında Çalıştırmak

Python yazılımını kurarken Path bilgisini Enviroment'a ekleyen seçeneği seçmediyseniz windows işletim sisteminde komut satırında python veya pip yazdığınızda yazılım çalışmayacaktır. Bilgisayar içinde yerini bulup o klasöre girdikten sonra komut satırında çalıştırılabilir. Python ve uygulamalarını komut satırında çalıştırmak için sonradan da Path bilgisini girebilirsiniz. Bunun için;

Windows System Properties alanına girin. Bu alan Ayarlar > Advanced System Settings altındadır. Bu alana girdikten sonra Advanced sekmesini seçin. Sağ alt köşede bulunan Envirroment Variables butonuna tıklayın. System Variables alanına Python ve Python/script directorlerini Path değişkeni altına girin.

Path değişkenini seçin ve edit butonuna tıklayın. Listeye bilgisayarınızdaki yerlerini ekleyin.

Ör:

C:\Users\(kullanıcı Kılasörü)\AppData\Local\Programs\Python\Python310\

C:\Users\(kullanıcı Kılasörü)\AppData\Local\Programs\Python\Python310\Scripts

Ekledikten sonra bilgisayarınızı reboot etmeniz yeterli. Artık python komutlarını istediğiniz yerde yazabilirsiniz.

C:\Users>python

Python 3.10.7 (tags/v3.10.7:6cc6b13, Sep  5 2022, 14:08:36) [MSC v.1933 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

>>>


Oracle SQL Merge Komutu

Oracle Merge komutu ile bir tablodaki bilgilerle diğer bir tabloyu rahatlıkla güncelleyebilir, aynı komut içinde diğer tabloda veriler eksik ise bunları tamamlayabilirsiniz. Komutun kullanımı aşağıdaki gibidir.

MERGE INTO target_table 

USING source_table 

ON search_condition

    WHEN MATCHED THEN

        UPDATE SET col1 = value1, col2 = value2,...

        WHERE <update_condition>

        [DELETE WHERE <delete_condition>]

    WHEN NOT MATCHED THEN

        INSERT (col1,col2,...)

        values(value1,value2,...)

        WHERE <insert_condition>;


target_table : Verisi güncellenecek olan tablo

source_table : Verinin alınacağı tablo

search_condition : Eşleşme kriteri



Windows Sunucularda Bazı Önemli Komutlar

Windows sunucuda Sunucu veya Bilgisayarın Seri Numarasını öğrenmek için gerekli komut:

wmic bios get serialnumber

Sunucuda içi boş belli bir büyüklükte dosya oluşturmak isterseniz

fsutil file createnew <filename> <length>

ör:

fsutil file createnew c:\serkan.bin 4096

Komutunu kullanabilirsiniz.


Linux Komutları : İşletim Sistemi Bilgilerini Görme

 Linux işletim sistemiyle ilgili bilgi almak için;

$ uname -a

Linux computername01 3.10.0-1160.59.1.el7.x86_64 #1 SMP Wed Feb 16 12:17:35 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

Dağıtım versiyonu gibi ayrıntılı bilgi edinmek için ise;

$ cat /proc/version

Linux version 3.10.0-1160.59.1.el7.x86_64 (mockbuild@x86-vm-37.build.eng.bos.redhat.com) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Wed Feb 16 12:17:35 UTC 20xx

Komutları kullanılır. Bu bilgiler yeterli değil ise;

$ cat /etc/os-release
veya
$ cat /etc/*release

NAME="Red Hat Enterprise Linux Server"
VERSION="7.9 (Maipo)"
ID="rhel"
ID_LIKE="fedora"
VARIANT="Server"
VARIANT_ID="server"
VERSION_ID="7.9"
PRETTY_NAME="OpenShift Enterprise"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:redhat:enterprise_linux:7.9:GA:server"
HOME_URL="https://www.redhat.com/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"

REDHAT_BUGZILLA_PRODUCT=
REDHAT_BUGZILLA_PRODUCT_VERSION=
REDHAT_SUPPORT_PRODUCT=
REDHAT_SUPPORT_PRODUCT_VERSION=

Komutunu kullanabilirsiniz. Ubuntu işletim sisteminin versiyonunu öğrenmek için

# lsb_release -a

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04.2 LTS
Release:        12.04
Codename:       precise

komutu kullanılabilir. 

Uname komutu ile ilgili açıklama;

UNAME(1)                                                                                         User Commands                                                                                         UNAME(1)

NAME
       uname - print system information

SYNOPSIS
       uname [OPTION]...

DESCRIPTION
       Print certain system information.  With no OPTION, same as -s.

       -a, --all
              print all information, in the following order, except omit -p and -i if unknown:

       -s, --kernel-name
              print the kernel name

       -n, --nodename
              print the network node hostname

       -r, --kernel-release
              print the kernel release

       -v, --kernel-version
              print the kernel version

       -m, --machine
              print the machine hardware name

       -p, --processor
              print the processor type or "unknown"

       -i, --hardware-platform
              print the hardware platform or "unknown"

       -o, --operating-system
              print the operating system

       --help display this help and exit

       --version
              output version information and exit




Python Mouse Hareketi Sağlayan Kod

 Aşağıdaki kod mouse kursörünün ekran üzerinde belirtilen koordinaya sol klik yapmasını sağlayan otomatik olarak tetiklenmesi gereken bir veya birden çok butona basmak için yazılmış bir koddur. Ekranın sol üst kısmı 0,0 olmak üzere pixel'ler belirtilerek butonlara tıklanabilir.


import win32api, win32con

import time

def click(x,y):

    win32api.SetCursorPos((x,y))

    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)

    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)

while True:

    click(100,100)

    time.sleep(5)

    click(200,200)

    time.sleep(5)

    click(300,300)

    time.sleep(5)

    click(500,500)

    time.sleep(5)

    click(600,600)


Diğer mouse hareketleri için;

https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-mouse_event


Server Üzerinde SSL ve TLS Versiyon Kontrolü

 Server'ın üzerinde aktif çalışan TLS versiyonunu aşağıdaki komutlarla kontrol edebilirsiniz. Güvenliğiniz için SSL bağlantıda TLS1.0 ve TLS1.1 kullanmamaya özen gösterin.

Linux Curl Komutları

TLS1.0 --> curl -v -s --tlsv1.0 https://domain -o /dev/null/ 2>&1

TLS1.1 --> curl -v -s --tlsv1.1 https://domain -o /dev/null/ 2>&1

TLS1.2 --> curl -v -s https://domain -o /dev/null/ 2>&1

Windows

curl https://domain -k -v --location-trusted --tlsv1.2 --ciphers 3DES -H "Connection: close"

curl https://domain -k -v --location-trusted --tlsv1.2 --ciphers AECDH-AES128-SHA

SSL versiyonunun desteklenip desteklenmediğini kotrol etmek için

curl https://domain -k -v --location-trusted --sslv3


Apache Sunucusu için SSL Nasıl Oluşturulur

 Apache web sunucusu için SSL sertifikasını aşağıdaki gibi oluşturabilirsiniz. Bu sertifikayı oluşturmak için OpenSSL kullanacağız. Https ile güvenli siteler yapmak için günümüzde mutlaka bu SSL sertifikasını oluşturmalı ve kullanmalısınız. Biz oluşturma işlemini XAMPP server için yapacağız, sizde XAMPP kullanmıyorsanız kendinize göre komutları uyarlayabilirsiniz. İlk olarak Apache bin klasörüne gidilir.

cd /E E:\xampp\apache\bin

Bazı parametreleri set edelim

set OPENSSL_CONF=E:\xampp\apache\conf\openssl.cnf

set RANDFILE=C:\Temp\.rnd

RSA private key Oluşturma

openssl genrsa -out server.key 1024

2048 şifreleme kullanabilirsiniz, sadece komutun sonundaki değeri değiştirmeniz yeterlidir. DS3 ile şifrelemek isterseniz aşağıdaki komutu kullanın.

openssl genrsa -des3 -out server.key 1024

Bu opsiyon size bir şifre soracaktır, uygun bir şifre ile şifreleyin.

CSR (Certificate Sign Request ) Oluşturma

openssl req -nodes -new -key server.key -out server.csr

Bu komutu girdikten sonra çıkan aşağıdaki alanları doldurun.

Country Name (2 letter code) [AU]:TR
State or Province Name (full name) [Some-State]:Istanbul
Locality Name (eg, city) []:Istanbul
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Şirket Adı
Organizational Unit Name (eg, section) []:Bölüm
Common Name (e.g. server FQDN or YOUR name) []:Domain
Email Address []:eporta adresi
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:Domain

Burada dikkat edilmesi gereken "An optional company name" alanınında doldurulmasıdır. Bu alanı doldurmazsanız bazı browser'lar da hata alınabilir. Apache\bin klasöründe oluşacak server.csr isimli CSR dosyasını kullanabilirsiniz.

CSR dosya içeriği nasıl kontrol edilir.

openssl req -in E:\XAMPP\apache\bin\server.csr server -noout -text

Tek Satırda KEY ve CSR Dosyası Oluşturma

İlk olarak bir openssl-san.cfg dosyası oluşturmamız gerekiyor. Dosya içeriği aşağıdaki gibi olmalı.

${URL_ADRESS}=domain adıdır.

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

[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
C = TR
ST = IS
L = Istanbul
O = Sirket
OU = Bolum
CN = ${URL_ADRESS}
[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = ${URL_ADRESS}
DNS.2 = ${URL_ADRESS}.uzantısı
------------------------------------

Dosyayı openssl komutunu yazacağımız alana kopyalamalıyız. Açağıdaki komut ile Key ve CSR dosyalarını yukarıdaki konfigürasyona göre oluşturmuş oluruz.

openssl req -new -newkey rsa:2048 -nodes -out ${URL_ADRESS}.csr -keyout ${URL_ADRESS}.key -config openssl-san.cfg

Aşağıdaki komut ile içeriğini kontrol edebiliriz. 

openssl req -in dosya.csr server -noout -text

Kontrollerde bir sorun yoksa dosya.csr isimli dosyayı SSL alacağınız kişi veya kuruma gönderebilirsiniz. Kendiniz sertifika oluşturacaksanız yazının devamını takip ediniz.

Sertifika Oluşturma

Aşağıdaki komutu kullanarak sertifika oluşturabilirsiniz.

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Tek Adımda Sertifika Oluşturma:Opsiyonel

openssl req -nodes -new -x509 -keyout server.key -out server.crt

Sertifikayı uygulama

Apache Http.conf dosyasına aşağıdaki bölümü ekleyebilirsiniz.

<VirtualHost *:443>
     DocumentRoot E:/XAMPP/htdocs/
     ServerName Domain
     ServerAlias *.Domain
SSLEngine On
SSLCertificateFile "conf/ssl.crt/server.cer"
SSLCertificateKeyFile "conf/ssl.crt/server.key"
</VirtualHost>

yada aşağıdaki komut ile ekleyebilirsiniz. Dikkat etmeniz gereken konu konfigürasyondaki directory yeni oluşturduğunuz dosyaların yeri olmalıdır.

copy /Y server.crt e:\xampp\apache\conf\ssl.crt

copy /Y server.key e:\xampp\apache\conf\ssl.key

Apache sunucusunu yeniden başlatın.

SSL çalışır durumda.


Kaynak : https://benohead.com/blog/2014/05/07/generating-new-certificate-xampp-windows/

https://helpcenter.gsx.com/hc/en-us/articles/207831828-How-to-identify-the-Cipher-used-by-an-HTTPS-Connection

https://docs.microsoft.com/en-us/windows/win32/secauthn/protocols-in-tls-ssl--schannel-ssp-

Apache Sunucu Güvenliği

Apache sunucusunun güvenliği için aşağıdaki adımları takip etmek önemlidir:

  1. Güncel Tutun: Apache sunucunuzu ve kullanılan diğer yazılımları (PHP, MySQL vb.) güncel tutun. Güncellemeler, güvenlik açıklarını düzeltir ve saldırılardan korunmanıza yardımcı olur.
  2. Güvenlik Duvarı (Firewall): Sunucunuzda güvenlik duvarı kullanın ve yalnızca gerekli portlara izin verin. Güvenlik duvarı, zararlı trafikleri engeller ve saldırılardan korur.
  3. DoS ve DDoS Saldırılarına Karşı Koruma: Apache sunucusunun DoS (Hizmet Reddi) ve DDoS (Dağıtık Hizmet Reddi) saldırılarına karşı dayanıklı olmasını sağlayın. Yüksek trafikli saldırılara karşı önlem almak için uygulamalar ve servisler kullanın.
  4. SSL Sertifikası: Web sitesini HTTPS protokolüyle çalıştırmak için SSL sertifikası kullanın. SSL, veri iletimini şifreleyerek güvenliği artırır ve kullanıcı bilgilerini korur.
  5. Güçlü Parolalar ve Erişim Kontrolleri: Sunucu, yönetici paneli ve veritabanları için güçlü parolalar kullanın. Ayrıca, erişim kontrolleriyle sadece yetkilendirilmiş kişilerin sunucuya erişmesini sağlayın.
  6. İzin Ayarları: Dosya ve klasör izinlerini uygun şekilde yapılandırın. İzinlerin gereksiz yere açık olması güvenlik açıklarına neden olabilir.
  7. Giriş Logları: Apache sunucusunun giriş loglarını düzenli olarak inceleyin. Bu loglar, olası saldırıları ve güvenlik ihlallerini tespit etmenize yardımcı olabilir.
  8. IP Engelleme: Tehdit oluşturan IP adreslerini engellemek için güvenlik duvarında IP engelleme (IP blocking) kullanın.
  9. HTTP Başlık Güvenliği: HTTP başlık güvenliği önlemleri alın. Örneğin, HTTP başlıklarında sunucu ve teknoloji bilgisi vermeyin.
  10. Kendi Kendini İmha Eden Dosyalar: Özellikle yükleme dosyaları gibi geçici dosyaların sunucuda kalmasını önleyin.

Bu adımlar, Apache sunucunuzun güvenliğini artırmaya yardımcı olacaktır. Ancak, güvenlik sürekli bir çabadır ve düzenli olarak sunucu güvenlik testleri ve denetimleri yapmak önemlidir. Ayrıca, güvenlik uzmanlarından danışmanlık almak ve güvenlik en iyi uygulamalarını takip etmek de önemlidir.

 Apache sunucu güvenliği için bazı bilgileri kullanıcılardan saklamata fayda vardır. Bunun için ilk olarak .haccess dosyası oluşturarak işe başlamak gerekir. Bu dosya ile birçok güvenlik önlemini alabilirsiniz.

.htaccess dosyasını / dizininde oluşturunuz. Dosya içeriği;

IndexIgnore *
ErrorDocument 403 /error.html
ErrorDocument 404 /error.html
ErrorDocument 500 /error.html
ErrorDocument 502 /error.html
ErrorDocument 503 /error.html
ErrorDocument 504 /error.html

PHP uzantısını silmek için
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

HTML uzantısını silmek için
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]

Link sonundaki / işaretini silmek için
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R=301,L]

Şeklinde olabilir.

Apache Mod Security Yükleme

İlk olarak aşağıdaki linklerden dosya indirilir.

https://www.apachehaus.com/cgi-bin/download.plx

veya

https://www.apachelounge.com/download/

Daha sonra zip dosyası açılır. Dosya içindeki dosya mod_security2.so apache\modules klasörüne kopyalanır.

yajl.dll dosyası apache\bin klasörüne kopyalanır. Aşağıdaki satır http.conf dosyasına eklenir.

LoadModule security2_module modules/mod_security2.so
<IfModule security2_module>
    SecRuleEngine on
    ServerTokens Min
    SecServerSignature " "
</IfModule> 

Server yeniden başlatılır.

Bu modul için diğer seçenekler;

<IfModule mod_security.c>
    # Turn the filtering engine On or Off
    SecFilterEngine On
    # The audit engine works independently and
    # can be turned On of Off on the per-server or
    # on the per-directory basis
    SecAuditEngine RelevantOnly
    # Make sure that URL encoding is valid
    SecFilterCheckURLEncoding On
    # Unicode encoding check
    SecFilterCheckUnicodeEncoding On
    # Only allow bytes from this range
    SecFilterForceByteRange 1 255
    # Cookie format checks.
    SecFilterCheckCookieFormat On
    # The name of the audit log file
    SecAuditLog logs/audit_log
    # Should mod_security inspect POST payloads
    SecFilterScanPOST On
    # Default action set
    SecFilterDefaultAction "deny,log,status:406"
    # Simple example filter
    # SecFilter 111
    # Prevent path traversal (..) attacks
    # SecFilter "\.\./"
    # Weaker XSS protection but allows common HTML tags
    # SecFilter "<( |\n)*script"
    # Prevent XSS atacks (HTML/Javascript injection)
    # SecFilter "<(.|\n)+>"
    # Very crude filters to prevent SQL injection attacks
    # SecFilter "delete[[:space:]]+from"
    # SecFilter "insert[[:space:]]+into"
    # SecFilter "select.+from"
    # Require HTTP_USER_AGENT and HTTP_HOST headers
    SecFilterSelective "HTTP_USER_AGENT|HTTP_HOST" "^$"
    # Only accept request encodings we know how to handle
    # we exclude GET requests from this because some (automated)
    # clients supply "text/html" as Content-Type
    SecFilterSelective REQUEST_METHOD "!^GET$" chain
    SecFilterSelective HTTP_Content-Type "!(^$|^application/x-www-form-urlencoded$|^multipart/form-data)"
    # Require Content-Length to be provided with
    # every POST request
    SecFilterSelective REQUEST_METHOD "^POST$" chain
    SecFilterSelective HTTP_Content-Length "^$"
    # Don't accept transfer encodings we know we don't handle
    # (and you don't need it anyway)
    SecFilterSelective HTTP_Transfer-Encoding "!^$"
</IfModule>

Http bağlantısını Https bağlantısına yönlendirme

Kullanıcıların kesinlikle 80 portundan sunucunuza gelememesi gereklidir. 80 portu güvenli olmadığı için aşağıdaki önlem alınabilir.

<VirtualHost *:80>
     ServerName adres.com
     ServerAlias *.adres.com
Redirect permanent / https://adres.com/
</VirtualHost>

<IfModule rewrite_module>
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R,QSA]
</IfModule>


SQL Materialized View Oluşturma

 Materialized View bir tablonun veya view'ın kendi database'imizde oluşturulan kopyasıdır ve veri içeren tablolar gibi çalışır. Uzak bir database'de sorgu çalıştırmaktansa tabloyu kendi database'imize kopyalayıp çalıştırmamızı sağlar ve bu sorgunun çok hızlı cevap vermesi demektir. Materialized View içindeki verileri istediğimiz gibi güncelletebiliriz. Materialized View database'inizde fiziksel olarak veriyi tutar. Komut formatı şöyledir:

- Normal
CREATE MATERIALIZED VIEW view-name
BUILD [IMMEDIATE | DEFERRED]
REFRESH [FAST | COMPLETE | FORCE ]
ON [COMMIT | DEMAND ]
[[ENABLE | DISABLE] QUERY REWRITE]
AS
SELECT ...;

-- Pre-Built
CREATE MATERIALIZED VIEW view-name
ON PREBUILT TABLE
REFRESH [FAST | COMPLETE | FORCE ]
ON [COMMIT | DEMAND ]
[[ENABLE | DISABLE] QUERY REWRITE]
AS
SELECT ...;

BUILD veri yükleme opsiyonları;

IMMEDIATE : Materialized View oluşturulduğu anda veri de tabloya doldurulur.
DEFERRED : İlk güncelleme sırasında veri doldurulur.

REFRESH opsiyonları;

FAST : Materialized View Log'u kullanılarak güncelleme yapılır. Materialized View Log bulamazsa güncelleme yapamaz.
COMPLETE :  Sorguya göre Materialized View içindeki veriler tamamen silinir ve yeniden ilgili database'lerden çekilir.
FORCE : İlk olarak Fast dener, çalışmazsa Complate Refresh dener.

ON COMMIT : Materialized View de veri güncelleme ilgili databaselerde commit gönderildiğinde yapılır.
ON DEMAND : Yenileme işlemi manuel olarak veya bir zamanlayıcı set edildiğinde yapılır.

START WITH SYSDATE NEXT SYSDATE + 1  aralığı ile yenilenir. Buradaki “1” gün’ü ifade eder. Yani burada günde bir defa refresh edilmesi istenilmiş. Eğer 1/(60*24) yapsaydık, dakikada 1 refresh edilmesini belirtmiş olurduk.

Günde bir yenileme
CREATE MATERIALIZED VIEW view-name
REFRESH COMPLETE
NEXT (SYSDATE +1)
AS
SELECT .....

Saatte bir yenileme
CREATE MATERIALIZED VIEW view-name
REFRESH COMPLETE
NEXT (SYSDATE +1/24)
AS
SELECT .....

SQL Data link üzerinden  Materialized View nasıl oluşturulur.
CREATE MATERIALIZED VIEW view-name
AS
SELECT * FROM the_table@si_db;

si_db : Data Link adı.

Materialized View nasıl silinir.

DROP MATERIALIZED VIEW view_name;

Örnek:
CREATE MATERIALIZED VIEW MV_EXAMPLE_TABLE_NAME
PARALLEL 16
BUILD IMMEDIATE
REFRESH COMPLETE
NEXT (SYSDATE + 1/24)
AS
select /*+  parallel(16) */ * FROM


Kaynak : 
https://oracle-base.com/articles/misc/materialized-views#create-materialized-view

WEB Sayfanıza Harita Ekleyin

 Web sayfanıza harita ekleyip bu harita içerisinde bazı noktaları işaretlemek, harita üzerine çizimler yapmak istiyorsanız bunu Leaflet uygulaması ile kolaylıkla yapabilirsiniz. Sadece aşadaki HTML kodu kendi sitenize uyarlamanız yeterli. Harita üzerindeki gösterimler için siteyi ziyaret edin, çok basit bir şekilde harita üzerinde istediğiniz tüm gösterimleri yapabilirsiniz. Çok basit, çok hızlı. Aşağıdaki kodda center: alanı koordinat bilgisidir.

<!DOCTYPE html>

        <html>
           <head>
              <title>Leaflet</title>
              <link rel = "stylesheet" href = "http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.css"/>
           </head>
          <body>
<div id = "map" style = "width: 900px; height: 580px"></div>
<script src = "http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.js"></script>
              <script>
                 // Creating map options
                 var mapOptions = {
                    center: [41.332453, 28.577112],
                    zoom: 10
                 }
                 
                 // Creating a map object
                 var map = new L.map('map', mapOptions);
                 
                 // Creating a Layer object
                 var layer = new L.TileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png');
                 
                 // Adding layer to the map
                 map.addLayer(layer);
              </script>

           </body>
        </html>

Sayfanızda SSL çalışıyorsa yukarıdaki kodda aşağıdaki link ve script yerine aşağıdaki bölümleri kullanın.

<link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.4/dist/leaflet.css" integrity="sha512-puBpdR0798OZvTTbP4A8Ix/l+A4dHDD0DGqYW6RQ+9jxkRFclaxxQb/SJAWZfWAkuyeQUytO7+7N4QKrDh+drA==" crossorigin=""/>
<script src="https://unpkg.com/leaflet@1.3.4/dist/leaflet.js" integrity="sha512-nMMmRyTVoLYqjP9hrbed9S+FzjZHW5gY1TWCHA5ckwXZBadntCNs8kEqAWdrb9O7rxbCaA4lKTIWjDXZxflOcA==" crossorigin=""></script>

Ayrıntılı bilgi için : https://leafletjs.com/

HTML Kod Örnekleri

  HTML kod içinde çok kullanışlı bazı kod örneklerini burada vereceğiz. PHP veya bunun gibi dinamik kod sistemlerinin yapabileceği birçok basit işlem HTML içinde de yapılabilir. Bunlardan bazılarına değinelim.

HTML Form Alanlarının Boş Bırakılmasını Engelleme

HTML form içinde bulunan herhangi bir değeri zorunlu hale getirmek ve bu zorunlu değer girilmezse hata mesajı verdirmek için aşağıdaki kod örneği kullanılabilir.

<input class="form-control" type="email"  required placeholder="E-Mail"

 oninvalid="this.setCustomValidity('Lütfen geçerli bir E-Mail adresi yazın.')"

 oninput="setCustomValidity('')">

HTML Sayfada Butonla Popup Sayfa Açma

Htlm sayfa içinden bir buton vasıtası ile popup pencere aştırmak için aşağıdaki basit kodu kullanabilirsiniz. Aynı sayfadan birkaç fakrlı popup sayfa açacaksanız her buton için "MyWindow" kelimesi yerine başka birşey yazın. Böylece her buton için faklı popup pencere açılacaktır.

<a href="#" onClick="MyWindow=window.open('http://www.google.com','MyWindow','width=600,height=300'); return false;">Click Here</a>

Bu kod css ve js dosyası gerektirmez, html dosyanız içine yukarıdaki şekilde yazmanız yeterlidir.

Ziyaretciyi HTML kod ile belli bir URL'e yönlendirme. 

<meta http-equiv="Refresh" content="0; url='http://www.google.com'" />

Oracle SQL Türkçe Karekter Uygulamaları

 Oracle SQL'de en çok karşılaşacağınız sorunların başında Türkçe karekter sorunları yer alıyor. Bu sorunları gidermek için aşağıdaki yöntemleri kullabilirsiniz.

Bir string içindeki Türkçe karekterleri dönüştürmek için;

SELECT TRANSLATE ('Türkçe karekter dönüştürme, ğüşİçö', 'ĞÜŞİÖÇğüşıöç', 'GUSIOCgusioc') FROM dual;

Turkce karekter donusturme, gusIco



ORACLE SQL Zaman Fonksiyonları ve Sıralama

Oracle SQL'de belirli bir süre geri gitmek ve bu tarihlere göre bir sıralama yapabilmek için bazı standart formarlar gerekir. Bu formatları kendi sorgunuz ile uygun bir şekilde birleştirerek sıralamayı istediğiniz gibi başlatıp hazırlayabilirsiniz. İlk olarak yardımcı fonksiyonlara bakalım.

SYSDATE : Veritabanı sunucusuna ait tarih-saat bilgisini verir.
SELECT SYSDATE FROM DUAL
2022-11-02 13:23:59

CURRENT_DATE : Kullanılan sunucuya ait sistemin tarih-saat bilgisini verir.
SELECT CURRENT_DATE FROM DUAL
2022-11-02 13:24:59

CURRENT_TIMESTAMP : Kullanıcıya ait sistemin tarih-saat bilgisini verir.
SELECT CURRENT_TIMESTAMP FROM DUAL
2022-11-02 13:26:56

DBTIMEZONE : Veritabanı sunucusuna ait saat dilimini verir.
SELECT DBTIMEZONE FROM DUAL
+00:00

LAST_DAY : Tarihe ait ayın son gününü verir.
SELECT LAST_DAY(SYSDATE) FROM DUAL
2022-11-30 13:29:41

NEW_TIME : Tarihe ait saat dilimini çevirir.
SELECT NEW_TIME(SYSDATE, 'GMT', 'PST') FROM DUAL
2022-11-02 05:31:31

ADD_MONTHS : Belirttiğiniz tarihe istenilen değer kadar ay ekler.
SELECT ADD_MONTHS(SYSDATE, 2) FROM DUAL
2023-01-02 13:32:41

EXTRACT : Tarih bilgisinden yıl, ay, gün, saat gibi her bir parçayı almayı sağlar.
SELECT EXTRACT(YEAR FROM DATE '2022-01-02') FROM DUAL
2022

SELECT EXTRACT(MONTH FROM DATE '2022-01-02') FROM DUAL
1

SELECT EXTRACT(DAY FROM DATE '2022-01-02') FROM DUAL
2

MONTHS_BETWEEN : Verilen tarih aralığını ay olarak hesaplar.
SELECT MONTHS_BETWEEN(ADD_MONTHS(SYSDATE, 2), SYSDATE) FROM DUAL
2

NEXT_DAY : Tarihten sonraki ilk günün tarihini verir.
SELECT NEXT_DAY(SYSDATE, 'SUNDAY') FROM DUAL

TRUNC : Belirtilen tarih alanının ilk anını hesaplar, saat bilgilerini sıfırlar.
SELECT TRUNC(SYSDATE) FROM DUAL
2022-11-02 00:00:00

SELECT TRUNC(SYSDATE, 'YEAR') FROM DUAL
2022-01-01 00:00:00

SELECT TRUNC(SYSDATE, 'MONTH') FROM DUAL
2022-11-01 00:00:00

TO_TIMESTAMP : String ifadeyi tarih formatına çevirir.
SELECT TO_TIMESTAMP('2022/01/01 12:00:01', 'YYYY/MM/DD HH:MI:SS') FROM DUAL
2022-01-01 12:00:01

TO_DATE : String ifadeyi tarih formatına çevirir.
SELECT TO_DATE('2022/01/01', 'YYYY/MM/DD') FROM DUAL
2022-01-01 00:00:00

TO_CHAR : Tarih ve saat biçimini string ifadeye çevirir.
SELECT SYSDATE, TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM DUAL
2022-11-02

SQL ile bu yıl
select TO_CHAR(TRUNC(SYSDATE),'YYYY') from dual

SQL ile bu gün
select TO_CHAR(TRUNC(SYSDATE),'DD.MM.YYYY') from dual

SQL ile bir gün önce
SELECT TO_DATE(current_date - 1) AS yesterday_date FROM dual

SQL ile bir gün sonra
SELECT TO_DATE(current_date + 1) AS tomorrow_date FROM dual

X Ay önceki ayın ilk gününü;

Örnekte X=11

SELECT TRUNC(ADD_MONTHS(SYSDATE, -11), 'MM') FROM DUAL

2021-01-01 00:00:00

SQL'de son X ayı sıralar;

Örnekte X=5

SELECT 1 + LEVEL - 1 AS SIRA, to_char(add_months(trunc(sysdate), - LEVEL + 1), 'MM') AS TARIH from dual connect by level <= 5

SIRA TARIH

1 12

2 11

3 10

4 09

5 08

SQL'de son X günü tarihi ile sıralar; 

Örnekte X=5

SELECT 1 + LEVEL - 1 AS SIRA, TO_CHAR((TRUNC(SYSDATE) - LEVEL + 1),'YYYY.MM.DD') AS TARIH FROM DUAL CONNECT BY LEVEL <= 5

SIRA TARIH

1 2021.12.01

2 2021.11.30

3 2021.11.29

4 2021.11.28

5 2021.11.27

Geriye dönük hafta numaraları listesi elde etme;

ör: Son 50 gün için hafta numaraları listesi

SELECT SUM(SIRA) AS SIRA, TARIH FROM
(SELECT 1 + LEVEL - 1 AS SIRA, TO_CHAR( TO_DATE(sysdate) - LEVEL + 1 , 'IW' ) AS TARIH 
FROM  DUAL CONNECT BY LEVEL <= 50) GROUP BY TARIH ORDER BY SIRA

Sıra Tarih(Hafta)
1 01
35 52
84 51
133 50
182 49
231 48
280 47
329 46

Bulunduğunuz günden geri gün listesi elde etme.

SELECT to_char(TO_DATE (SYSDATE - (LEVEL -1)), 'DD.MM.YYYY')  tarih FROM DUAL CONNECT BY LEVEL <= 360

Google