Yazilim etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Yazilim etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

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ı

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ı

24 Temmuz 2021 Cumartesi

Xamarin.Forms ile ilk mobil uygulamamızı yazalım (Android/IOS)

Merhaba,

Xamarin.Forms ile ilk mobil uygulamamızı basitçe oluşturalım. VisualStudio 2019 ile yapacağımız uygulama için öncelikle yeni bir Xamarin.Forms C# projesi açıyoruz.

Solution explorer içinde Xamarin.Forms ana klasör yapısı ile birlikte Android ve IOS klasörlerinin de geldiğini göreceksiniz. Biz Xamarin.Forms ana klasörü ile ilgileneceğiz.

Projemizi test etmek için ise yine visual studio ile birlikte gelen emulatörden faydalanacağız.

Öncelikle MainPage.xaml dosyasını açıyoruz ve içine bir adet Button ekleyeceğiz.

<?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:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="Mob.MainPage">

    <StackLayout>
        <Label Text="Test Sayfası!" 
           HorizontalOptions="Center"
           VerticalOptions="CenterAndExpand"
           FontSize="Large"/>
        <Button Text="Test Et" BackgroundColor="Red" BorderColor="Yellow" TextColor="White" FontSize="Large" Clicked="Test_Et" />
    </StackLayout>

</ContentPage>

Sonrasında MainPage.xaml.cs dosyasını açarak alttaki kod bloğunu MainPage sınıfı içine ekleyeceğiz. Amacımız her button tıklamada kaç kere tıklandığını hesaplamak.

int count = 0;
void Test_Et(object sender, System.EventArgs e)
{
    count++;
    ((Button)sender).Text = $"{count} defa test edildi.";
}

Son durumda MainPage.xaml.cs dosyamız alttaki şekli alıyor.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace Mob
{
    [DesignTimeVisible(false)]
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
        }

        int count = 0;
        void Test_Et(object sender, System.EventArgs e)
        {
            count++;
            ((Button)sender).Text = $"{count} defa test edildi.";
        }
    }
}

Emulatörümüzü çalıştırdığımızda ilk uygulamamız karşınızda. TEST ET butonuna her basışınızda kaç kere test eildiğini mobil ekranına basacaktır.










Teşekkürler...



29 Kasım 2019 Cuma

Django ORM ile rahat hayat...

Merhaba,

Bugün Django ORM yapısından bahsetmek istiyorum.



Object-Relational Mapper (ORM), veritabanı ile object oriented bir şekilde ilişki kurmanızı sağlarak işleri epey kolaylaştıran bir yapıdır. Birçok işleminizi yapmak için SQL cümlecikleri yazarak sorgular atmanıza gerek yoktur. SQL cümlecikleri arka planda Django Framework tarafından yönetilecektir.

Örnek vermek gerekirse, bir tablo yaratmak için SQL ve Django ORM üzerinde alttaki işlemleri yapmanız gerekmektedir;



Yukarıdaki gösterimdeki mutlu ve mutsuz surat ifadeleri biraz iddialı gelebilir, fakat Django ORM i kullandıkça işlerin nekadar kolaylaştığını ve sürelerin nekadar kısaldığını görmemek mümkün değil. Yeni projelerin süreleri kısalırken daha önce geliştirilmiş projeleri anlama süresi de kısalmaktadır. Tabiri caiz ise bağımlılık yapabilecek bir yapı diyebiliriz.

Django ORM yazılımcının yapması gereken birçok işlemi üzerine alırken python yazılım dilinden aldığı güç ile daha okunaklı, anlaşılabilir ve yönetilebilir bir kod yapısı sunmaktadır.

Django Framework üzerindeki "models.py" dosyası, veritabanı ve ORM işlerini yönetmek için ayrılmıştır. Oluşturulmuş örnek bir tabloyu alttaki şekilde paylaşalım. Models.py içinde tanımlanmış bu class, oluşturulacak tablo alanlarının tüm özelliklerini vermektedir. Bunların yaratılması için gereken SQL cümleciklerini, yazılımcı hiçbir şekilde görmemekte ve müdahale etmemektedir. Sadece bu class oluşturulduğunda, Django sistemi aracılığı ile veritabanında bir tablo dinamik olarak  oluşturulacaktır.

Kısaca models.py içinde her class bir tabloyu temsil etmektedir. Bu class içindeki her bir özellik ise tablo içindeki bir sütuna denk gelmektedir.


