DBeaver Excell Export

 DBeaver CE database bağlantı yazılımının çıktıları excell olarak kaydedebilmesi için extension aşağıdaki gibi yüklenir.

Yazılım Açılır

Help > install New Software seçeneği seçilir. Açılan ekrana aşağıdaki link kopyalanarak next butonuna tıklanır. 

https://dbeaver.io/update/office/latest/

Yazılım seçilerek next butonuta tıklanarak eklenti kurulur. Yazılım kapatılıp açılarak eklenti kullanılmaya başlanır.

      

PHP için Microsoft SQL Driver Nasıl Yüklenir

 PHP için Microsoft SQL Driver yüklemek için ilk olarak uygun driver microsoft sitesinden indirilir. Driver indirmek için aşağıdaki linki kullanabilirsiniz.

https://go.microsoft.com/fwlink/?linkid=2152937

İndirdiğiniz bu dosyayı bir dizine açın. içinde bulunan .dll dosyalarını PHP/ext klasörüne kopyalayın. Bilgisayarınıza kurulu bulunan PHP sürümüne uygun .dll dosyasını bulun. Bulduğunuz uygun dosyayı php.ini dosyasına aşağıdaki gibi ekleyin

extension=php_sqlsrv_74_ts_x64.dll

Burada 74 değeri kulandığınız php versiyonu ile aynı olmalıdır. x64 işlemci mimarinize uygun bir versiyon olmalıdır. Daha sonra web sunucunuzu yeniden başlatın. Sunucunuz IIS ve ya Apache olabilir. Daha sonra aşağıda linki bulunan ODBC driverını bilgisayarınıza kurun.

Microsoft ODBC Driver;

https://go.microsoft.com/fwlink/?linkid=2156851

Kurulumun gerçekleşip gerçekleşmediğini info.php sayfasından kontrol edebilirsiniz. Kurulum tamamlandığında bu sayfada "sqlsrv" isimli bir tablo oluşacaktır.

Not: info.php dosya içeriği <?php phpinfo(); ?> şeklinde olmalıdır.

      

Apache Active Directory NTLM Kimlik Doğrulama

 Apache web sunucusu ile Active Directory hesaplarından NTLM Kimlik Doğrulamasının nasıl yapılacağını inceleyeceğiz. Domainde bir Apache sunucunuz varsa domain kullanıcılarının kendi şifreleri ile local intranet sayfanıza erişmelerini istiyorsanız aşağıdaki gibi kurulumu yapabilirsiniz.

İlk olarak mod_authn_ntlm.so modülünü internetten indirin fakat dikkat edilmesi gereken bir durum var. Apache sunucunuz 32bit veya 64bit olabilir, bunu kontrol edip uygun versiyonu indirmelisiniz. Daha sonra indirdiğiniz dosyayı Apache/modules klasörüne kopyalayın.

Httpd.conf dosyasının içersine aşağıdaki satırı ekleyin.

LoadModule auth_ntlm_module modules/mod_authn_ntlm.so

