22 Ocak 2022 Cumartesi

Python ile InfluxDB operasyon scripti

Merhaba,

Bugün InfluxDB ile ilgili çeşitli işlemleri yapabileceğiniz bir python script paylaşmak istiyorum.

Alttaki script ile InfluxDB üzerinde veritabanı yaratabilir, measurement yaratabilir, veri ekleyebilir, veritabanları ve measurementları listeletebilir, var olan bir measurement ı başka bir measurementa taşıyabilirsiniz. Henüz temel birtakım işlemleri yapan scriptimizi önümüzdeki süreçte daha da geliştirip InfluxDB ile alakalı birçok işlemi yapan bir araç haline getirmeyi planlamaktayım.

   


from influxdb import DataFrameClient, InfluxDBClient
from pandas import DataFrame
import pandas as pd
import numpy as np


class InfluxMain:

def __init__(self, host, port, user, password, dbname):
self.host, self.port = host, port
self.user, self.password = user, password
self.dbname = dbname
self.client = DataFrameClient(host, port, user, password, dbname)
self.__create_database__(dbname) # Creates if db does not exist

def __create_database__(self, db):
try:
print("Creating DB: " + db)
self.client.create_database(db)
except Exception as e:
print(e)

def insert_data(self, data, measurement, tag_columns):
self.__write_to_database__(data, measurement, tag_columns)

def drop_measurement(self, measurement):
print("Dropping measurement: " + measurement)
self.client.drop_measurement(measurement)

def __write_to_database__(self, data, measurement, tag_columns, protocol="line"):
try:
print("Create Measurement: " + measurement)
self.client.write_points(data, measurement, tag_columns=tag_columns, protocol=protocol, batch_size=10000)
print("Done!")
except Exception as e:
traceback.print_exc()


class InfluxAnalyser:

def __init__(self, host, port, user, password, dbname):
self.host, self.port = host, port
self.user, self.password = user, password
self.dbname = dbname
self.influxdb_client = InfluxDBClient(host, port, user, password, dbname)

def close_connection(self):
self.influxdb_client.close()

def get_databases(self, print_to_screen):
try:
df_databases = DataFrame(self.influxdb_client.query("SHOW DATABASES").get_points())
if print_to_screen == True:
print("\n| INFLUX DATABASES |\n")
for i in range(len(df_databases)): print("DB-" + str(i + 1), "> ", df_databases['name'].loc[i])
return df_databases
except Exception as e:
print(e)

def show_measurements(self):
try:
df_databases = self.get_databases(False)
for i in range(len(df_databases)):
db_name = df_databases['name'].loc[i]
print("\nDATABASE : " + db_name + "\n")
df_measurements = DataFrame(self.influxdb_client.query("show measurements on " + db_name).get_points())
print("Measurements >")
print(df_measurements)
except Exception as e:
print(e)

def migrate_measurement(self, source, target, influx, tag_columns, influx_index):
select = "select * from " + source
df = DataFrame(self.influxdb_client.query(select).get_points())
df['Index_Time'] = pd.to_datetime(df[influx_index])
df.set_index('Index_Time', inplace=True)
influx.insert_data(df, target, tag_columns)


if __name__ == "__main__":
host, port = "localhost", 8086
user, password = "", ""
database = "TestDB"
measurement = "TestMeasurement"

influx = InfluxMain(host, port, user, password, database) # Create DB if not exists, initiate connection object
# influx.drop_measurement(measurement)

# Test data : Dataframe with Python Dataframe
df = pd.DataFrame(columns=['Name', 'City', 'Market_Type', 'Par_Val', 'Core_Val'])
dfrow = {'Name': 'Mert', 'City': 'ist', 'Market_Type': 'marmar', 'Par_Val': '23443234', 'Core_Val': '7567567',
'Start_Time': '2021-01-01 00:10:33'}
df = df.append(dfrow, ignore_index=True)
df['Index_Time'] = pd.to_datetime(df['Start_Time'])
df.set_index('Index_Time', inplace=True) # Setting index time for influxdb measurement

tag_columns = ['Name', 'City', 'Market_Type'] # Define tag column names. Fields come with data.
influx.insert_data(df, measurement, tag_columns) # Create measurement if not exists, and add data

