Ezgi Vanlı

Power BI, Microsoft’un geliştirdiği iş zekası araçlarından bir tanesidir. Elimizdeki veri üzerinde düzenleme, temizleme, analiz etme ve görselleştirme gibi işlemler yapmamızı sağlar. Basit ve sade bir arayüzü vardır. Teknik bilgisi yüksek olmayan kullanıcılarında rahatlıkla kullanabileceği şekilde tasarlanmıştır.

Power BI Bileşenleri

Power BI 3 bileşenden oluşur. Bunlar sırasıyla; Power BI Desktop, Power BI Service ve Power BI Mobile’dir

Desktop : Windows işletim sistemlerinde çalışan, kullanıcının veri kaynaklarına bağlanma, veri seti oluşturma, rapor hazırlama gibi işlemler yapabilmesini sağlayan local bir uygulamadır.

Service : Desktop üzerinde yaptığımız işlemleri web tarayıcılarını kullanarak yapmamızı sağlayan uygulamadır. Desktop’daki bir çok özellik Service’de de kullanılabilir (Rapor oluşturma, kaynaklara bağlanma, kaynakları yönetme vb.), ancak veri seti oluşturma gibi bazı işlemler sadece Desktop uygulamasında yapılabilmektedir. Service uygulamasında sadece Desktop’da üretilmiş hazır veri setlerine bağlanma işlemi yapılabilmektedir.

Mobile : Power BI Servisinde yayımlanan raporları görüntülememize yarayan mobil uygulamadır. Bu uygulamada sadece veri görüntüleme işlemi yapılabilir.

Lisans Türleri

Free, Pro ve Premium olmak üzere 3 farklı lisans tipi bulunmaktadır. Bu lisansların satın alınması ve kullanıcılara atanması portal ofis’te yapılır. (Portal.office.com)

Ücretsiz (Free) Lisans: Herhangi bir ücret ödemenizi gerektirmeyen, kişisel kullanıma daha uygun olan lisans tipidir. Free lisans uygulamaya herhangi bir teknik kısıt getirmez. Fakat bulutta yayınlanmış raporlarınızı başkalarıyla paylaşmak istediğinizde Pro lisansa ihtiyaç duyulmaktadır.

Pro Lisans: Eğer bir rapor setine belli bir kullanıcı grubunun farklı güvenlik seviyelerinde ulaşması gerekiyorsa, kullanıcılar arasında rapor ve dashboard paylaşılması gibi ihtiyaçlar varsa, rapor setinin otomatik olarak kendiliğinden güncellenmesine günde birden fazla ihtiyacınız varsa, rapor setinin verisini çektiği veri kaynakları Pro lisansı gerektiren bir veri kaynağı ise (örneğin SQL Server Analysis Server) “Pro” lisansını kullanmalısınız.

“Pro” lisansının mevcut durumda kullanıcı başına aylık yaklaşık 10$ gibi bir maliyeti var. Pro lisansını “trial” modunda 60 gün ücretsiz olarak deneyebilirsiniz. Free ve Pro lisansı arasındaki farklar zaman zaman değişebiliyor, fakat bu farkların tamamının bulut servisindeki raporların paylaşımı, erişimi ve yenilenmesiyle ilgilidir. Yani, veri modelleme ve raporlama tarafında yapabileceklerimiz free ve pro versiyonda aynıdır. Pro versiyonda Sadece bulut tarafında bazı ek özellikler bulunmaktadır. Free ve Pro versiyon arasındaki farklar için buraya göz atabilirsiniz.

Premium Lisans: Raporlara erişecek kullanıcı sayısı 500 ve üzerindeyse, bulut servisinin yanısıra Power BI’ı on-premise’de de kullanmak gibi bir ihtiyaç varsa Premium lisansını değerlendirebilirsiniz. Premium lisans, bulutta size özel ayrı bir powerbi.com servisi çalıştırmaya benzer, paylaşımlı değil, sadece size ait bir kapasiteyi satın alır ve kullanırsınız. Premium lisans, hem bulutta size ait bir kapasite oluşturur, hem de on-premise’de, yani lokalde kendi “Power BI On-Prem Report Server”’ınızı kurmanıza müsade eder. Eğer buluta çıkmakla ilgili regülasyonlara tabii iseniz Premium lisansını kullanabilirsiniz. Güncel soruların cevapları için buraya bakabilirsiniz.

Author: Deniz Alkan

Geçtiğimiz hafta React Ekibi tarafından paylaşılan bir makale; komünite ve UI geliştiricileri tarafından oldukça heyecanla karşılandı. Bu heyecanın nedeni de; genel olarak UI kütüphanelerinin çalışma prensiplerinin yarattığı en büyük problemlerden birisinin ortadan kaldırmak adına yapılan çalışmalar. “Blocking Rendering” olarak isimlendirilen problem, React’ın yeni bakış açısıyla tasarladığı “Concurrent Mode” ile ortadan kalkıyor. Peki, “Blocking Rendering” nedir, “Concurrent Mode” bu problemi ortadan nasıl kaldırıyor? Birlikte inceleyelim.

Blocking Rendering

Günümüzde UI kütüphaneleri, tarayıcıyı senkronize şekilde günceller. Örneğin bir ekranı açmak istediğimizde, UI kütüphanesi DOM’daki bu değişiklikleri ekrana tek seferde yansıtmak ister. Örneğin içerisinde liste olan bir ekranı açmak için, liste componentini render etmeye başlar, bu render işlemi bitene kadar da ekranda başka hiçbir şey yapılmaz. Şimdi bu listenin 500.000 elemanı olduğunu düşünelim. Ekranda herhangi bir etkileşim yaratabilmek için, maalesef bu listedeki tüm elemanlar render olana kadar beklemek zorundayız.

Peki bu listenin üzerine bir de filtre eklediğimizi düşünürsek ne olur? Filtrenin çalışacağı text input içine yazdığımız herhangi bir harfin gözükmesi için, bu devasa bekleme süresi tekrar devreye girer. Bu bekleme ve ekranda beliren sürekli takılarak çalışma hissi, kullanıcı deneyimini tamamen olumsuz bir algıya dönüştürebilecek problemler silsilesine yol açmış olur.

Interruptible Rendering

Bu problemleri şimdiye dek hiç yaşamadık mı ya da görmemezlikten mi geldik? Tabii ki hayır. Bir şekilde bu problemleri “halı altına süpürmek” için hali hazırda “Debouncing” ve “Throttle” gibi yöntemleri kullanıyorduk. Bunların ne olduğuna değinecek olursak; birden fazla yapılan sıralı fonksiyon çağrılarını teke indirmek için kullandığımız yöntem Debouncing, fonksiyon çağrısını etkileşimden bir süre sonra(delay) yapmak için kullandığımız yöntem de Throttling oluyor. Fakat bu yöntemler, filtre için text input içerisine bir şeyler yazarken listenin aynı kalmasının ya da gücü sınırlı cihazlarda takılma, bekleme gibi sorunların devam etmesinin önüne geçemiyor.

Çünkü rendering başladığı andan itibaren sonuna dek kesilemiyor. Bu nedenle text input içine yazdığımız harf her dokunuşta güncellenemiyor. Hangi UI kütüphanesini kullanırsanız kullanın, eğer kütüphane blocking rendering kullanıyorsa, büyük oradanki componentlerin yaşattığı bu sıkıntının da çözümü de kolay olmuyor.

Bu sorunlarla baş etmekte zorlanan Facebook ekibi, artık React kütüphanesinde Concurrent Mode ile kütüphanenin temelindeki limitlemeleri ortadan kaldırarak rendering’i interruptible hale, yani önceliklere göre araya girebilecek hale getiriyor.

Concurrent Mode

Önceliklerimiz önemlidir.

Concurrent ModeReact tarafından;

Concurrent Mode is a set of new features that help React apps stay responsive and gracefully adjust to the user’s device capabilities and network speed.” şeklinde açıklanmış. Bu tanımı, “React uygulamasını, kullanıcının cihaz yetenekleri ile ağ hızına göre her zaman cevap verebilir ve detaylıca ayarlanabilir hale getirecek özellikler seti.” olarak çevirsek sanırım hatalı olmaz. Concurrent Mode’u anlamaya çalışırken; teorik ve okunduğunda aslında çok da bir şey ifade etmeyen bu tanımdan ziyade, “önceliklendirme” kavramı ile birlikte düşünmenizi tavsiye ederim.