Aşağıdaki iki modülün aktif olduğundan emin olun. (Satır önünde # olmamalı)

LoadModule ldap_module modules/mod_ldap.so

LoadModule rewrite_module modules/mod_rewrite.so

Aşağıdaki satırları da ekleyin. Web root'da /authenticate isimli bir klasör yoksa oluşturun. Bu klasör için şifreleme yapılacaktır.

RequestHeader unset X_ISRW_PROXY_AUTH_USER
<Location /authenticate >
    #AllowOverride None
    AuthName "Private location"
    AuthType SSPI
    NTLMAuth On
    NTLMAuthoritative On
    <RequireAll>
        <RequireAny>
            Require valid-user
            #require sspi-user EMEA\group_name
        </RequireAny>
        <RequireNone>
            Require user "ANONYMOUS LOGON"
            Require user "NT-AUTORITÄT\ANONYMOUS-ANMELDUNG"
        </RequireNone>
    </RequireAll>
    # use this to add the authenticated username to you header
    # so any backend system can fetch the current user
    # rewrite_module needs to be loaded then
    # while X_ISRW_PROXY_AUTH_USER is your header name
    RequestHeader set X_ISRW_PROXY_AUTH_USER expr=%{REMOTE_USER}
</Location>

Apache sunucusunu yeniden başlatın. Aşağıdaki kodu şifrelediğiniz klasörde bir php dosyasına yazın ve browser üzerinden sayfaya gidin.

<?php echo $_SERVER['REMOTE_USER']; ?>

PHP Güvenlik ve Performans Ayarları

Apache veya IIS üzerinde çalışan PHP için aşağıdaki özellikleri değiştirerek server performansını artırabilirsiniz.

memory_limit : Default "128M"  Bu, bir komut dosyasının ayırmasına izin verilen maksimum bellek miktarını bayt cinsinden ayarlar. Bu, bir sunucudaki tüm kullanılabilir belleği tüketmek için kötü yazılmış komut dosyalarının önlenmesine yardımcı olur. Bellek sınırı olmaması için bu yönergeyi -1'e ayarlayın. Bir int kullanıldığında, değer bayt cinsinden ölçülür. 

realpath_cache_size : Default "4M" PHP tarafından kullanılacak gerçek önbelleğinin boyutunu belirler. PHP'nin birçok dosya açtığı sistemlerde, gerçekleştirilen dosya işlemlerinin miktarını yansıtmak için bu değer artırılmalıdır. 

Boyut, depolanan yol dizelerindeki toplam bayt miktarını artı önbellek girişiyle ilişkili verilerin boyutunu temsil eder. Bu, önbellekte daha uzun yollar depolamak için önbellek boyutunun daha büyük olması gerektiği anlamına gelir. Bu değer, önbelleğe alınabilen farklı yolların sayısını doğrudan kontrol etmez. Önbellek girişi verileri için gereken boyut sisteme bağlıdır.

realpath_cache_ttl : Default "120"  Belirli bir dosya veya dizin için gerçek yol bilgilerinin önbelleğe alınacağı süre (saniye cinsinden). Nadiren değişen dosyalara sahip sistemler için değeri artırmayı düşünün.

https://www.php.net/manual/en/ini.core.php#ini.variables-order

PHP Şifre Güvenliği

PHP dosyaları içerisine kesinlikle password(şifre) yazmayın, passwordleri bilgisayarda başka bir yere konumlandırıp PHP dosyası içerisine bu şifreleri getirebilirsiniz. Ör sifreler.txt isimli bir dosya oluşturun ve şifreyi içine yazın. Sonra bu dosyadaki şifreyi bir değişkene atayın.

$myfile = fopen("E:\sifreler.txt", "r") or die("Unable to open file!");

$plogin=fgets($myfile);

fclose($myfile);

Yukarıdaki kod ile PHP dostanızda $plogin bilgisini şifre olarak kullanabilirsiniz. Bilgisayarı başkaları da kullanıyorsa bu işlem veri güvenliği için yeterli değildir. Bilgiyi aşağıdaki gibi şifreleyerek kullanabilirsiniz. Password bilgisini gizlemek için şifreleyin. Bu kod password bilginizi şifreler. Çıktıyı aldıktan sonra dosyayı silin fakat key bilgisini kaydetmeyi unutmayın.

<?php

$data = 'şifreyi_buraya_yazın';

$cipher = 'AES-128-ECB';

//key bilgisini istediğiniz gibi değiştirebilirsiniz.

$key = 'jfgksjdfgaksgf32423423bbfabsdjeyrwerwer898er2312423543656';

$encoded = openssl_encrypt($data, $cipher, $key); 

echo $encoded;

?>

Password bilgisini şifreledikten sonra E:\sifreler.txt dosyasına bu bilgiyi yazın. Sonra aşağıdaki kodu php dosyanıza ekleyin.

<?php

$myfile = fopen("E:\sifreler.txt", "r") or die("Unable to open file!");

$plogin=fgets($myfile);

fclose($myfile);

$cipher = 'AES-128-ECB';

$key = 'jfgksjdfgaksgf32423423bbfabsdjeyrwerwer898er2312423543656';

$decoded = openssl_decrypt($plogin, $cipher, $key); // çıktı: prototurk.com

echo $decoded;

?>


Python ile Dosya Ekli Email Gönderme

 Python ile bir excel dosyasını e-mail olarak göndermek istiyorsanız aşağıdaki kodu kullanabilirsiniz. 


import smtplib,ssl
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import formatdate
from email import encoders
def send_mail(send_from,send_to,subject,text,files,server,port,username='',password='',isTls=True):
    msg = MIMEMultipart()
    msg['From'] = send_from
    msg['To'] = send_to
    msg['Date'] = formatdate(localtime = True)
    msg['Subject'] = subject
    msg.attach(MIMEText(text))
    part = MIMEBase('application', "octet-stream")
    part.set_payload(open("WorkBook3.xlsx", "rb").read())
    encoders.encode_base64(part)
    part.add_header('Content-Disposition', 'attachment; filename="WorkBook3.xlsx"')
    msg.attach(part)
    #context = ssl.SSLContext(ssl.PROTOCOL_SSLv3)
    #SSL connection only working on Python 3+
    smtp = smtplib.SMTP(server, port)
    if isTls:
        smtp.starttls()
    smtp.login(username,password)
    smtp.sendmail(send_from, send_to, msg.as_string())
    smtp.quit()

End of Life Olan Flash Player Nasıl Kullanıma Açılır.

 End of Life Olan Flash playerı bilgisayarınızda kullanmaya devam edebilirsiniz fakat bu kullanımın bazı güvenlik açıklarına sebep olacağını unutmayız. Sadece acil girilmesi gereken sistemler için kullanmanızı, kullanım sonrası ayarları iptal etmenizi öneririm. Flash player'de artık yeni geliştirmeler yapılmadığını ve güvenlik açıklarının artık kapatılmadığını unutmayın. Chrone üzerinden flash player olan bir siteye girebilmek için Chrome Versiyon 87 veya daha önceki bir sürüm kullanmalısınız, sonraki sürümler Flash yazılımını içermez.

1- Bilgisayarınızda aşağıdaki dizine “mms.cfg” isimli bir dosya oluşturun.

C:\Users\Username\AppData\Local\Google\Chrome\User Data\Default\Pepper Data\Shockwave Flash\System

Burada username bölümü kendi bilgisayarınızda bulunan ve kullandığınız dizin olmalıdır.

2- Dosyanın içeriğini aşağıdaki gibi değiştirin.

EnableAllowList = 1
AllowListUrlPattern = http://Bilgisayar_Adi/
AllowListUrlPattern = https://IP_Adresi/
AllowListUrlPattern = https://Site_adresi/

Burada “AllowListUrlPattern” girmek istediğiniz site adresi olmalı. Buraya istediğiniz kadar URL girebilirsiniz

3- Chrome üzerinden sayfaya girin, adres barının yanındaki alana tıklatın ve “Site settings” alanına ulaşın. Flash karşınıdaki seçenekten izin verin.

4- Siteyi browser'dan tekrar çağırın. Karşınıza çıkan Update seçeneğini “Run this time” seçerek devam edin.

Siteye ulaşabileceksiniz.

Adobe Flash, Chrome, End of Life, Enable Flash Player

MySql Import Türkçe Karekter Sorunu

 Bilgisayarınızda bulunan csv dosyalarını MySql'e yüklerken Türkçe karekter sorunu ile karşılaşabilirsiniz. Bu sorun ile karşılaşmamak için ilk olarak bilgisayarınızda bulunan CSV dosyasını UTF8 encoding formatına dönüştürmelisiniz. Bunun için Notepad++ kullanabilirisiniz. 

Dosyanızı bu program ile açın, encoding menusunden UTF8 seçin. Karekterler bozulur ise içeriği silip orijinal dosyadan tekrar kopyalayın ve dosyanızı farklı kaydedin. Dosyanızı tekrar açarak encoding kısmında UTF8 seçili olduğundan emin olun. 

UTF8 formatına dönüştürdüğünüz dosyayı UTF8 encoding ile MySql'e import edin, dosyadaki Türkçe karekter sorununun UTF8 formatında çözüldüğünü göreceksiniz.

Python ile Hava Durumu Bilgisi

Python kullanarak openweathermap.org sitesinin API arayüzünü kullanarak hava durumu bilgisi alabilirsiniz. İlk olarak siteye üye olup bir API key oluşturmanız gerekiyor. Daha sonra aşağıda bulunan Python scripti kullanarak istediğiniz yerin hava durumu bilgisini alabilirsiniz.

Python Kod;

import requests, json 

api_key = "KEY"
base_url = "http://api.openweathermap.org/data/2.5/weather?"
city_name = "İstanbul
complete_url = base_url + "appid=" + api_key + "&units=metric&q=" + city_name 
response = requests.get(complete_url) 
x = response.json() 
if x["cod"] != "404": 
    data = json.loads(response.text)
    print(data)
    coord_lon=data["coord"]["lon"]
    coord_lat=data["coord"]["lat"]
    weather_id=data["weather"][0]["id"]
    weather_main=data["weather"][0]["main"]
    weather_description=data["weather"][0]["description"]
    weather_icon=data["weather"][0]["icon"]
    base=data["base"]
    main_temp=data["main"]["temp"]                  #Metric: Celsius
    main_feels_like=data["main"]["feels_like"]      #Metric: Celsius
    main_temp_min=data["main"]["temp_min"]          #Metric: Celsius
    main_temp_max=data["main"]["temp_max"]          #Metric: Celsius
    main_pressure=data["main"]["pressure"]          #Atmospheric pressure hPa
    main_humidity=data["main"]["humidity"]          #%
    visibility=data["visibility"]
    wind_speed=data["wind"]["speed"]                #Default: meter/sec
    wind_deg=data["wind"]["deg"]                    #deg
    clouds_all=data["clouds"]["all"]                #Cloudiness, %
    dt=data["dt"]
    sys_type=data["sys"]["type"]
    sys_id=data["sys"]["id"]
    sys_country=data["sys"]["country"]
    sys_sunrise=data["sys"]["sunrise"]
    sys_sunset=data["sys"]["sunset"]
    timezone=data["timezone"]
    id=data["id"]
    name=data["name"]
    cod=data["cod"]
    print(coord_lon, coord_lat, weather_id, weather_main, weather_description, weather_icon, base, main_temp, main_feels_like, main_temp_min, main_temp_max, main_pressure,
          main_humidity, visibility, wind_speed, wind_deg, clouds_all, dt, sys_type, sys_id, sys_country, sys_sunrise, sys_sunset,
          timezone, id, name, cod)
else: 
    print("City Not Found ")

Hava durumu API http://api.openweathermap.org/

PHP if else

PHP kod içerisinde bir değişkenin değerine göre bazı alanları gösterip bazı alanları göstermeyebilirsiniz. Bu işlemler içinde geçerlidir. PHP ile aşağıdaki gibi bir değişkenin değerine bağlı olarak istediğiniz işlemler arasında tercih yapabilirsiniz.

<?php

if ((empty($_GET['degisken']))){

<Değişkene bir değer atanmadıysa işlenecek alan>

echo "Değişkene atanan bir değer yok";

} else {

?>

<Değişkenin bir değeri varsa işlenecek alan>

echo "Değişkene atanan bir değer var";

<?php }} ?>

      