analyser = InfluxAnalyser(host, port, user, password, database)
analyser.get_databases(True)
analyser.show_measurements()
source, target, dbname = "TestMeasurement", "NewMeasurement", "TestDB"
influx_index = "Start_Time" # Influx DB table index time
analyser.migrate_measurement(source, target, influx, tag_columns, influx_index) # Read from source, write to target
analyser.close_connection()

20 Ocak 2022 Perşembe

Python metod ve fonksiyonları - Python Methods and Functions

Merhaba,

Sıklıkla karıştırılabilen bir konuya açıklık getirmek isterim. Python yazılım dilinde fonksiyon ve metod konseptleri farklı şeyleri ifade etmektedir. 

Metodlar sınıfların bir parçasıdır ve sınıf ile oluşturulan objenin durumunu değiştirebilir. Fonksiyonlar ise sınıflardan bağımsız tek başına çalışan ve çağrılabilen yapılardır. Bir objenin parçası değildirler.

Örnek ile açıklamak gerekirse.

class Toplam:
    def __init__(self, a, b):
        self.a = a
        self.b = b
    # Metod Ornegi
    def islem(self):
        return self.a + self.b

#Fonksiyon Ornegi
def topla(a, b):
    return a + b

Toplam sınıfı içinde tanımlı islem() bir metoddur. Sınıf dışında tanımlı topla() ise bir fonksiyondur.







Teşekkürler,

Cem Selmanoğulları

17 Ocak 2022 Pazartesi

Python yazılım dilinde Dekoratör (Decorator) kullanımı

Merhaba,

Bugün Python yazılım dilinde Decorator kullanımına bir örnek paylaşmak istiyorum. Kısaca diğer fonksiyonları yada sınıfları geliştirip modifiye etmeye yarayan python objeleri şeklinde tanımlayabiliriz. 

Örnek vermek gerekirse, bir fonksiyonumuz olsun. Bu fonksiyon bir string döndürüyor olsun. Bu döndürülen stringin büyük harfle başlamasını istiyoruz. Bunu direkt fonksiyon içinde yapmamız mümkün, ama biz bunu her yazdığımız fonksiyon içinde tekrar tekrar yapacak mıyız ?  İşte bunun için her ihtiyacımız olduğunda decorator fonksiyonunu çağırarak bu işi yapmasını sağlayabiliriz. Alttaki örnekte capitalizer isimli bir decorator fonksiyonumuz var. birde string dönen fonksiyonumuz var. @capitilizer referansını stringer fonksiyonunun başına yazdığımızda artık capitilizer fonksiyonu bir nevi stringer fonksiyonunu sarmalayarak geliştirip dönen değeri büyük harfle başlayacak şekilde geliştirecektir.

def capitalizer(func):
def wrapper(string):
innerfunc = func(string)
capitalized = innerfunc.capitalize()
return capitalized
return wrapper

@capitalizer
def stringer(string):
return string

print(stringer("tHiS is a DeCORator EXAmple"))

Çıktı :  This is a decorator example


Bir başka örneği ise Python Django Framework üzerinden verebiliriz. Django otantikasyon sistemi view fonksiyonları ile birlikte kullanabileceğimiz bir @login_required dekoratörü sunmaktadır. Bu dekoratörün refere edildiği view eğer sisteme login olunduysa gösterilecek olunmadıysa gösterilmeyecektir.

Alttaki örnekte @login_required dekoratörünün nasıl uygulandığını görebilirsiniz. Login olmayanlara my_view gösterilmeyecektir.


from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    ...






Teşekkürler,

Cem Selmanoğulları

30 Aralık 2021 Perşembe

Python ile uzak makineye ssh bağlantısı yaparak komut çalıştırmak

Merhaba,

Python pexpect kütüphanesini kullanarak kullanıcı adı ve şifre ile uzak makineye (linux server) ssh ile bağlanıp komut çalıştıralım. 