Yazının başında da bahsettiğim gibi Concurrent Mode olmadan React, tamamen bitene kadar rendering işine devam ediyordu ve rendering bitmeden diğer işlere sıra gelmiyordu.

Concurrent Mode ile React ise, hali hazırda rendering işi devam ederken eğer daha öncelikli bir iş gelirse, mevcut rendering’i kesebiliyor. Öncelikli işi araya alıp, bitirdikten sonra da rendering’e devam edebiliyor duruma geliyor. Yani bir bakıma, tamamen senkron yapıdan, asenkron olabilen bir rendering algoritması bizi bekliyor.

Bu öncelikli işler neler olabilir?

Bununla birlikte, başka bir önemli özellik daha var. Aslında o da günümüzdeki bir çok UI kütüphanesinin davranış biçimlerinden birisine efektif çözüm oluyor. Örneğin kullanıcı “Ana Sayfa” üzerinde beklerken, “Siparişlerim” butonuna tıklayarak o ekrana gitmek istiyor. Kullanıcı, bu sırada geliştirici ekibin kararına göre 2 farklı davranıştan birini görüyor. Uygulama ya kullanıcıya tüm bilgiler gelmeden örnek bir boş sayfa gösteriyor, ya da bilgilerin yavaşça dolmasını sağlayarak ekranın kullanıcı görürken şekillendiriyor.

React’ın yeni Concurrent Mode’u ile artı kullanıcı butona bastığı anda bellekte gidilmek istenen sayfayı render ederken, kullanıcı hali hazırda bulunduğu sayfada kalmaya devam ediyor. Ne zaman servis çağrıları ve resim yüklemesi gibi zaman alan işler biterse, kullanıcıya diğer sayfayı tamamen dolu haliyle o zaman açıyor. Bu sayede kullanıcı hiçbir zaman önünde şekillenen bir sayfa görmüyor. Bununla birlikte sayfa içerisinde “Loading” imajı da eklenirse, sorunsuz bir kullanıcı deneyimi halini almış alıyor. Bu sayede uygulamanın akışı ve cevap verebilirliği büyük ölçüde artıyor.

Bu günümüz koşullarında başka çözüm yolları ile yapılabilir olsa da, yönetimi zor ve karmaşık olan bir hale gelebiliyor. React Concurrent ModeReact içerisinde built-in yani dahili olarak gelerek bu sorunları merkezde çözmeyi hedefliyor.

Kod Örneği

import {
useState,
commonUpdate,
urgentUpdate
} from "sample-react";

function SlowAndLowPriorityComponent() {
const [someData, changeData] = useState(0);
return (
<div>
<BigComponentThatTakesVeryLongToRender someProp={someData} />
<button
onClick={() => {
commonUpdate(() =>
changeData(prevData => prevData + 1)
);
}}
>
Uzun süren ve düşük öncelikli güncelleme
</button>
</div>
);
}

function FastAndHighPriorityComponent() {
const [someData, changeData] = useState(0);
return (
<div>
<SmallComponentThatRendersFast someProp={someData} />
<button
onClick={() => {
urgentUpdate(() =>
changeData(prevData => prevData + 1)
);
}}
>
Hızlı ve acil güncelleme
</button>
</div>
);
}

function App() {
return (
<div>
<SlowAndLowPriorityComponent />
<FastAndHighPriorityComponent />
</div>
);
}

// Eğer kullanıcı önce SlowButLowPriorityComponent butonuna,
// ve sonrasında FastAndHighPriorityComponent butonuna tıklarsa;
// React SlowButLowPriorityComponent'inin renderingini durdurup,
// FastAndHighPriorityComponent'inin renderingini (yeni state ile)
// tamamlar. Sonrasında SlowButLowPriorityComponent değişikliğine
// devam eder.

Concurrent Mode’a Ne Denli İhtiyacımız Var?

Genel olarak altyapısal bir yeni özellik olan Concurrent Mode için, bana kalırsa React tabanlı uygulamaların çoğu en azından aciliyetli olarak kullanım gereksinimi duymayacak. Yani zorunlu bir güncelleme ya da kullanım zorunluluğu duyulmayacak.

Ama uygulamasını ihtiyaçlarına göre, kütüphanenin gücünü de arkasına alarak daha güçlü hale getirmek isteyen herkes için önemli bir özellik. Sonuç olarak state yönetimini asenkron hale getirmek için müthiş bir yenilik. Özellikle içerisinde sayfa sayısı ve işlem seti çok geniş olan kurumsal uygulamalar için oldukça verimli bir yaklaşım olması muhtemel.

Kütüphanenin oldukça “advanced” olan bu yeni özelliğinin, tamamen Facebook’un ihtiyaçları dolayısıyla geliştirildiğini de belirtmek lazım. Bu özelliğin komünite ile paylaşılması da oldukça sevindirici.

Özetlemek Gerekirse

React Concurrent Mode, artık eş zamanlı olarak birden fazla state güncellenmesine olanak tanıyor.

Concurrency;

şeklinde yorumlanabilir.

Henüz herhangi bir React versiyonunda yer almayan bu yeni özelliğin, hangi versiyonla birlikte kullanılmaya başlanacağı tarihle ilgili bilgi de paylaşılmadı. Bu nedenle nihai bir sonuç olmadığı için, önümüzdeki süre zarfında altyapısında ve bazı yaklaşımlarında değişiklikler olması da muhtemel.

Kaynaklar:

Author: Efecan Tekin

React ekosisteminde olanların bildiği üzere Şubat 2019’daki 16.8 versiyonuyla birlikte kancalar(hooks) hayatımıza girdi. Aslında bu tarihten önce alfa sürümü yayınlanmış ve komüniteden olumlu yorumlar almıştı. Herkes yana yakıla kancaları bekler olmuştu. Ben de birkaç deneme yapıp, beğenmiş ve sıradaki ilk gerçek projede kancaları kullanma konusunda heyecanlanmıştım.

Yazının aslında birincil amacı öğretici olmak ve kancaları(hooks) nasıl kullanırsınızı göstermek değil. Neden mi? Çıktığı günden beri o kadar çok yazı yazıldı, konferanslarda anlatıldı ki, hook anlatmayanı dövüyorlar sanırsınız 🙂 O yüzden proje sürecindeki tecrübeleri ön planda tutan bir yazı var karşınızda. Yine de giriş gelişme açısından bilgilendirici kod parçacıkları da olacak. O zaman başlayalım!

İlk olarak, react kütüphanesini kullanarak eskiden bu yana hangi biçimlerde durumu(state) olan bileşen(component) oluşturabildiğimize bakalım. Herhangi bir durum bilgisi içermeyen bileşenlerin zaten yazım esnasında fonksiyondan pek farkları yok.

ES6(Ecmascript2015) ve React’ın 16. versiyonundan önce React.createClass ile bileşen oluşturulabiliyordu:

var ES5Bilesen = React.createClass({
getInitialState: function () {
return { durum: "karışık" };
},
componentDidMount: function () {
console.log("bileşen takıldı!");
},
render: function () {
return <div>{this.state.durum}</div>;
}
});

Bu metod 16. versiyon ile birlikte ana react paketinden çıkarıldı ve artık sadece ayrı paket(create-react-class) olarak kullanılabiliyor.

ES6 ile birlikte Javascript’te classconstructorextends gibi anahtar kelimeleri de kullanabilir hale geldik. React’ın da popülerlik kazandığı bu süreçte durum bilgisi içeren(stateful) bileşenleri yazım yöntemimiz şu şekilde oldu:

class ES6Bilesen extends React.Component {
constructor (props) {
super(props);
this.state = { durum: "karışık"};
}
componentDidMount () {
console.log("bileşen takıldı!");
},
render () {
return <div>{this.state.durum}</div>;
}
});

Şimdi ise kancaları kullanarak sadece fonksiyon yazarmış gibi durum saklayabildiğimiz bileşenler oluşturabiliyoruz:

const KancaBilesen = () => {
const [durum, durumYaz] = useState("karışık");

useEffect(() => {
console.log("bileşen takıldı!");
}, []); return <div>{durum}</div>;
};