PHP ile Oracle Veri Tabanına Nasıl Bağlanılır (Apache)

PHP üzerinden Oracle veri tabanına nasıl bağlanılacağına değineceğiz. XAMPP sunucusu üzerinde bulunan Apache serverdan faydalanarak Oracle database'e nasıl erişebiliriz?

İlk olarak PHP info sayfasına bakalım.

 http://localhost/dashboard/phpinfo.php

Bu sayfada bulunan iki değerin karşılığının ne olduğuna bakmalıyız

Architecture x86 veya x64 olacaktır.

Thread Safety enabled

Architecture değeri bendeki gibi x86 görünüyorsa 32bit bir PHP sürümüne sahipsiniz demektir. Thread Safety değeri mutlaka enable olmalıdır.

İlk olarak PHP.ini dosyası içinde aşağıdaki kaydın olup olmadığını kontrol edin açık değilse açın.

PHP 7.2den eski sürümler için

extension=oci8_12c

PHP 7.2'den sonraki sürümler için

extension=oci8_12c.dll

Ayrıca dosyaların bulunduğu dizinin php.ini dosyası içinde açık olduğundan emin olun.

extension_dir="D:\xampp\php\ext"

Oracle Instant Client Basic paketini internetten indirin.

http://www.oracle.com/technetwork/database/database-technologies/instant-client/downloads/index.html

