Power Apps ve Power Automate 2020 Lisans Güncellemeleri

Power Platform

Ms Flow olarak tanıdığımız iş akışı ürününün, Power BI ve Power Apps gibi Power unvanını almasını uzun zamandır bekliyorduk. Yakın zamanda ve tam da beklendiği şekilde Power Automate (Flow) adıyla Power Platform ailesine resmi olarak katıldı.

Başından beri Power Apps ve Power Automate (Flow)  birlikte çalıştığında verimliliği artıran ve işleri çok hızlandıran bir ekip. Son kullanıcılar Power Apps mobil uygulamalarıyla çalışırken; iş akışlarını ve onay süreçlerini arka planda Power Automate sessizce sürdürmeye devam ediyor.

Power Automate makalelerine link üzerinden erişim sağlayabilirsiniz.

Power Platform Ücretsiz Kullanılabilir mi?

Herhangi bir Office365 lisansınız varsa evet!

Aşağıdaki Office365 lisanslarından herhangi birine sahip olmanız durumunda Power Platform ürünlerini ücretsiz şekilde kullanabiliyorsunuz.

Power Apps ve Power Automate için 2020 Lisanslama Güncellemeleri

Premium bağlayıcıların ve Premium özelliklerin artması Flow’da yaşanacak lisanlama değişikliklerinin habercisiydi.

Flow’un Power ailesine katılması sonrası Power Apps & Power Automate lisanslamaları gündeme gelmeye başladı.

Office 365’iniz Yoksa

Katmanlı fiyatlandırma yapısına dayalı lisanslama şeklinin netleşmesiyle beraber 1 Aralık 2019 tarihinden itibaren fiyatlar geçerliliğini sürdürüyor.

Power Apps ve Power Automate’i Add-on olarak aylık ödeme biçimiyle kullanabiliyorsunuz.

Lisanslama şekli 2’ye ayrılmış durumda; kullanıcı sayısına göre ya da kullanacağınız uygulama sayısına göre maliyetleriniz belirleniyor.

1. Ödeme Modeli

Şirket içi/Bireysel olarak 2 mobil uygulama kullanmak için

Kullanıcı başına 56 TL’den fiyatlandırılmakta ve uygulama sayısı arttıkça uygulama başına maliyetler de artmaktadır.

 

2.Ödeme Modeli

Şirket içi/Bireysel olarak sınırsız sayıda mobil uygulama kullanmak için

Kullanıcı başına 224,20 TL’den fiyatlandırılmaktadır ve ek masraf bulunmamaktadır.

Detaylar için linke göz atabilirsiniz.

 

Lisanlama konusunda detaylı bilgi içeren dokümanı okumak için linke göz atabilirsiniz.

Kotlin’de Yüksek Seviye Fonksiyonlar (High Order Functions)

Merhaba

2010’da Oracle, Sun Microsystems’ı satın aldığından beri Oracle ile Google arasında bir Java savaşı sürmekteydi. Oracle, Google’ı Java’nın ücretsiz olmayan özelliklerini kullanmakla suçlayarak büyükçe bir dava açtı falan filan hikayeyi biliyorsunuzdur hepsini anlatmama gerek yok sanırım. 2 sene önce GoogleIO 2017 etkinliğinde Kotlin, Google tarafından resmi programlama dili olarak ilan  edildi. O gün bugündür Android Geliştiricileri olarak Kotlin öğreniyoruz ve öğrenmeye devam ediyoruz.

“Kotlin fonksiyonel dil özelliklerine sahiptir” cümlesini pek çok Kotlin ve Android hayranından duymuş olabilirsiniz (Ben dahil). Nedir yani bu fonksiyonel dil özellikleri hadi örnek ver hadi… diyorsanız, toplanın yamacıma. Bu yazıda, Kotlin’in fonksiyonel dil özelliklerinden birisi olan yüksek seviye fonksiyonların kullanımını anlatacağım.