Hemen tüm kodları yeniden yazma isteğine kapılsak da sınıf(classsözdizimi(syntax) ile react bileşeni oluşturmak yakın zaman içerisinde tarihe karışmayacak. React ekibi geriye dönük desteğin şimdilik süresiz devam edeceğini belirtti.

Gelelim yeni ışıltılı (✨) özelliğimizin bize ve projelerimize faydalı olabileceği noktalara:

Kancalardan önce(solda) ve sonra(sağda)

Geçiş öncesinde kendimizi bu konuda ikna ettiğimize göre artık belli başlı yapacağımız şeyler var:

Kancalar hakkında nedir, nasıl kullanılır bilgisini bilerek pek fazla vermedim. Mesela useCallback ‘ten ve useMemo ‘dan hiç bahsetmedim. Çünkü hem Türkçe hem İngilizce olarak react’ın kendi dökümanında gayet açıklayıcı. Ve evet, herkes react hook nasıl kullanılır yazısı yazıyor (ben dahil!).

Son olarak zaman içerisinde sık kullandığımız yan kütüphaneler de kanca(hook) desteklerini eklediler:

Hala hook desteği gelmemiş bağımlı paketleriniz olma ihtimali var. Yapılabilecekler; o projeye katkıda bulunmak, Github üzerinden darlamak veya sadece beklemek.

Bu noktaya kadar okumaya üşenmeyenler react’ın kancasına tutulmuş demektir. React’lı günler!

Author: Özgün Bal

Deno v1.0.0 kararlı resmi sürümü, dün yani 13 Mayıs 2020 itibariyle yayınlandı. Peki Deno tam olarak nedir? Yazılım geliştirme süreçlerinde nasıl bir misyon üstlenecek? NodeJS’in yerini tamamen alabilecek mi? Hadi birlikte inceleyelim.

Deno, güneş gibi doğarken ardından tepelerin…

NodeJS’in de yaratıcısı olan Ryan Dahl, 2018 yılında Berlin’de düzenlenen JSConf EU sahnesinde bir konuşma ile yer almıştı. Konuşmasını NodeJS’te yanlış olduğunu düşündüğü en önemli 10 konu üzerine hazırlayan Ryannode_modules ve değişmesi mümkün olmayan legacy API’lar ile ilgili endişelerini dile getirmişti. NodeJS’in yayınlandığı günden bu yana JavaScript’in çok değiştiğine dikkat çekmişti. Tarayıcılar ve sunucu tarafıyla uyumlu olabilecek, güvenlikle ilgili tüm sorunların üstesinden gelebilecek daha iyi bir NodeJS yaratmanın mümkün olabileceğini anlatmıştı. Konuşmasının sonunda ise Deno isimli projesinden bahsetmişti.

Ryan’ın bu konuşmasının üstünden tam olarak 2 yıl geçti. Bu süre içerisinde projeye çok fazla geliştirici dahil oldu, GitHub’da Mayıs 2020 itibariyle 50k yıldız sayısı geçildi. Dün itibariyle de Deno ismi verilen proje, 1.0.0 versiyonu ile resmi olarak yayınlandı.

Javascript’in Gelişimi & Deno

JavaScript, 2009 yılında NodeJS için yararlı olabilecek bazı özelliklerden yoksundu. Bu özelliklerden bazıları bir kaç yıl içerisinde ECMAScript standartlarının birer parçası olarak JavaScript’e eklenirken, bazıları da TypeScript ile ele alınmıştı. Bu özelliklerden bazılarının üstünden geçelim.

JavaScript’te eventler ve callbackler her zaman var olsa da, işin içine async eylemleri birbirine bağlamak girdiği zaman kod oldukça karmaşık bir hal alabiliyordu. Promiseler, bu kodun karmaşıklığını kaldırarak daha okunaklı hale getirdi. Promisecallbackleri fonksiyona geçirmek yerine attach edebildiğimiz, async bir işlemin başarılı ya da başarısız sonuçlandığını döndüren bir objedir. Fonksiyonu async tanımlamak syntax’ı basitleştirirken, fonksiyon içerisinde await kullanılıp promise işlevini yerini getirinceye kadar (non-blocking şekilde) durulmasını sağlar.

NodeJS oluşturulduğunda, JavaScript modülleri için gayriresmi standart olarak CommonJS görülüyordu, ki CommonJS npm tarafından destekleniyordu. Sonrasında ECMAScript Komunitesi tarafından, ismi ES Modules olan resmi standartlar belirlendi. ES Modules, jspm ve Deno tarafından da destekleniyor.

Binary data işlemek için kullanılan bir ES6 API’ı olan Typed ArraysNodeJS tarafından desteklenmediği için tasarım açısından bazı problemlere yol açmıştı. Deno ise ham binary data işleme ihtiyacı olduğunda typed arrays kullanıyor.

TypeScript, düz JavaScript’e (ES3 veya üstü seçilebilir) derlenen JavaScript’in üst kümesidir. TypeScriptJavaScript’e isteğe bağlı türler, sınıflar ve modüller ekler, büyük ölçekli JavaScript uygulamaları için araçları destekler. (Anders Hejlsberg ‘in deyimiyle’ “ölçeklenen JavaScript”) Daha önce de belirtildiği gibi Deno, runtime’ın bir parçası olarak TypeScript derleyicisinin bir image’ını içerir. Bir TypeScript dosyasını Deno’ya iletirseniz, önce dosyayı JavaScript’e derler ve sonra bunu V8 motoruna geçirir.

Bahsettiklerimin yanlış anlaşılmasını istemem. Sonuçta NodeJS hem komunitesi hem de işlevi ile oldukça başarılı bir JavaScript runtime’ı. Ama Ryan’ın belirttiği gibi, hiç kimse bu platformun bu kadar kısa bir sürede ne kadar büyüyeceğini tahmin edemezdi. Ayrıca, 2009’da JavaScript hala herkesin eğlendiği tuhaf küçük bir dildi ve bahsetmiş olduğum gibi şimdiki özellilerin çoğu henüz yoktu.

Deno Nedir?

Detaylı şekilde bahsettiğimiz “Advanced JavaScript” olarak nitelendirebileceğimiz konular ve NodeJS’in yaşattığı bazı problemlere değindikten sonra, hep birlikte Deno’nun ne olduğuna doğru ilerleyebiliriz.

DenoGoogle’ın açık kaynaklı yüksek performanslı JavaScript motoru olan V8‘i kullanan; JavaScript ve TypeScript için basit, modern ve güvenli bir runtime’dır.

Deno;

Kullanılarak oluşturulmuştur.

Deno özetle;

Sonuçta hem NodeJS hem de Deno’yu tasarlayan Ryan’a göre, NodeJS üç önemli tasarım sorunundan muzdaripti:

Deno her üç sorunu da düzeltir.

Özellikler

Güvenlik

Deno’nun odaklandığı en önemli konulardan birisi kuşkusuz güvenlik sorunlarıydı. Bu nedenle DenoNodeJS’in aksine kodu varsayılan olarak Sandbox üstünde çalıştırır. Bu da runtime’ın aşağıdakilere erişimini kısıtlar;

İzin sisteminin nasıl çalıştığına bir göz atalım.

(async () => {
const encoder = new TextEncoder();
const data = encoder.encode('Merhaba Dünya\n');

await Deno.writeFile('hello.txt', data);
await Deno.writeFile('hello2.txt', data);
})();

Komut dosyası, içinde “Merhaba Dünya” mesajı bulunan hello.txt ve hello2.txt adlı iki metin dosyası oluşturur. Kod bir sanal alan içinde yürütülür, bu nedenle dosya sistemine erişimi yoktur.

Ayrıca NodeJS’te yaptığımız gibi fs modülü yerine Deno namespace’ini kullanıyor olduğumuz da gözlerden kaçmasın. Deno namespace’i birçok temel yardımcı işlev sağlar.

Uygulamayı aşağıdaki gibi çalıştırdığımızda:

deno run write-hello.ts

Aşağıdakiler şekilde bir soru sorar:

⚠️Deno requests write access to "/Users/user/folder/hello.txt". Grant? [a/y/n/d (a = allow always, y = allow once, n = deny once, d = deny always)]

Sanal alandan gelen her çağrı için izin istenmesi gerektiğinden, aslında iki kez istenir. Tabii ki ilk soruya ‘Her zaman izin ver’ seçeneğini seçersek, bir daha sorulmayacaktı. deny seçeneğini seçersek ise, PermissionDenied hatası atılır ve hatayı işlemek için bir kodumuz olmadığından işlem sonlandırılır.

Komut dosyasını aşağıdaki komutla çalıştırırsak:

deno run --allow-write write-hello.ts

Bu, kodunuzun klasöre yazmasına izin verir ve bir güvenlik istisnasına sahip olursunuz, herhangi bir soru sorulmadan her iki dosya da oluşturulur. Bu, diğer platformların güvenliği nasıl ele aldığına benzer. Android kullanıcısıysanız, daha önce pek çok uygulama tarafından telefonunuzdaki farklı sistemlere (yani kişiler, telefon görüşmeleri, klasörler vb.) erişmelerine izin vermeniz istenmiştir. Burada da aynı konsept uygulanabilir. Erişim izni alınması gereken konularla ilgili flagleri, komut dosyanızı yürüten komut satırının bir parçası olarak kullanarak, kodunuzun gerektirdiği izinleri sağlarsınız.

Dosya sistemi için — allow-write işaretinin yanı sıra, ağ isteklerini etkinleştirmek, ortama erişmek ve alt işlemleri çalıştırmak için — allow-net— allow-env ve — allow-run flagleri de vardır.

Modüller

Deno, modülleri tıpkı tarayıcılar gibi URL’ler ile yükler. Çoğu kişi bu yöntemi ilk gördüğünde kafası karışmıştı ama bana kalırsa oldukça mantıklı.

import { assertEquals } from "https://deno.land/std/testing/asserts.ts";

Paketleri URL’ler ile import etmenin en önemli yanı nedir? Cevabı tahmin etmek çok da zor olmasa gerek. Deno paketleri, URL’ler ile npm’de oldukça fazla sorun yaratan merkeziyetçilikten(tamamı JSConf 2019’da anlatılmıştı) vazgeçerek dağıtık olarak kulllanılabilir.

Kodu URL yoluyla import ederek, paket oluşturucuların kodlarını uygun gördükleri her yerde barındırmasını mümkün kılıp; merkezin yokluğunun keyfini çıkarıyoruz. Müjde! Artık package.json ve node_modules yok.

Uygulamayı başlattığımızda, Deno içe aktarılan tüm modülleri indirir ve önbelleğe alır. Önbelleğe alındıktan sonra Deno, özellikle — reload flagiyle istenmedikçe, onları tekrar indirmeyecektir.

Merkezi kayıt olmadığından, modülü barındıran web sitesinin erişebilirliği önemlidir. Bu web sitesi birçok nedenden dolayı erişilemez olabilir. Bu da geliştirme sırasında, hatta daha da kötüsü üretim ortamında da bir risk barındırır.

Daha önce de belirttiğimiz gibi, Deno indirilen modülleri önbelleğe alır. Önbellek yerel diskimizde depolandığından, Deno’nun yaratıcıları sürüm kontrol sistemimizde (yani git) kontrol etmenizi ve repository’de tutulmasını önerir. Bu şekilde, web sitesi kapansa bile, tüm geliştiriciler indirilen sürüme erişebilir.

Deno, önbelleği $DENO_DIR ortam değişkeni altında belirtilen dizinde saklar. Değişkeni kendimiz ayarlamazsak, sistemin varsayılan önbellek dizinine ayarlanır. $DENO_DIR’i yerel depomuzda bir yere ayarlayabilir ve sürüm kontrol sistemine bakabiliriz.

Sizin de düşündüğünüz gibi, bence de URL’leri sürekli yazmak çok sıkıcı olurdu. Neyse ki, Deno bunu yapmamak için bize iki seçenek sunuyor.

İlk seçenek, içe aktarılan modülü aşağıdaki gibi yerel bir dosyadan yeniden dışa aktarmaktır:

export { test, assertEquals } from "https://deno.land/std/testing/mod.ts";

Diyelim ki yukarıdaki dosyaya local-test-utils.ts deniyor. Şimdi, ya test ya da assertEquals işlevlerinden tekrar yararlanmak istiyorsak, şu şekilde referans verebiliriz:

import { test, assertEquals } from './local-test-utils.ts';

Dolayısıyla, modülün bir URL’den yüklenip yüklenmediği önemli değildir.

İkinci seçenek ise, bir JSON dosyasında belirttiğimiz bir import map oluşturmaktır:

{
"imports": {
"http/": "https://deno.land/std/http/"
}
}

Ve sonra şu şekilde içe aktarabiliriz:

import { serve } from "http/server.ts";

Çalışması için, Deno’ya — importmap bayrağını ekleyerek import map’inden bahsetmeliyiz:

deno run --importmap=import_map.json hello_server.ts

Versiyonlama, paket sağlayıcı tarafından desteklenmelidir, ancak istemci tarafından URL’deki sürüm numarasını şu şekilde ayarlamanız gerekir: https://unpkg.com/liltest@0.0.5/dist/liltest.js.

Uyumluluk

Deno, tarayıcı uyumlu olmayı hedefler. Teknik olarak, ES modüllerini kullanırken, uygulamamızı bir tarayıcıda kullanıma hazır hale getirmek için webpack gibi herhangi bir derleme aracı kullanmamız gerekmiyor.

Bununla birlikte, Babel gibi araçlar kodu JavaScript’in ES5 sürümüne aktararak ve sonuç olarak kod, dilin en yeni özelliklerini desteklemeyen eski tarayıcılarda bile çalıştıracak hale getirebilir. Ancak bu, son dosyaya çok fazla gereksiz kod ekleme ve çıktı dosyasını şişirme anlamına da geliyor.

Bu nedenle ana hedefimizin ne olduğuna karar vermek ve buna göre seçim yapmak gerekmektedir.

TypeScript Desteği

Bunu doğru okudunuz, eğer TypeScript fanıysanız, o zaman Deno sizin gönlünüzü fethedecektir. Çünkü TypeScript kullanmak için ekstra bir işleme gerek yok. Varsayılan olarak JavaScript’e çeviri dahili olarak yapılır, bu yüzden TypsScript’i nasıl kullanacağızla ilgili endişelenmenize de gerek yok.

Deno varsayılan hali hazırda ayar setine sahip olsa da, kendi tsconfig.json dosyanızı kullanarak ayarları kişiselleştirebilirsiniz:

deno run -c tsconfig.json [your-script.ts]

Dahası?

Deno’nun dahil ettiği; test runner, hata ayıklayıcı, dosya izleyici ve diğerleri gibi başka özellikleri de var. Fakat yine de, bunlardan bazıları sadece dil tarafından sağlanan API’lardır ve bunları kullanmak için kendi araçlarınızı kodlamanız gerekir.

Örneğin Nodemon’a benzer bir çözüm arıyorsanız, Deno.watchFs tarafından size sağlanan dosya izleme API’ını kullanarak kendiniz oluşturmanız gerekir. Benzer bir sorunu çözen 23 satırlı bir komut dosyası şöyle görünür:

Github’da konuyla ilgili bir repo bulunmakta. Detaylarını incelemek için tam kodu burada bulabilirsiniz.

Deno, yakında NodeJS’in yerini alabilecek mi?

Bazılarımız, v0.10 civarında olduğu günlerde NodeJS’i kullanmaya başladık ve production ortamında kullanıyorduk! Okuduğunuzda çılgınla geliyor olabilir, haklısınız. Ama inanın başka bir alternatifimiz yoktu. PHPPython ve hatta Ruby (Java veya .NET değil), JavaScript ve back-end’de async I/O modeliyle all-in-one bir çözümle karşılaştırılamazdı. Buna ek olarak, tüm bu yıllar boyunca, NodeJS (ve JavaScript) endüstrinin gereksinimlerini karşılamak için sürekli gelişti. Mükemmel konuma erişti mi? Tabii ki hayır! Ancak hayattaki her şey gibi, programlama dilleri de mükemmel değil.

Deno da farklı değil, çünkü şu anda, sadece bir fikir üzerinde yaklaşık 2 yıllık bir çalışmanın doruk noktası. Henüz production ortamlarında denenmedi ve test edilmedi. Sınır durumlarındaki davranışları gözlenmedi, garip ve normal koşullarda istenmeyen durumlara sokulmadı. Dolayısıyla bunlar gerçekleşene ve tecrübeler paylaşılana kadar, şimdi kullanmaya başlayanların oynayacağı bir oyuncak olacak. Şimdi sınırını koyamayacağınız bir süre içerisinde paylaşılan tecrübeler ile eksikleri tamamlanıp, yeni özellikleri eklendikten sonra alacağı komünite desteği ile belki de NodeJS’in tahtını sallayacak. Bu, belki de ileride gerçekten olacak. Kim bilir? Beklemek ve görmek zorundayız.

Peki siz ne düşünüyorsunuz?

— — — — — — — — — — — — — — —

Kaynaklar:

Author: Efecan Tekin

Apple Push Notification için pem dosyası oluşturma işlemini 2 aşamada gerçekleştireceğiz.

1 — Sertifika Oluşturma
Keychain Access uygulamasını Mac’imizde açıyoruz. Daha sonra aşağıdaki gibi yeni sertifika dosyası oluşturuyoruz.

Seçim yaptıktan sonra, karşınıza aşağıdaki gibi bir ekran çıkacak.

Burada e-posta adresi ve diğer bilgileri giriyoruz. Radio buton alanından “Saved to disk” opsiyonunun seçili olduğundan emin olduktan sonra, “Continue” butonuna tıklıyoruz ve CertificateSigningRequest.certSigningRequest adlı dosyayı localimize kaydediyoruz. Bu dosyayı 2.adımda kullanacağız.

2 — Sertifikasyon
Öncelikle https://developer.apple.com/ adresine giriyoruz. Daha sonra Certificates, Identifiers & Profiles butonuna tıklıyoruz.

Hemen ardından Identifiers sekmesine tıklayıp uygulamanızı seçmelisiniz.

Push Notifications aktif değil ise buradan aktif etmelisiniz.

Configure butonuna tıklayıp hangi ortamda kullanmak istiyorsanız onu seçiyoruz.

Store’a atmadan test etmek istiyorsanız Development SSL Certificate’in altındaki Create Certificate butonuna tıklamalısınız. Store’da olan uygulamanıza bildirim göndermek istiyorsanız Production SSL Certificate’in altındaki Create Certificate butonuna tıklamalısınız.

Choose File butonuna tıklayıp 1.adımdaki oluşturmuş olduğumuz sertifikayı buraya yüklüyoruz ve Continue butonuna basıyoruz.

Karşımıza yukarıdaki gibi bir ekran çıkacak.

Download butonuna basınca;

● Development ortamı için sertifika seçtiysek aps_development.cer adlı bir dosya inecektir,
● Production ortamı için sertifika seçtiysek aps.cer adlı bir dosya inecektir.

İndirdiğimiz cer uzantılı dosyaya çift tıklıyoruz. Keychain Access uygulaması açılacak uygulamanın içinde sertifikamızı yanındaki oku açıp ikisini birden seçip export butonuna tıklıyoruz.

Bunun sonucunda .p12 uzantılı bir dosya olarak desktop konumuna kaydedilip ardından sizden bu sertifika için şifre oluşturmanızı isteyecektir. Dosyanın adını pushcert olarak belirliyoruz. Bu işlemin sonucunda elimizde pushcert .p12 adında bir dosyamız oluyor.
Gelelim pem dosyamızı oluşturmaya. Öncelikle terminali açıyoruz ve aşağıdaki komutları sırasıyla giriyoruz.

cd

cd Desktop

openssl pkcs12 -in pushcert.p12 -out pushcert.pem -nodes –
clcerts

Bu komutların sonucunda desktop’ımızda pushcert.pem adında dosyamız bildirim göndermek için hazır olacaktır.

Author: Murat Bayri

Gereksinimleri açık ve net bir şekilde yazmak, temel bir iş analisti becerisidir. Net şekilde yazılmış gereksinimlerin, paydaşlar ve geliştirme yapacak yazılımcılar tarafından yanlış anlaşılma olasılığı daha düşüktür. Tabii bu gereksinimleri doğrulamak ve onaylamak da daha az inceleme gerektirir. İş analisti olarak gereksinimleri yazarken net olduklarından emin olmak için harcadığımız zamanda, paydaşlara sorabileceğimiz gereksinimle ilgili daha anlamlı ve önemli sorular da ortaya çıkarırız. Peki “net” gerçekten ne anlama geliyor? Daha da önemlisi gereksinimlerin net olup olmadığını nasıl bilebiliriz? Bu yazıda gereksinimleri daha iyi yazabilmenin 3 yoluyla birlikte, hatalardan ve belirsizliklerden nasıl kaçınılabileceğini paylaşacağım.

1- Etken Cümleler Kullanmak

Odaklanmamız gereken ilk şey, gereksinimleri yazarken etken cümleler kullanmak olmalıdır. Genellikle gereksinim için kritik bilgiyi kaçırdığımız zamanlarda edilgen cümleler kullanırız.

Örneğin; 1- Kişisel bilgiler girilir. 2- Kişisel bilgiler kaydedilir. Buradaki “-ilir” ekleri edilgen cümlelerin göstergesidir. Gereksinim yazarken bu ekten olabildiğince kaçınmalıyız çünkü belirsizlik yaratmakta, yani belirtilen işlerden kimin sorumlu olduğu belli değildir.

Şimdi ise alternatif örneğini verelim; 1- Kullanıcı, kişisel bilgilerini girer. 2- Sistem, kullanıcının ilgili kişisel bilgilerini kaydeder. Bu örnekte ise, ilk örnekteki “-ilir” eki yerine “kim” ve “ne” ekledik, işleri kimin yapacağı ve neyin yapacağı net şekilde belirtilmiş oldu.

2- Terminolojiyi Tutarlı Bir Şekilde Kullanmak

İş analisti olarak yazdığımız gereksinimlerin net olmasının ikinci yolu ise terminolojiyi tutarlı kullanmamızdır. Belirli bir süre aynı proje üzerinde çalıştığımızda bazı terimler için aynı kelimeler kullanmak yerine benzer kelimeler kullanabiliyoruz ya da kelimelere ufak varyasyonlar uygulayarak ifade etmeyi tercih edebiliyoruz. Aynı kişilerle çalıştığımız süre boyunca bu durum bir sorun yaratmayabilir; zira bu kişiler neden bahsettiğimizi anlayabilir ve satır aralarını okuyabilirler. Fakat; ekibimize yeni yazılımcılar, yeni iş analistleri katıldığında gereksinimlerdeki bu küçük varyasyonlar veya benzer kelimeler onların kafasında; “Bunlar gerçekten aynı şeyi mi ifade ediyor?” şüphesi yaratacaktır. Örneğin; “Kişisel Bilgiler ve Kişi Bilgileri?” ya da “Kişi Bilgileri Ayrıntıları ve Kişi Bilgileri Detayları?” gibi. Henüz ekibe yeni katılmış bir kişinin, bu gereksinimler için gerçekten bu şekilde soruları olabilir ya da doğru olmayan varsayımlar yapabilir. Terimleri tutarlı bir şekilde kullandığımızdan emin olmak için sözlük oluşturmaya veya Business Domain Model çizmeye zaman ayırmalıyız.

3- Gereksinimleri tek cümlede birleştirmemek

Gereksinimleri net şekilde yazmak için son ipucumuz; gereksinimleri tek cümlede birleştirmekten kaçınmaktır. Gereksinim yazarken; ve, veya, ya da, önce, sonra gibi kelimeler kullanmak, gereksinimin sadece bir kısmına odaklanmamıza sebep olacaktır. Aynı şekilde iş paydaşlarının da, yazılan uzun gereksinimin yalnızca bir kısmını doğrulamasına ya da geliştirme yapılırken gereksinimin bir kısmının tamamlanmasına ve bir kısmının da kaçırılmasına yol açacaktır. Örneğin; “Kullanıcı kişisel bilgilerini girer ve detaylı inceledikten sonra kaydeder.” cümlesini ele alalım. Bu gereksinim net midir? Edilgen cümle yerine etken cümle kullanılmış, fakat burada 3 tane gereksinim bulunmaktadır. Kişisel bilgilerin girilmesi bir gereksinimdir. Bunları gözden geçirmeyse ikinci gereksinimdir. Son olarak bunları kaydetmek de üçüncü gereksinimdir. Bunları tek bir gereksinimde toplayıp yazdığımızda bazılarının gözden kaçması muhtemeldir. Gereksinimleri birleştirmek yerine onları ayrı gereksinimler olarak yazdığımızda, gereksinimlerimiz daha açık ve net olacaktır.

Author: Evin Abay Kaya

Elbette teknolojinin gelişmesiyle birlikte her geçen gün süreçleri kolaylaştırmak ve hızlandırmak için yeni bir araç (tool) ortaya çıkıyor ve hepimize fayda sağlayabiliyor. Bu yazımda, bir iş analistinin çalıştığı projelerde hangi amaç için hangi temel araçları (tools) kolaylıkla kullanabileceğini aktarmak istiyorum.

Öncelikle; bir iş analistinin temel görevlerinden biri proje yönetimi ve takibini yapmaktır. Ayrıca; iyi bir iş analisti, işin detaylı bir şekilde analizini yapar, ön yüz tasarımları varsa ayrıntılı bir şekilde inceler, gerektiğinde wireframe çalışmalarında aktif rol alır. İşlerin hangi aşamada ve hangi statüde olduğunu takip edip, yazılımı tamamlanan işlerin testini yapar. Özetle; proaktif bir iş analisti, bir işin kapsam çalışmasından canlı ortama çıkana kadar olan tüm sürecini takip eder ve yönetilmesinde fayda sağlar. Peki bunun için hangi tool’ların kullanılması bir iş analistinin hayatını kolaylaştırır? Kullanılabilecek tool’lar elbette ki oldukça fazla, ben ise aşağıda bunların birkaçından kısaca bahsedeceğim.

· Jira Software: Atlassian firmasına ait olan bu araç, genellikle büyük veya orta ölçekli kurumlarda kullanımı en yaygın olan uygulamalardandır. Büyük kurumlar, veri güvenliği sebebiyle bu uygulamayı kendi sunucularında tutarak dışarıdan veriye erişilmesini engellemektedir. Bu durum oldukça pahalıya mal oluyor ancak veri güvenliği için kaçınılmaz görünüyor. Jira Software tool’unun Cloud versiyonu ise; hem 10 kullanıcıya kadar ücretsiz hem de her geçen gün daha iyi bir ara yüze ve kullanıcı deneyimine sahip olmakta. Üstelik Agile çalışma metodolojisine de çok uygun. Bu araç için detaylı ücretlendirme bilgisini burada bulabilirsiniz.

Gelelim Jira Software tool’unun proje yönetimi ve takibindeki temel faydalarına. Jira tool’una her geçen gün yeni özellik ekleniyor ancak bu yazımda daha üst seviyede bilgi verip diğer örnek araçları da belirteceğim. İlk olarak; Jira Software’de kullanıcı kayıt süreci tamamlandıktan sonra bu sisteme login olunmalıdır. Sonrasında çalışmanıza uygun şekilde bir proje yaratmalısınız. Proje yarat butonuna tıkladığınızda, aşağıdaki gibi 3 opsiyon çıkıyor.

Agile metodolojisine uygun olarak tasarlanmış Kanban veya Scrum opsiyonlarını seçebileceğiniz gibi sadece bug/defect yönetimi için de “Bug tracking” opsiyonunu seçebilirsiniz. Örnek olması adına ben “Kanban” opsiyonunu seçtim ve aşağıdaki gibi örnek bir proje yönetim şablonu oluşturdum.

Bu noktada proje kapsamında yapılması gereken tüm işler; epic, story, task, subtask ve bug seviyesinde sisteme eklenmelidir. Hemen ardından projede çalışacak kişiler sisteme eklenerek şeffaf bir şekilde projenin yönetimi sağlanmaya başlanabilir. Diyelim ki proje başladı ve işler belirli seviyede ilerledi. Bu noktada “Project Settings” menüsü üzerinden aşağıdaki “Issues” menü görünümü aktif edilebilir ve tüm açılan işler bir tabloda kolaylıkla listelenebilir.

Bu ekranda verileri basit bir excel tablosu gibi görebilir, sıralayabilir veya filtreleyebilirsiniz. Hangi iş kimde ve statüsü nedir şeffaf bir şekilde gözlemlenebilir. Tıkanan noktalar hızlıca fark edilebilir ve eskalasyonu rahatlıkla yapılabilir.

Ayrıca; aşağıda soldaki “Reports” menüsüne tıklayarak bir sonraki görseldeki gibi örnek rapor şablonlarından seçebilir ve kendinize uygun raporlar oluşturabilirsiniz. Bu da proje yönetimini ve takibini oldukça kolaylaştırmaktadır. Bu aracı sadece büyük projelerde değil, orta ve küçük ölçekli projeleriniz için de kullanabilirsiniz.

· Trello: Yakın zamanda yatırım alarak Atlassian ailesine katılan bu araç; kullanıcı ara yüzünün çok basit ve ücretsiz olması sebebiyle proje yönetimi ve takibinde oldukça popülerdir. Bu sayede kullanıcı sayısı hızla artmış ve tasarım ekibi kullanıcı deneyimini iyileştirmeye odaklanmıştır. Bir kullanıcı, kolay bir şekilde sisteme kaydolup login olabilir. Login işlemi sonrası, yeni bir çalışma panosu oluşturulmalıdır. Dilerseniz aşağıdaki gibi hazır pano oluşturabilir ve üzerinde değişiklik yapabilirsiniz.

Oluşturulan panoya kolonlar eklenir ve her bir kolona basit birkaç kelime veya bir cümle ile kartlar eklenebilir. Girilen kartlar sürükle bırak yöntemiyle hızlı bir şekilde taşınabilir. Mobil uygulama deneyimi de oldukça basit olan bu tool, genellikle küçük projelerin yönetiminde kullanıldığı gibi kişisel işlerinizin yönetiminde de oldukça kolaylık sağlıyor. Bu tool sayesinde, artık bir not defteri ve kaleme ihtiyacınız olmayacaktır.

· Microsoft Office Ürünleri: Özellikle Word, Excel, OneNote, Outlook ve PowerPoint olmazsa olmaz ürünlerdendir. Belki de ilkokuldan bu yana kullanmaya alışık olduğumuz bu ürünler, sunum yapmak veya iş süreçlerini belgeleyebilmek için vazgeçilmezimiz oluyor. MacBook ile de kullanımı oldukça kolay bu ürünleri, online (web) editör üzerinden kullanmak da mümkün.

· Slack: Ekip içi anlık iletişimi kolaylaştıran bu ürün, hem ücretsiz hem de kullanıcı deneyimi çok iyi tasarlanmış. Mobil uygulaması da oldukça basit. Bu tool üzerinden sadece iş ile ilgili yazışmalar ve aramalar yapıldığında, odağınız dağılmadan rahatlıkla çalışabilirsiniz. Özellikle yeni nesil teknoloji şirketlerinde bu ürün kullanılmakta. Bazı büyük ve orta ölçekli kurumlar Slack yerine Microsoft Teams gibi daha pahalı ürünleri tercih edebiliyor.

· Dropbox: Dokümanların kolaylıkla saklanabildiği, ara yüzü basit tasarlanmış bu uygulama da oldukça popüler. Herhangi bir dokümanı e-posta eki olarak iletmek yerine, yetki vererek bir link ile paylaşabilirsiniz.

· Google Drive: Dropbox’a alternatif olarak yine kolaylıkla kullanabilecek bir tool. Üstelik gmail kullananlar için erişimi çok daha kolay olan bir doküman saklama ve paylaşma aracı.

· Moqups: Özellikle wireframe çiziminde bu online (web) tool çok sık kullanılıyor. Balsamiq ürününe alternatif olarak çıkan bu tool ile kolayca wireframe’ler oluşturabilir ve ufak prototipler hazırlayabilirsiniz. Üstelik hazır template’ler üzerinden ilerleyebilir, eğitim dokümanları ile çizimlerinizi iyileştirebilirsiniz. Ekip içi kullanımı da kolaylaştıran bu tool ile, sürükle bırak yöntemiyle yeni ekranlar kolaylıkla oluşturulabiliyor.

· Figma: Figma üzerinde çok rahat wireframe ve prototip tasarlayabilir veya tasarımı yapılmış bir ekranı kolayca inceleyebilirsiniz. Yorum ekleyebilir, süreci takip edebilirsiniz. Özellikle Sketch ve Adobe XD tool’larına alternatif olup tasarımcılar tarafından son dönemde çok tercih edilen bu tool, kısa eğitimleri ile bir analistin wireframe tasarlayıp prototip oluşturmasını da kolaylaştırıyor.

· Draw.io: Visio tool’una alternatif olarak online (web) site üzerinden kolaylıkla akış çizebilirsiniz. Özellikle karmaşık süreçleri anlatırken kullanılan bu tool, bir analistin hayatını kolaylaştırıyor. https://app.diagrams.net/

· Zeplin: Yapılan bir ekran tasarımı Zeplin tool’una yüklenir ve e-posta adresiniz üzerinden size erişim yetkisi verilir. Böylece, kolaylıkla ekranlara erişebilir, CSS bilgilerini görebilir, ekran tasarımlarını indirebilirsiniz. Yakın zamanda Figma, Sketch, Adobe XD ile entegre çalışabilir hale gelen Zeplin, hem ön yüz yazılım ekibi hem de analistlerin hayatını kolaylaştırmakta.

Author: Merve Sağlam

iOS 9’daki en önemli eklemelerden biri, uygulamaların iOS sistem genelinde arama özelliği olan Spotlight ile çift yönlü iletişim kurabilmesiydi. Bunun anlamı; uygulamalar, içeriklerinin Spotlight arama sonuçlarında gösterilmesini isteyebilir ve kullanıcı bu arama sonuçlarından birine dokunursa, uygulama başlatılır ve doğru içeriği yükleyebilmesi için neye tıkladığı söylenir.

Storyboard üzerinden 3 adet view controller oluşturalım ve bu view controller’ların storyboardid’lerini sırasıyla Screen1, Screen2 ve Screen3 olarak tanımlayalım.

Kod tarafında nasıl yapacağımıza geçelim.

1 – Index işlemi

Öncelikle uygulamada ilk açılan ekranın controller dosyasına aşağıdaki 2 adet kütüphaneyi ekliyoruz.

import CoreSpotlight
import MobileCoreServices

Daha sonra aşağıdaki struct modelimizi yaratıyoruz.

truct SpotlightModel {
        var id: String   // App delegate dosyamızda kontrol edeceğimiz id bilgisi
        var title: String  // Spotlight search kısmında uygulama adı kısmı
        var content:String: String   // Spotlight search kısmında uygulama açıklama kısmı
        var keywords:[String]    // Spotlight search kısmında arandığında çıkmasını istediğimiz kelimeler
}

Modelimizi yarattıktan sonra bu modelden oluşturulan bir array oluşturuyoruz.

var matches:[SpotlightModel] = [SpotlightModel]()

Aşağıdaki metod ile indexleme işlemini yapıyoruz.

func indexSearchableItems(){
        // aranacak kelimeleri array’e ekliyoruz.
        let screen1 = SpotlightModel(id: “1”, title: “Bayri”, content: “Screen 1”, keywords: [“screen 1, screen1”])
        let screen2 = SpotlightModel(id: “2”, title: “Bayri”, content: “Screen 2”, keywords: [“screen 2, screen2”])
        let screen3 = SpotlightModel(id: “3”, title: “Bayri”, content: “Screen 3”, keywords: [“screen 3, screen3”])
        matches.append(screen1)
        matches.append(screen2)
        matches.append(screen3)
        var searchableItems = [CSSearchableItem]()
        for match in matches {
            let searchItemAttributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeText as String)
            searchItemAttributeSet.title = match.title
            searchItemAttributeSet.contentDescription = match.content
            searchItemAttributeSet.keywords = match.keywords
            let searchableItem = CSSearchableItem(uniqueIdentifier: match.id, domainIdentifier: “matches”, attributeSet: searchItemAttributeSet)
            searchableItems.append(searchableItem)
        }
        CSSearchableIndex.default().indexSearchableItems(searchableItems) { (error) -> Void in
            if error != nil {
                print(error?.localizedDescription ?? “Error”)
            }
        }
    }