from pexpect import pxssh
import getpass
try:
    s = pxssh.pxssh()
    hostname = "ip.ip.ip.ip"
    username = "root"
    password = "732he+?hs7"
    s.login(hostname, username, password)
    s.sendline('ll')  
    s.prompt()            
    print(s.before)        
    s.sendline('ls -l')
    s.prompt()
    print(s.before)
    s.sendline('df')
    s.prompt()
    print(s.before)
    s.logout()
except pxssh.ExceptionPxssh as e:
    print("pxssh login hata.")
    print(e)</code>

29 Eylül 2021 Çarşamba

Python Class ve Metodları

Merhaba,

Basit bir örnek ile Python Class ve Class Metodlarının nasıl oluşturulduğunu görelim.

Alttaki örneğimizde Car isimli bir class oluşturacağız. Bu class ın içinde __init__ ile tanımlanan metod bu class üzerinden oluşturulacak her obje örneğini tanımlanan özellikler ile başlatacaktır. Yani oluşturulan her Car objesi doornum, color, motor ve model özellikleri ile başlatılacaktır. Bu özellikleri self.değişken şeklinde __init__ içinde tanımlıyoruz. Bu özellikler oluşturulan her Car objesinde farklı verilebilir. Sınıf özelliği ise oluşturulan her objede aynı olacaktır. Bunu ise type değişkeni ile sınıf içinde tanımlıyoruz. 

class Car:
    type = "Personal"

    def __init__(self, doornum, color, motor, model):
        self.doornum = doornum
        self.color = color
        self.motor = motor
        self.model = model

Artık bir Car objesi oluşturabiliriz.

carx = Car(4,"white",1600,"Opel Astra")

Hatta oluşturulan carx objesinin özelliklerini ekrana bastırabiliriz.

print(carx.model)
print(carx.type)

Buraya kadar bir sınıfa özellik tanımlayarak obje oluşturmayı gördük. Peki bu objenin bazı aksiyonlar almasını istersen ne yapacağız ? Bu durumda metodlar devreye girer. Sınıf içinde tanımlanacak metodlar o sınıfa çeşitli aksiyon alma yeteneği katarlar. Alttaki şekilde ekleyebiliriz.

def printInfo(self):
    print(f"Model is : {self.model} , Color is : {self.color}")


def radio(self, action):
    '''
    Radio Open/Close Codes
    '''
    print(f"{self.model} > Radio {action}")
Yukarıdaki metodlardan birincisi Car üzerinden türetilen objenin bazı özelliklerini ekrana basar.

İkincisi ise aracın radyosunu açar yada kapatır. 

Tam bir örneklemeyle kodlarsak :

class Car:
    type = "Personal"

    def __init__(self, doornum, color, motor, model):
        self.doornum = doornum
        self.color = color
        self.motor = motor
        self.model = model

    def printInfo(self):
        print(f"Model is : {self.model} , Color is : {self.color}")

    def radio(self, action):
        '''
        Radio Open/Close Codes
        '''
        print(f"{self.model} > Radio {action}")

carx = Car(4,"white",1600,"Opel Astra")
print(carx.model)
print(carx.type)
carx.printInfo()
carx.radio("OPEN")
print()
carm = Car(2,"red",2000,"Renault Clio")
print(carm.model)
print(carm.type)
carm.printInfo()
carm.radio("CLOSE")

Kodu çalıştırdığımızda çıktımız alttaki şekilde olacaktır.







Teşekkürler,

Cem Selmanoğulları

23 Eylül 2021 Perşembe