Fonksiyonel dillerde, fonksiyonlar özeldir tek başlarına bireylerdir. Literatürde bu first class tabiri ile ifade edilir. Yani String, Integer veya bir Sınıf ile fonksiyonlar aynı seviyededirler. Fonksiyonlara parametre olarak String veya Integer yollayabildiğimiz gibi first class fonksiyonlara sahip dillerde parametre olarak fonksiyon da yollayabiliriz. Fonksiyona parametre olarak fonksiyon yolluyoruz yani. Aynı şekilde başka fonksiyonlardan return tipi olarak fonksiyon da döndürebiliriz. Fonksiyonlar Java’nın aksine fonksiyonel dillerde herhangi bir sınıf içerisinde yer almak zorunda değillerdir. Fonksiyon çağıran fonksiyonlara yüksek seviye fonksiyonlar ismi verilir ve fonksiyonel diller yüksek seviye fonksiyon özelliğine sahiptirler. Kotlin de doğal olarak bu özelliğe sahiptir. Ayrıca fonksiyonel dillerde fonksiyonlar veri yapılarında ve değişkenlerde tutulabilirler. Özet olarak High Order Functions, Kotlin’in gözde özelliklerinden birisidir. Şimdi önce küçük bir örnek ile daha iyi açıklayacağım. Ardından Android’de real-life kullanımını göstererek pekiştireceğim. İzninizle, Başlayalım…

 

Parametre olarak fonksiyon kabul eden bir fonksiyonun tanımlanması aşağıdaki gibi yapılır.

https://gist.github.com/alparslandev/e9bfc3f401bf71cbfa1660fa33cf5924

Bu fonksiyon, şu 5 şekilde çağırılabilir:

passMeFunction ( “text” ) { print ( it ) }
passMeFunction ( “text” ) { s -> print ( s ) }
passMeFunction ( “text” , { print ( it ) } )
passMeFunction ( “text” , { s -> print ( s ) } )
passMeFunction(“text”, ::print )  // En pratik versiyon tabiiki bu. it veya herhangi bir başka değişkene gerek kalmaksızın Fonksiyon Referansı kullanarak kodu daha da basitleştirebiliriz.

KISS : Keep It Small Stupid hell yeeaa

 

Ben açıkçası bu özelliğe ihtiyaç duyduğumun farkında bile değilmişim. Kullanmaya başladığımda farkettim ki pek çok yerde high order function kullanabilirim.Özellikle orta ve daha büyük ölçekte bir proje yazarken pek çok defa aynı koda başka Activitylerde Fragmentlarda Sınıflarda ihtiyaç duyarsınız. Bu normaldir. Mesela kullanıcı silme işlemi kullanıcı listesinden de gerçekleşebilir kullanıcı detay sayfasından da. Ancak kopyala yapıştır yapmaya başlarsanız büyük projede ilerleyen safhalarda boğulabilirsiniz. Çöp kod üretebilirsiniz ve kod yönetimini kendi elinizle zorlaştırabilirsiniz. Her projeyi başından düzgün yazmanızı öneririm ki ilerleyen zamanda refactor için çok daha fazla zaman harcamanız gerekmesin.

Kullanım Örneği

Real-life örneğe gelirsek. Peakup’ta çalışanların hızlıca izin alabilmelerini, izin sürecini takip edebilmelerini, takım liderlerinin ve insan kaynaklarının da izin süreçlerini kolayca yönetebilmelerini sağlayan bir Android uygulamamız var. Leave Management. Bu uygulamamızı yazarken bir sorunla karşılaştım. İzin silme, izin onaylama ve izin reddetme işlemleri için hemen hemen aynı fonksiyonu yazdığımı ve gereksiz kod tekrarı yaptığımı farkettim. 3 operasyonda da İzin detay DialogFragment’ını önce kapatıp sonra silmek / reddetmek / onaylamak istediğinize emin misiniz? diye soran bir dialog çıkartıyordum. Kullanıcı onay butonuna basınca da ilgili fonksiyon aracılığı ile backende request yolluyordum. Yazılan fazladan kodu farkettiğimde High Order Function özelliği geldi aklıma. Çünkü 3 fonksiyonda da sadece Dialog’da yazan text ve çağırılan request fonksiyonu farklıydı. Ve şöyle bir Fonksiyon yazdım:

https://gist.github.com/alparslandev/eb148a5b847bec635dd855b04fd5d90f

showAlertAndOperate ismini verdiğim bu fonksiyon, 3 adet parametre alıyor. İlk parametresi bir Int ancak annotation olarak StringRese sahip. Yani bu fonksiyona göndereceğiniz ilk parametre R.string.xxx gibi bir string id olacak. İkinci parametre bir leave objesi. Son parametre ise işlemi yapacak olan fonksiyon. Son parametrede eğer izin silme işlemi yapacaksak izin silme requestini yapan fonksiyon, izin onaylama işlemi yapacaksak onaylama requestini yollayan fonksiyon çağırılacak yani.

showAlertAndOperate fonksiyonu önce izin detay dialog fragmentını kapatıyor. Ardından normal Dialog içerisinde gösterilecek olan texti StringRes ve Leave parametrelerini kullanarak hazırlıyor. Ardından bu texti showAlertDialog fonksiyonuna yollayarak Global alertdialogun çıkmasını sağlıyor. Dialogun onay butonuna basıldığı takdirde ise fonksiyona parametre olarak gönderilen fonksiyon çalışıyor.

https://gist.github.com/alparslandev/6eeeef8a852b3f07f51907aea2092dba

 

Yukarıda gördüğünüz fonksiyonlar ise İzin detay dialog fragmentına ait interface içerisinde bulunan buton onClick işleminde çalışan callbackler. Gördüğünüz üzre onLeaveApprove‘da confirmLeave fonksiyonu accepted modunda, onLeaveDecline‘da confirmLeave fonksiyonu declined modunda çağırılmış. onDelete’te ise deleteLeave() fonksiyonu çağırılmış. showAlertAndOperate fonksiyonunda belirtilen func() fonksiyonu yerine bu fonksiyonlar çağırılacak.

Kodu kopyala yapıştır yapmamak için tabiiki pek çok farklı yöntem de mevcut. Bu yazıda bu yöntemlerden sadece birinden bahsedebildim. En güzel yöntem budur golden keydir gibi iddialara sahip değilim. Sadece bu seferlik bunu tercih ettim ve sizlerle paylaşmak istedim.

Bol kodlu günler dilerim.

Xamarin Forms Caching Strategy with Monkey Cache🐒

Today, we will learn caching technology in Xamarin.Forms as Monkey Cache.
Sometimes we need to store data in the application that we develop. For example, HTTP requests, configurations, settings, databases etc.
I need to store HTTP requests for a while during work on a project. I found Xamarin monkey cache while I search about caching strategies in that way.

What is monkey cache?

Monkey cache is a simple way to store any type of data. It supports SQLite-net, LiteDB, and a simple File Store. Monkey Cache is built against .NET Standard 2.0 and that means it is not just using with the mobile applications; it can use in any .NET projects.

How to use?

First of all, let’ s install Monkey Cache in our project from NuGet packages. You can use any file storage type in your project.

I prefer FileStore for this project. I install MonkeyCache 0.1.0.10-beta, MonkeyCache.FileStore 0.1.1.10-beta.

Data is stored in a “Barrel” or IBarrel. Don’t forget to give an application id on the barrel before storing data.

Barrel.ApplicationId = "your_unique_name_here";

If you want to do user-based cache, you can use some code like this:

Barrel.ApplicationId = "your-app-name" + UserId + DateTime.Now;

Caching a Web Request

Http request caching is very easy with Monkey Cache. We can set the expire time easily in this way:

Think like this scenario; I want to store the results of HTTP requests while if the user connected to the internet. I want to take these data from this cache if the user didn’t connect the internet and cached data didn’t expire. Now let’s take a look at the example:

https://gist.github.com/HilalSener/06f858271a13dc42b7130bd9ab3d63b5

We have seen together how to use Monkey cache today. Easy, right? You can use it over any caching scenario. Follow sample project here.

Happy Coding 🙂

You can find Monkey Cache Github source here.

You can find my previous article on Xamarin here.