2 – Indexlenen ekranın açılma işlemi

AppDelegate.swift dosyanıza import CoreSpotlight ekleyin.

Ardından aşağıdaki metodu Spotlight Search kısmından dönen değeri karşılamak için AppDelegate.swift dosyamıza ekliyoruz.

Kod içerisindeki uniqueIdentifier değişkeni yukarıda indexlemiş olduğumuz bilgidir. Bu değere göre açmamız gereken sayfayı açıyoruz.

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
        if userActivity.activityType == CSSearchableItemActionType {
            if let uniqueIdentifier = userActivity.userInfo?[CSSearchableItemActivityIdentifier] as? String {
                if(uniqueIdentifier == “1”){
                    let mainStoryboard:UIStoryboard = UIStoryboard(name: “Main”, bundle: nil)
                    let homePage = mainStoryboard.instantiateViewController(withIdentifier: “Screen1”) as! Screen1ViewController
                    self.window?.rootViewController = homePage
                }else if(uniqueIdentifier == “2”){
                    let mainStoryboard:UIStoryboard = UIStoryboard(name: “Main”, bundle: nil)
                    let homePage = mainStoryboard.instantiateViewController(withIdentifier: “Screen2”) as! Screen2ViewController
                    self.window?.rootViewController = homePage
                }else if(uniqueIdentifier == “3”){
                    let mainStoryboard:UIStoryboard = UIStoryboard(name: “Main”, bundle: nil)
                    let homePage = mainStoryboard.instantiateViewController(withIdentifier: “Screen3”) as! Screen3ViewController
                    self.window?.rootViewController = homePage
                }
                window?.makeKeyAndVisible()
            }
        }
        return true
    }