Xamarin Forms (C#) ile IOS&Android uygulamalarımız için LDAP entegrasyonu

Merhaba,

Bugün Xamarin Forms (C#) ile IOS&Android uygulamalarımız için LDAP entegrasyonu üzerine bir örnek paylaşmak istiyorum. Öncelikle ldap entegrasyonu için alttaki Nuget paketini yüklemeniz gerekiyor.





Novell.Directory.Ldap.NETStandard nuget paketi ile ldap otantikasyon ve ldap arama işlemlerini rahatlıkla yapabiliriz.

Öncelikle bir LdapConnection yaratıyoruz. (.Connect) ile url ve portu verilen ldap sunucusuna bağlanıyoruz. (.Bind) ile bağlantı üzerinden ldap üzerinde arama yapmaya yetkili bir kullanıcı ile otantikasyonu yapıyoruz. Sonrasında  vereceğimiz Ldap SearchBase içinde belirlediğimiz attrs ("givenname", "cn" , "uid" , "mail" , "address") değerlerini getirecek şekilde aratmamızı yapıyoruz. Bağlantımızda Search i çağırdığımızda bunu LdapSearchResults olacak şekilde tanımlıyoruz. Sonrasında ise bu LdapSearchResults içinde gezinerek istediğimiz bilgileri ekrana bastırıyoruz.


void ldap_check() {
    using (var cn = new LdapConnection())
    {
        cn.Connect("192.168.121.120", 389); //636 ssl
        try
        {
            //cn.SecureSocketLayer = true;
            cn.Bind("cn=admin,dc=localdomain,dc=local", "password");
            Console.WriteLine(" ::: LDAP BAŞARILI  ::: " + cn.ToString() + " ::: ");

            string[] attrs = { "givenname", "cn" , "uid" , "mail" , "address"};
            string SearchBase = "uid=selman,ou=People,dc=localdomain,dc=local";
            LdapSearchResults lsc = (LdapSearchResults)cn.Search(SearchBase,
            LdapConnection.ScopeBase , "(objectClass=*)", attrs, false);

            while (lsc.HasMore())
            {
                LdapEntry nextEntry = null;
                try
                {
                    nextEntry = lsc.Next();
                    Console.WriteLine(">>> " + nextEntry.ToString());
                }
                catch (LdapException e)
                {
                    throw e;
                }
                break;
            }
        }
        catch (LdapException f)
        {
            Console.WriteLine(" LDAP HATA : " + f.ResultCode.ToString());
            return;
        }
        catch (Exception f)
        {
            Console.WriteLine(" LDAP HATA : " + f.Message);
            return;
        }
    }
}


Çıktımız alttaki gibi olacaktır :

::: LDAP BAŞARILI  :::  Novell.Directory.Ldap.LdapConnection

LdapEntry: uid=selman,ou=People,dc=localdomain,dc=local; 

LdapAttributeSet:   LdapAttribute: {type='givenName', value='cem'} 

                                LdapAttribute: {type='uid', value='selman'} 

                                LdapAttribute: {type='cn', value='cemselman'} 

                                LdapAttribute: {type='mail', value='cemmailselman@gmail.com'}

Thread finished:  #11

 

Teşekkürler,

Cem Selmanoğulları


7 Eylül 2021 Salı

Django projesini varolan veritabanı ve tablolar ile birlikte çalıştırmak

Merhaba,

Yeni bir Django projesi oluşturdunuz. Veritabanını bağladınız fakat veritabanında birçok tablo var. Bu tabloları da kullanabilmek ve Django models.py dosyasına dahil etmek istiyorsunuz. İşte bu durumda python yönetim komutlarından inspectdb oldukça işimize yarıyor. Alttaki komutu çalıştırıp yeni bir models.py dosyası oluşturuyoruz. Bu dosya halihazırda veritabanında bulunan tablolar üzerinden oluşturuluyor. Sonrasında bu models.py dosyasını manuel olarak düzenleyip gerçek models.py dosyamıza taşıyoruz. Makemigration ve migrate işlemlerini yaparak işlemi tamamlıyoruz.



$ python manage.py inspectdb > models.py

Dilerseniz geçici models.py oluşturmadan direkt inspectdb analiz çıktısını ekrana da bastırabilirsiniz.



$ python manage.py inspectdb


Teşekkürler,

Cem Selmanoğulları



27 Ağustos 2021 Cuma

XAML view içinde Label tıklayarak aksiyon aldırma

Selamlar,

XAML sayfanız içine yerleştirdiğimiz bir Label text değerini tıklayarak değiştirmek için alttaki şekilde GestureRecognizer ekleyebiliriz. XXXXX yazan Label a tıkladığımızda Label değeri OOOOOOOO olarak değişecektir.



<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"  
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"  
             xmlns:local="clr-namespace:XCob"  
             x:Class="XCob.testpage3"  
             Title ="Expendable ListView "  
             BackgroundColor="Bisque">

    <Grid x:Name="MainGrid2x4" AbsoluteLayout.LayoutFlags="All" AbsoluteLayout.LayoutBounds="0,0,1,1" BackgroundColor="Transparent" >
        <Grid.RowDefinitions>
            <RowDefinition Height="200" />
            <RowDefinition Height="200" />
        </Grid.RowDefinitions>
        <BoxView x:Name="Box2241"/>
        <Label x:Name="mylabel"  Text="YYYY" TextColor="Black" HorizontalTextAlignment="Center" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" FontSize="Large">
            <Label.GestureRecognizers>
                <TapGestureRecognizer Tapped="OnLabelNameTapped" NumberOfTapsRequired="1" />
            </Label.GestureRecognizers>
        </Label>
        <BoxView x:Name="Box2242" Grid.Row="1"/>
        <Label x:Name="mylabel2" Grid.Row="1" Text="XXXXX" TextColor="Black" HorizontalTextAlignment="Center" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" FontSize="Large"/>        
    </Grid>
    
</ContentPage>



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace XCob
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class testpage3 : ContentPage
    {
        public testpage3()
        {
            InitializeComponent();
        }

        void OnLabelNameTapped(object sender, EventArgs args)
        {
            labelcent.Text = "OOOOOOOO";
        }
    }
}

23 Ağustos 2021 Pazartesi

Xamarin.Forms içinde ekrandaki resme dokunarak aksiyon alma

 Merhaba,

Mobil uygulamamızın ekranındaki resme tıkladığımızda bir aksiyon almak için alttaki kosları kullanıyoruz.

Xaml dosyamız içinde image eklerken TapGestureRecognizer tanımlıyoruz.

<AbsoluteLayout BackgroundColor="Transparent">
     <Image AbsoluteLayout.LayoutFlags="All" AbsoluteLayout.LayoutBounds="0,0,1,1" Source="{local:ImageResource VFMob.IMG.mybanner.JPG}" Aspect="AspectFill">
          <Image.GestureRecognizers>
                 <TapGestureRecognizer
                       Tapped="OnImageNameTapped"
                       NumberOfTapsRequired="1" />
           </Image.GestureRecognizers>
     </Image>
</AbsoluteLayout>

Ayrıca C# dosyamız içinde ise alttaki şekilde resme dokunulduğunda oluşacak aksiyonu tanımlıyoruz.

void OnImageNameTapped(object sender, EventArgs args)
{
    Console.WriteLine("TAPPED");
}

Resme tıklandığında konsola TAPPED basıldığını göreceksiniz.


Teşekkürler,

Cem Selmanoğulları



Xamarin.Forms Xaml dosyası içinde yuvarlak button oluşturulması

Merhaba,

Xaml dosyası içinde eklediğimiz köşeli buttonları yuvarlak hale getirebileceğimizi biliyor muydunuz ?

Burda tam yuvarlak olması için önemli nokta Width ve Height değerlerinin aynı olması. Radius değerinin ise bu değerlerin yarısı kadar olmasıdır. Alttaki örnek IOS ve Android için farklı boyutlarda button görüntüleyecek şekilde oluşturulmuştur.

<Button Clicked="NavigateButton_OnClicked" BorderColor="LightGray" BorderWidth="2" HorizontalOptions="Center" VerticalOptions="Center" ImageSource="{local:ImageResource Proj.IMG.picfile.JPG}">
           <Button.WidthRequest>
                 <OnPlatform x:TypeArguments="x:Double">
                         <On Platform="iOS">120</On>
                         <On Platform="Android,Windows">140</On>
                 </OnPlatform>
           </Button.WidthRequest>
           <Button.HeightRequest>
                 <OnPlatform x:TypeArguments="x:Double">
                         <On Platform="iOS">120</On>
                         <On Platform="Android,Windows">140</On>
                 </OnPlatform>
           </Button.HeightRequest>
           <Button.BorderRadius>
                 <OnPlatform x:TypeArguments="x:Int32">
                         <On Platform="iOS">60</On>
                         <On Platform="Android,Windows">70</On>
                 </OnPlatform>
           </Button.BorderRadius>
</Button>


Teşekkürler,

Cem Selmanoğulları