Windows x86 için 32bit, x64 için 64bit sayfasındaki "instantclient-basic-nt-12.2.0.1.0.zip" dosyasını indirmelisiniz. İndirdiğiniz dosyayı diskinizde bir klasör oluşturarak içine kopyalayın

D:\Oracle\instantclient_12_2

Bu klasörü sistem path bölümüne ekleyin

Control Panel -> System -> Advanced System Settings -> Advanced -> Environment Variables -> System Variables -> PATH. 

Name : Oracle Değer: D:\Oracle\instantclient_12_2

İnternetten indirdiğiniz instantclient_12_2 klasörünün içindeki *.dll dosyalarını D:\xampp\php ve D:\xampp\apache/bin klasörlerine kopyalayın.

Apache servisini restart ettiğinizde phpinfo dosyasına tekrar bakın. Burada OCI8 extension bölümünün açıldığını göreceksiniz. Bundan sonra test etmeniz yeterli. Aşağıdaki kod ile test edebilirsiniz.

<?php
 
error_reporting(E_ALL);
ini_set('display_errors', 'On');
 
$username = "hr";                  // Use your username
$password = "welcome";             // and your password
$database = "localhost/orclpdb";   // and the connect string to connect to your database
 
$query = "select * from dual";
 
$c = oci_connect($username, $password, $database);
if (!$c) {
    $m = oci_error();
    trigger_error('Could not connect to database: '. $m['message'], E_USER_ERROR);
}
 