Uygulamamız kullanıma hazır.

Author: Murat Bayri

Apple, Eylül 2015’te standart cam ekranlardan farklı etkileşim seviyeleri sunan 3D Touch adlı bir ekran teknolojisini tanıttı. 3D Touch özelliğini destekleyen cihazlarda, kullanıcılar dokunmatik ekrana farklı seviyelerde basınç uygulayarak ek işlevlere erişebilir. Uygulamalar, bir öğeyi göstermek için içerik menüsü görüntüleyerek tıklanabilir hale getirildi.

Ana ekrandan uygulamalara hızlı erişim

Ana ekranda uyumlu bir uygulamanın simgesini basılı tutarak açılan menüden uygulama açılmadan önce çeşitli aksiyonları gerçekleştirmenize olanak tanır. Örneğin, kamera uygulamasını basılı tutarak, ana kamera yerine selfie kamerasını başlatmanıza izin verirken, Haritalar uygulamasında hedefinizi işaretleme veya konumunuzu gönderme seçeneği sunar.

Bu geliştirmeyi uygulama tarafında nasıl yapacağımıza geçelim.

1 . İçerik menüsü oluşturma

İçerik menümüzü oluştururken 2 farklı yöntem kullanabiliriz.

1.1. Info.plist

İlk olarak info.plist dosyası üzerinden nasıl yapıldığına bakalım.