class Courses(models.Model):
    uuid = models.UUIDField(default=uuid.uuid4, verbose_name=_("Unique Identifier"), unique=True)
    coursecode = models.AutoField(primary_key=True, verbose_name=_("Kurs Kodu"))
    coursename = models.ForeignKey(CourseNames, on_delete=models.PROTECT, verbose_name=_("Kurs"))
    teacher = models.ManyToManyField(Staff, blank=True,  related_name='teacher', verbose_name=_("Öğretmenler"))
    courseroom = models.ForeignKey(CourseRoom, on_delete=models.PROTECT, verbose_name=_("Kurs Yeri"))
    credit = models.DecimalField(verbose_name=_("Kredi"), default=0.0, max_digits=3, decimal_places=1)
    student = models.ManyToManyField(Student, blank=True, verbose_name=_("Öğrenci"))
    createdon = models.DateField(verbose_name=_("Oluşturulma Tarihi"))
    createdby = models.ForeignKey(Staff, on_delete=models.PROTECT,  related_name='creatorstaff', verbose_name=_("Kaydeden Personel"))
    coursenotes = models.TextField(null=True, blank=True, verbose_name=_("Kurs Notları"))
    crs_status = models.IntegerField(choices=STD_STATUS, default=1, verbose_name=_("Kurs Statusu"))
    courseprice = models.DecimalField(verbose_name=_("Kurs Ücreti"), default=0.0, max_digits=5, decimal_places=2)

    class Meta:
        permissions = (
            ("list_course", _("List Courses")),
        )
        ordering = ['coursename', 'coursecode']
    def __str__(self):
        return "KRS-%s > %s" % (self.coursecode, self.coursename)


Mysql veritabanı üzerinde oluşturulan tabloya bakarsak, alttaki şekilde oluşturulduğunu göreceğiz.


Tablo alanlarına bakarsanız diğer tablolar ile ilişkisel yapının da bu class içinde yönetildiğini göreceksiniz. ForeignKey ve ManytoManyField ilişkileri arka planda Django tarafından dinamik olarak yönetilmekte ve yazılımcının bu anlamda da herhangi bir efor sarfetmesine gerek kalmamaktadır.

Bu tabloya sorgu atmak alttaki şekilde tek bir satırla mümkün olacaktır.


course_objects = Courses.objects.all()


Bu sorgu sonucunda tablodaki tüm satırlar course_objects içinde gelecektir. Biraz daha detaya girecek olursak. Yukarıda çekilen tüm satırlar içinde gezerek ilişkisel yapıyı da kullanarak çok detaylı veriye hiçbir sql cümlesi yazmadan erişmek mümkündür.


for course in course_objects:
    course_student_object = course.student.filter(std_no=student_id)


Kısaca yukarıda yaptığımız işlemi açıklayalım. Courses isimli kursların tutulduğu bir tablomuz mevcut. Bu tablodaki alanlardan birisi öğrencileri içeriyor. Bu öğrenciler birden fazla öğrenci bu kursu alabileceği için ManytoManyField olarak tanımlanmış durumda. Öğrenciler Student isimli başka bir tabloda tutuluyor. Elimizde Courses ve Student isimli iki tablomuz mevcut. Django ORM bu iki tablo arasındaki ilişkiyi yönetebilmek için dinamik olarak bir ara tabloyu kendisi yaratıyor. Bu tabloya "project1app_courses_student" ismini veriyor.


Oluşturulan bu tabloya baktığımızda kurs ve öğrenci ilişkilerinin nasıl yönetildiğini görebilirsiniz.


for course in course_objects:
    course_student_object = course.student.filter(std_no=int(student_id))


Böylece sadece yukarıdaki kodu yazarak veritabanından belirli bir öğrencinin hangi kurslara kayıtlı olduğunu görebiliyoruz. "Hiçbir SQL cümleciği ile sorgu yazmadan".

Courses tablosuna yeni bir satır eklemek için ise alttaki şekilde bir kod satırı yeterli olacaktı.


Courses.objects.create()

Tek bir Django sorgusu ile birden fazla object yaratmak da mümkündür. Bunun için bulk_create özelliği kullanılır.


Book.objects.bulk_create([
   Book(title="Book of Django", author=author),
   Book(title="The Django Book", author=author),
   Book(title="The Third Book", author=author),
])


Silmek için ise alttaki satır yeterli olacaktır;


Courses.objects.filter(uuid=uuid).delete()

Başka bir örnekte, kullanıcı tablosu üzerinde yeni bir kullanıcı yaratmak için ise alttaki şekilde bir kod satırı yeterli olacaktır.


user = User.objects.create_user(username=username, first_name=first_name, last_name=last_name, 
                                email=email, password=password)


user.save()


Ali kullanıcı isimli bir kullanıcı objesini veritabanından getirmek alttaki kadar kolay olacaktır.


User.objects.get(username='Ali')

Objeleri sıralama işlemini alttaki şekilde yapabiliriz.


Courses.objects.order_by('coursecode')

Yine kaç adet kurs kaydı olduğunu öğrenmek için tek satır yeterli olacaktır.


course_objects_count = Courses.objects.count()

Courses tablosundan kursları filtrelemek için ise alttaki satırı kullanacağız.


active_courses = Courses.objects.filter(crs_status=1).values("coursecode","coursename_id__name")

Birden fazla sorguyu zincirleyerek karmaşık veritabanı sorguları ve işlemleri yapmak da mümkündür. Bu konuyu başka bir yazımda ele almaya çalışacağım.