$s = oci_parse($c, $query);
if (!$s) {
    $m = oci_error($c);
    trigger_error('Could not parse statement: '. $m['message'], E_USER_ERROR);
}
$r = oci_execute($s);
if (!$r) {
    $m = oci_error($s);
    trigger_error('Could not execute statement: '. $m['message'], E_USER_ERROR);
}
 
echo "<table border='1'>\n";
$ncols = oci_num_fields($s);
echo "<tr>\n";
for ($i = 1; $i <= $ncols; ++$i) {
    $colname = oci_field_name($s, $i);
    echo "  <th><b>".htmlspecialchars($colname,ENT_QUOTES|ENT_SUBSTITUTE)."</b></th>\n";
}
echo "</tr>\n";
 
while (($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
    echo "<tr>\n";
    foreach ($row as $item) {
        echo "<td>";
        echo $item!==null?htmlspecialchars($item, ENT_QUOTES|ENT_SUBSTITUTE):"&nbsp;";
        echo "</td>\n";
    }
    echo "</tr>\n";
}
echo "</table>\n";
?>

Kaynak : https://blogs.oracle.com/opal/installing-xampp-for-php-and-oracle-database



Python Selenium Uygulaması

Python ile herhangi bir web sayfasını açıp, sayfaya login olup, istediğiniz sayfaya gidip, formu doldurup gönderebilirsiniz. Bunu sağlayabilen selenium kütüphanesi için Google'ı açıp istediğiniz bir kelimeyi arama yapabilen bir örnek kod paylaşıyorum. Bot yapmak için çok esnek olan bu modülü kullanmanızı tavsiye ederim.

Modülü kullanabilmek için Firefox veya Chrome driver'ını bilgisayarınıza indirip aşağıdaki gibi yerini göstermeniz gerekiyor, kurulum gerektiren bir dosya değil. Aşağıdaki örnek Chrome driver ile yapılmıştır.

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

import time

from selenium import webdriver

driver = webdriver.Chrome('c:\directory\chromedriver.exe')  

driver.get('http://www.google.com/');

time.sleep(5) # Let the user actually see something!

search_box = driver.find_element_by_name('q')

search_box.send_keys('ChromeDriver')

search_box.submit()

time.sleep(5) 

driver.quit()

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

Tüm driver dosyaları için;

https://pypi.org/project/selenium/ 

PHP include hatası

 PHP dosya içerisine herhangi bir PHP veya HTML dosya import edilirken hata alınıyorsa PHP.ini dosyası içinde işletim sistemine göre aşağıdaki konfigürasyonun yapılması gerekir.

Burada sadece bir işletim sistemi seçilmelidir. Kullandığınız işletim sisteminin altındaki kodun başındaki ; işaretini kaldırmalısınız. Aşağıdaki konfigürasyon windows içindir.

include_path bölümüne yazacağınız dizin IIS veya Apache'nin PHP çalıştıracağınız www dizini olmalı.

;;;;;;;;;;;;;;;;;;;;;;;;;

; Paths and Directories ;

;;;;;;;;;;;;;;;;;;;;;;;;;

; UNIX: "/path1:/path2"

;include_path=C:\XAMPP\php\PEAR

; Windows: "\path1;\path2"

include_path = ".;C:\XAMPP\htdocs"


PHP.ini dosyalarındaki tüm parametreler için;

https://www.php.net/manual/tr/ini.core.php#ini.include-path


Python ile Kelime veya Cümleleri String Olarak Birleştirme

Python'da cümleleri, kelimeleri veya sayıları bir string olarak birleştirebilmek için aşağıdaki methodlardan herhangi birini kullanabilirsiniz. Bunların tamamı aynı sonucu verecektir.


name ='Serkan'

age = 18


"I am " + name + " and I am " + str(age) + " years old."

I am Serkan and I am 18 years old.


"I am %s and I am %d years old." %(name, age)

I am Serkan and I am 18 years old.


"I am {} and I am {} years old." .format(name, age)

I am Serkan and I am 18 years old.


f"I am {name} and I am {age} years old."

I am Serkan and I am 18 years old.

Python ile e-Mail Nasıl Atılır.

 Python kullanarak kod içerisindeki mesajları mail ile gönderebilmek için aşağıdaki kodu kullanabilirsiniz.


import smtplib

from email.mime.text import MIMEText


msg = MIMEText("Deneme Mesajıdır, Panik Yok!!!")


msg['Subject'] = 'Deneme Mesajı'

msg['From'] = "Services Control <ServicesControl@mailadresi>"

msg['To'] = "kimegonder@domain"


s = smtplib.SMTP('xxx.xxx.xxx.xxx')

s.send_message(msg)

s.quit()


Bu kodu fonksiyon olarak tanımlarsanız mesah göndermeniz daha esnek bir hal alacaktır.



import smtplib

from email.mime.text import MIMEText


def smtpsend(message):

    

    msg = MIMEText(message)

    

    msg['Subject'] = 'Deneme Mesajı'

    msg['From'] = "Services Control <ServicesControl@mailadresi>"

    msg['To'] = "kimegonder@domain"

    

    s = smtplib.SMTP('xxx.xxx.xxx.xxx')

    s.send_message(msg)

    s.quit()


message="Deneme mesajı"

smtpsend(message)

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

Google