Aşağıdaki gibi görünümde info.plist dosyasını açmak için sağ tıklayıp Open As > Source Code demelisiniz. Daha sonra kendi uygulamanıza özel 3D Touch içerik menüsünü istediğinizi gibi özelleştirebilirsiniz.

UIApplicationShortcutItemTitle : 3D Touch içerik menüsündeki başlık kısmına karşılık geliyor.

UIApplicationShortcutItemSubtitle : 3D Touch içerik menüsündeki alt başlık kısmına karşılık geliyor.

UIApplicationShortcutItemIconFile : Sağ kısımdaki küçük ikonun Assets içerisinde bulunan resmimizin adına karşılık geliyor.

UIApplicationShortcutItemType : Tıklanan 3D Touch objesinin AppDelegate dosyamızda hangi sayfaya yönlenmesine karar vermemizi sağlayacak değer olacak.

Diğer bir görünüm ise aşağıdaki varsayılan görünümdür. Tek tek kendi uygulamanıza özel düzenleyip kişiselleştirebilirsiniz.

1.2 . AppDelegate.swift dosyasında tanımlama işlemi

AppDelegate.swift dosyamızda application(_:didFinishLaunchingWithOptions:) instance metodu içerisinde tanımlayacağız.

Aşağıdaki şekilde içerik menü objelerini tek tek oluşturup application altındaki “shortcutItems” alanına tanımlıyoruz.

İçerik menüsü oluşturma işlemimiz bu şekilde bitiyor ikinci adım olarak bu menülere tıklandığında alınacak aksiyonlar olacak.

2. 3D Touch menü aksiyonları

AppDelegate.swift dosyamız içerisine application(_:performActionFor:completionHandler:) adı altında yeni bir instance metodu ekleyeceğiz.

Aşağıdaki metot ile tıklanan menü elemanın tüm özelliklerini alıp ona göre aksiyon alabiliriz. İki farklı kod bloğu ekledim. İlkinde seçtiğiniz 3D Touch menüsünü doğrulamanız için ekranda seçilen menünün adını yazan bir alert. İkincisi ise menü type bilgisine göre ekran yönlendirmesi yapan bir yapı.

Uygulamamızın son hali

3D Touch destekleyen cihaz listesi : iPhone 13 Pro Max, iPhone 13 Pro, iPhone 13, iPhone 12 Pro Max, iPhone 12 Pro, iPhone 12, iPhone 12 mini, iPhone SE (2nd generation), iPhone 11, iPhone 11 Pro, iPhone 11 Pro Max, and iPhone XR. These devices support 3D Touch: iPhone 6s, iPhone 6s Plus, iPhone 7, iPhone 7 Plus, iPhone 8, iPhone 8 Plus, iPhone X, iPhone XS, and iPhone XS Max.

Author: Murat Bayri

Herkese merhabalar,

2018 yılında duyurulan, günümüzde de kullanımı artmaya devam eden, alışık olduğumuz virtualenv/pipenv yapısının dışında daha kapsamlı ve komplike bir yapı sunan paketleme yöneticisi ile sizleri tanıştırmak istiyorum, Poetry…

Çok kısa bir özet geçmek gerekirse, Poetry 2018 yılında 0.1 sürümüyle dünyamıza katılmış, pipenv, virtualenv gibi teknolojilerin üstüne geliştirme yaparken yaşanan birkaç uzun aşamayı da kısaltmayı kendine düstur edinmiş bir paket yöneticisi.

Neden Poetry?

Poetry Sisteme Yükleme

Bu kadar övdükten sonra nasıl kullanacağımızı anlatmaya başlayabilirim

Kurulum adımı gayet basit,
Linux/MacOSX için;

curl -sSL https://install.python-poetry.org | python3 -

PowerShell kullanarak yüklemek için (windows);

(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -

Kurulum işlemi tamamlandıktan sonra kontrol etmek için;

sezerb@optimist~> poetry --version
Poetry version 1.1.13

Poetry Autocomplete özelliğini Aktif Etme ve Silme

Eğer konsol olarak standart bash ya da cmd yerine, zsh, fish gibi konsol kullanmayı tercih ediyorsanız şu komutlardan sizin konsolunuz özelinde olanını seçip tek satırda poetry’i sisteme ekleyebilirsiniz;

# Bash
poetry completions bash > /etc/bash_completion.d/poetry# Fish
poetry completions fish > ~/.config/fish/completions/poetry.fish# Zsh
poetry completions zsh > ~/.zfunc/_poetry# Oh-My-Zsh
mkdir $ZSH_CUSTOM/plugins/poetry
poetry completions zsh > $ZSH_CUSTOM/plugins/poetry/_poetry# prezto
poetry completions zsh > ~/.zprezto/modules/completion/external/src/_poetry

Eğer poetry’i silmek isterseniz;

curl -sSL https://install.python-poetry.org | python3 - --uninstall
curl -sSL https://install.python-poetry.org | POETRY_UNINSTALL=1 python3 -

Poetry ile Proje Başlatma ve Yönetme

Projenizi ilk defa oluştururken direkt olarak konsoldan ya da Pycharm yardımıyla Poetry kullanabilirsiniz. Konsoldan;

sezerb@optimist~/working_table> poetry new sample-project
Created package sample_project in sample-project
sezerb@optimist~/working_table> ls
sample-project/
sezerb@optimist~/working_table> cd sample-project/
sezerb@optimist~/w/sample-project> ls
pyproject.toml README.rst sample_project/ tests/
sezerb@optimist~/w/sample-project> ls -al
total 20
drwxrwxr-x 4 sezerb sezerb 4096 Jun 13 06:24 ./
drwxrwxr-x 3 sezerb sezerb 4096 Jun 13 06:24 ../
-rw-rw-r-- 1 sezerb sezerb 300 Jun 13 06:24 pyproject.toml
-rw-rw-r-- 1 sezerb sezerb 0 Jun 13 06:24 README.rst
drwxrwxr-x 2 sezerb sezerb 4096 Jun 13 06:24 sample_project/
drwxrwxr-x 2 sezerb sezerb 4096 Jun 13 06:24 tests/
sezerb@optimist~/w/sample-project> cat README.rst
sezerb@optimist~/w/sample-project> cd tests/
sezerb@optimist~/w/s/tests> ls
__init__.py test_sample_project.py
sezerb@optimist~/w/s/tests> cd ..
sezerb@optimist~/w/sample-project> ls
pyproject.toml README.rst sample_project/ tests/
sezerb@ubuntu2204 ~/w/sample-project> cat pyproject.toml
[tool.poetry]
name = "sample-project"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"][tool.poetry.dependencies]
python = "^3.10"[tool.poetry.dev-dependencies]
pytest = "^5.2"[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

Gördüğünüz gibi tek satır komut ile projenin test kısmı dahil olmak üzere projeyi oluşturup, README dosyası dahil olmak üzere ayağa kaldırıyor. Pycharm ile birlikte kullanmak içinse;

Varolan bir Projeye Poetry ekleme

Projenin olduğu dizine gidip;

poetry init

Paket bağımlılığı ekleme/çıkarma/güncelleme

Projenizi oluşturduktan sonra yeni bir bağımlılık ekleme/güncelleme/silme için;

poetry add [package-name] # yeni bağımlılık ekler
poetry remove [package-name] # varolan bir bağımlılığı siler
poetry update [package-name] # eğer paket adı belirtirseniz eklediğiniz paketi, yazmazsanız tüm paketleri son sürüme günceller

Farklı Python Versiyonları ile Çalışma

Poetry’nin sağladığı bir diğer kolaylıkta farklı python versiyonları ile kodunuzu test edebilmenize imkan tanıması. İsterseniz proje özelinde isterseniz globale farklı versiyonlar yükleyerek kolayca bu python versiyonları arasında gezebilmek mümkün;

pyenv install 3.9.8
pyenv local 3.9.8 # projenizi bu versiyon ile çalıştırmanızı sağlar
poetry install
poetry env use python3.7 # versiyon değişimi
poetry env info # anlık olarak kullandığınız versiyon bilgisi ve detaylarını içerir.

PyPi’ye Paket Gönderme

Normalde bir paket hazırladığınızda bu paketi PyPi’ye yüklemekte ayrı bir süreç gerektirirken Poetry bu zahmetten bizleri kurtarıyor, tek yapmanız gereken;

poetry config repositories.foo-pub https://pypi.example.org/legacy/ # projenizin PyPI adresini ekleme
poetry config http-basic.foo-pub <username> <password> # giriş işlemi
poetry publish --build --repository foo-pub # paketinizin build alıp PyPI'ye gönderme

Sonuç

Eğer tüm paketlerimi tek bir paket yöneticisini üzerinden kontrol edeyim, bu paket yöneticisi aynı zamanda ekstra zengin özelliklere sahip olsun, PyPI’ye de paket atmaktan çekinmeyeyim, built-in olarak farklı python versiyonları ile çalışmak istiyorum, projemin dev/test/prod paket bağımlılıklarını konsoldan yöneteyim ve tek bir yaml içerisinde dursun gibi avantajlardan faydalanayım istiyorsanız Poetry tam sizlik. Eğer hiç denemediyseniz varolan bir projenizi de poetry’e taşıyarak başlayabilirsiniz. Üstelik bunun için tek yapmanız gereken “poetry init” komutu vermek, interaktif olarak bu taşıma işini poetry sizinle beraber yapıyor;

Bir başka yazımda görüşmek üzere…

Author: Sezer Bozkır