innovance

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

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

Changes have always scared people in life. Most people prefer staying in their comfort zone because it is easier and less scary than new possible experiences. Experiencing the unknown is often nerve-racking. It is scary to swim in water if we do not know its depth, or it is unsettling to climb a high mountain, it is perceived as risky to change jobs or positions as a new challenge rather than staying with what you already have and gotten used to. Nevertheless, these are the experiences which differentiate us from other people in life. Most people swim at the beach, but few people swim in deep oceans, and it is those few who stand out in a crowd with such a different experience. I think this mentality applies to the business life too. Companies want people with different experiences. Even for a junior position, they expect some internships, extracurricular activities, different courses, or certificates during their studies. When such standards are expected for a junior position, it is normal for the qualifications required for higher positions to be even more.

There are two main ways to gain different experiences for a worker; one of them is change of working role and/or responsibilities within the same company and second one is to take on another adventure in a different company or even industry.

Job changing process almost always takes a lot of time and effort. It is important to note that changing jobs frequently is not a good sign for companies to hire a person. In general, a person should not change his/her job every year or in a shorter period. This shows lack of loyalty to a job or a company. Yet, a person should not be stuck in company within the same role for a long time either. Time period to change jobs should be evaluated carefully to avoid such reputation and, the new job should be offering new experiences to the worker to improve and get ahead in work life.

Another way to gain different experience is the role and/or responsibility changes within companies but the possibility of role changing is low if you are an insource worker in a company. The main reason behind this is to keep the know-how at a good level but losing that person would create a gap in the company. Instead of that, transferring the knowledge to more than one person would create more options for the company to keep the knowledge. That means a circulation within the company would create more knowledge and sharing that knowledge could create new ideas for progress. Different people look at problems from different perspectives and that prevents problems about a process beforehand and if a person can look at a process from multiple perspectives, this could create a better outcome. For instance, a worker who worked in 5 different roles in a company during a three-year period can look a new task from 5 different perspectives because he/she would have seen how a certain department looks at a new task and what are the needs for that specific department. This would enable the person to analyze the task from a general point of view and create the optimal outcome in the task. Remember that teams are built from people with different talents so that different ideas can come for a task. Then you can look at a problem from different perspectives and come up with many ideas about a task, that makes you a unique person both in the team and in the company.

That is why a worker should not be afraid of moving out of his/her comfort zone and should be open to new roles and responsibilities in the company. New qualifications and experiences open new windows to people that they did not even know existed. Those people will be one step ahead of their competitors and differentiated in a crowd. It is exactly as Andre Gide when he famously claimed, “the length of the unopened wings cannot be known.” People should open their wings to discover the miracles of flying!

Author: Tayyip Adal

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

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

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

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

Introduction

In computer software engineeringrevision control is any kind of practice that tracks and provides control over changes to source code. This is one of the things that developers need most. Because in any software project under development, there will be a lot of changes. There are numerous advantages to the continuous tracking of these changes in the project. Although these advantages are seen more clearly in teams with a high number of software developers, they also provide numerous advantages for individual works. If we want to summarize all the advantages in one sentence, it ensures that the team is always in harmony without losing the changes made to the files you are working on.

As the number of software development projects grew, software developers also needed to develop version control applications to avoid problems like code loss. Firstly, local-based applicationsSCSS(Source Code Control System) and RCS(Revision Control System) etc., that emerged in the early 1970s. Then they evolved into a client-server applications, Panvalet, Software Change Manager etc., towards the end of the 1970s. The number of alternatives was also increasing rapidly in those days. But the biggest development that made the main difference in this matter was the transition to distributed technology in the early 2000s. This technology, which allows the developer to work quite quickly without the need for any network, became very popular. The most known and widespread member of the architecture, especially preferred by people developing open source projects, is Git. Git, which I can say that has almost changed our lives, has also created a huge ecosystem around it.

git

Let’s return to today’s topic after the theoretical knowledge in the introduction phase. We mentioned that Git created a great ecosystem. The biggest members of this ecosystem are the tools that provide hosting and managing the code sets, we call them as Repository in Git, for free. GitHub, described as the main one of these tools, has almost become the home of open-source developers. But for software developers who develops applications in corporate companies, on-premise solutions are required, where they can run on their own servers in some cases. Developers who are aware of this need have also worked on this issue and offered solutions with their and other developers needs. These solutions are also divided into 2 as open-source solutions and licensed solutions.

In this article, we will be examining TFSGitLab and Gerrit among these open source and licensed products. We will have information about the usage, operating logic and capabilities of these products developed in line with different needs. Finally, we will interpret the differences between them.

TFS

Definition:

TFS is a Team Foundation Server and it’s a mixture of Version Control System (VCS), an issue tracker (like Jira) and also a combination of application lifecycle management tool. TFS has been working on its own version control system, also it supports Git for a while. In this way, project management, bug tracking and version management meet under a single application framework. TFS, which Microsof has been working on for many years and constantly announcing its new versions, is sold for a fee determined according to various features. We can call it as all-in-one solution for

Mechanism:

When you have multiple developers working together, and you need to release stable versions, and you would like to keep development going when releasing. It is the foundation for moving to a Continuous Deployment scenario. It is also an excellent way of making sure the “official” code is following at least some of your best practices guidelines. Using Pull Requests is built in to TFS.

You can easily setup your continues integration process with built-in tool.

Pull Request

Pull requests is a mechanism where you explicitly ask the server to merge your changes (commits) into a target branch. You can then set up rules for conditions for merging, and also a set of automatic steps that can be taken. A pull requests is also the item on which you can ask for a code review. This can also be automated.

So a pull requests server multiple purposes. It keeps the official code more clean, it opens up for code reviews, it ensures your stuff builds green before it goes into the official code base.

Gerrit

Definition:

Gerrit is a web-based tool that is used for code review. Its main features are the side-by-side difference viewing and inline commenting, which makes code reviews a quick and simple task. It is used together with the Git version control system. Gerrit allows authorized contributors to merge Changes to the Git repository, after reviews are done. Contributors can get their code reviewed with little effort, and get their changes quickly through the system.

Mechanism:

Gerrit usage has two stages: First, the contributor uploads changes to Gerrit with Git, and second, peers use the web browser to make reviews. The review process includes the following steps:

Git provides a mechanism to continually update a commit until it’s perfect: use git commit --amend to remake (re-record) a code change. After you update a commit in this way, your branch then points to the new commit. However, the older (imperfect) revision is not lost. It can be found via the git reflog.

Gerrit identifies a conceptual change with a footer in the commit message. Each commit message footer contains a Change-Id message hook, which uniquely identifies a change across all its drafts. For example:

`Change-Id: I9e29f5469142cc7fce9e90b0b09f5d2186ff0990`

Thus, if the Change-Id remains the same as commits are amended, Gerrit detects that each new version refers to the same conceptual change. The Gerrit web interface groups versions so that reviewers can see how your change evolves during the code review.

One of the main difference of Gerrit is, review process starts with developer’s commit. Only reviewed and approved commits can take place at origin. Also, although TFS and GitLab offer solutions for the whole DevOps process; Gerrit only serves a Git with code review.

GitLab

Definition:

GitLab is a web-based DevOps lifecycle tool that provides a Git-repository manager providing wiki, issue-tracking and CI/CD pipeline features, using an open-source license, developed by GitLab Inc.

The code was originally written in Ruby, with some parts later rewritten in Go, initially as a source code management solution to collaborate with his team on software development. It later evolved to an integrated solution covering the software development life cycle, and then to the whole DevOps life cycle. The current technology stack includes Go, Ruby on Rails and Vue.js.

You can use GitLab as an online Git repository. like Github. Furthermore, you can install it to your server and use as on-premise solution. In addition if you use GitLab CI Runner with installing it to your server, you can complete whole continues integration lifecycle easily.

Mechanism:

GitLab’s flow works with Merge Requests. The sound of Merge Request comes familiar, I know. Merge Request and Pull Request are same feature of different products which provides to manage git repositories. GitLab explains this subject with “Merge or pull requests are created in a git management application and ask an assigned person to merge two branches. Tools such as GitHub and Bitbucket choose the name pull request since the first manual action would be to pull the feature branch. Tools such as GitLab and Gitorious choose the name merge request since that is the final action that is requested of the assignee. In this article we’ll refer to them as merge requests.” sentences.

Which Will You Choose?

When deciding which one to choose, you should definitely consider your needs. Because your needs will allow you to decide whether the tool is useful or not.

For example, if you want the reviews must be on each commit instead of merge request, the tool you need to use will be Gerrit. But the configuration and learning curve of Gerrit can make your job a little difficult because Git commands that you are not familiar with are included.

If review is more suitable for you during merge and you need a lot of time during preparing release and want to manage them easily from only one tool, you can use GitLab. However, you should not forget that it is a structure that works entirely on the cloud and also the policies of the company you are working with. For example, banks in Turkey, they do not hold any data on cloud structure, including codes. In this case, GitLab’s on-premise solution can be preferred.

TFS is Microsoft’s licensed product so it’s not suitable for small and growing teams. Because you need to pay for every license. But if you work for corporate company that has Microsoft licenses, TFS should be nice selection for managing whole project. With TFS, you can use agile boards, Git repos and easy to use DevOps tool.

To sum up, you should decide your needs. There is no great solution that applies to all companies. Everyone should choose the best according to their needs.

Author: Efecan Tekin

Bugünkü yazımda, 2020‘nin ilk çeyreğinin sonlarına doğru yaklaşırken, npm, YARN ve Pnpm’in ne olduklarını, çalışma mantıklarını ve farklarını inceliyor olacağız.

NPM, PNPM ve YARN nedir?

npm, Pnpm ve Yarn’ın üçü de Paket Yöneticisi’dir. Peki nedir bu Paket Yöneticisi? Ne iş yapar? Geliştiriciler tarafından araç paylaşmak, çeşitli modüller yüklemek ve bu modüllerin bağımlılıklarını yönetmek için yaygın biçimde kullanılan bir araçtır.

Modüller ve bağımlılıklar;

Genel olarak üçü de komut satırı aracılığıyla yönetilir.

NPM

Başlıkta NPM yazmak zorunda kalsam da, Node Package Manager’in camelCase kısaltması olarak tamamen javaScript ile yazıldığı için npm şeklinde tanınan, yazılımların / modüllerin / paketlerin yönetilmesini sağlayan, Node.js’in standart olarak kabul ettiği bir paket yöneticisidir.

npm’i kullanabilmek için, öncelikle sisteminizde muhakak Node.js yüklü olmalı. Sisteminizde Node.js ve npm’in olmadığını kontrol edebilmek için de aşağıdaki komutları çalıştırabilirsiniz.

node -v
npm -v

Eğer bu komutlar cevap olarak birer versiyon dönerse, sistemizde bu araçlar mevcut demektir.

Package.json

Yer aldığı projede kullanılan paketler / modüller ve bağımlılıklar (dependencies) hakkında bilgiler içeren bir yerel paket veritabanıdır. Bir projeye başlandığında kendiniz oluşturabileceğiniz gibi (belirli bir syntax ile), npm kullanarak init komutuyla da oluşturulabilir. npm init ile yapılan kurulumlarda araç size bir takım sorular soracak ve dosyayı ona göre oluşturacak. Eğer React Native CLI gibi bir boilerplate ile yeni bir proje başlatacaksanız, CLI’ın init işlemi sonucunda da CLI’da hazırlanan şekilde package.json oluşacaktır.

Paket Kurulumları

— Global Kurulum, modülleri {prefix}/lib/node_modules, yürütme dosyalarını (executable files) {prefix}/bin, man dosyalarını {prefix}/share/man içerisine aktarır. {prefix} genellikle /usr/local dizinine karşılık gelir.

npm install express -g

Kurulum /usr/local/lib/node_modules/express yoluna sahiptir. Global kurulumu — save-dev ile ele aldığımızda ilgili tanımlama da dependencies olarak package.json dosyasına eklenecektir.

— Lokal Kurulum, modülleri çalışılan dizine (proje dizinine) kurar. Genellikle kurulum .node_modules klasörü oluşturularak gerçekleştirilir. Yürütme dosyaları da yine bu klasör içerisinde ./node_modules/.bin/ içeriğinde tutulur. man dosyaları lokal kurulumda işleme alınmaz.

mkdir newproject
cd newproject
npm init -y
npm install express

Komutun uygulanmasının ardından newproject dizininde node_modules klasörü oluşturulacak ve express paketi bu klasör içerisine yüklenecektir. Bu kurulumun ardından uygulamamız içerisinden pakete ../node_modules/express ile erişebiliriz.

Bağımlılıklar (Dependencies)

Bağımlılıklar, kurulum sırasında install komutu le birlikte — save flag’i tanımlandığında, paket bilgilerinin ekleneceği alandır. Bu paketler production için gereklidir. devDependencies ise — save-dev ile paketlerin detaylarının ekleneceği yerdir. Burada tutulan paketler geliştirme ve test için gereklidir.

YARN

Yarn, Facebook yazılım ekiplerinin öncülüğünde Google, Exponent ve Tilde şirketlerinin de destekleriyle birlikte npm’e alternatif olarak geliştirilen bir paket yöneticisidir.

Genel olarak npm’in özelliklerini desteklemesiyle birlikte, Facebook mühendislerinin başını ağrıtan güvenlik, tutarlılık ve performans problemlerini çözmek amacıyla yeni özellikler de getirmiştir.

Yarn, yüklenen her paketi önbelleğe alan, böylelikle paketin tekrar yüklenmesine gerek kalmayan, kaynak kullanımını en üst düzeye çıkarmak için gerçekleştirilen işlemleri paralelleştiren bir yapıya sahiptir.

Yarn kurulumu için sistem seviyesinde bir başka paket yöneticisi kullanabiliriz. macOS için Brew veya MacPorts tercih edilebilir.

brew install yarn
#ya da
sudo port install yarn

Elbette paket yöneticisi olmaksızın da yükleme işlemi gerçekleştirilebilir. Komut satırı üzerinden curl aracılığıyla indirmek işlemi gerçekleştirmek için şu komut kullanılabilir.

curl -o- -L https://yarnpkg.com/install.sh | bash

Diğer indirme ve versiyon kullanım seçenekleri için Yarn > Installation sayfasını inceleyebilirsiniz

Yarn ile yeni bir proje oluşturmak için yarn init komutunu kullanırız. Projenin yürütüleceği dizinde bu komutu uyguladığımızda bizden prompt aracılığıyla name, version, entry point, repository url gibi bazı bilgiler istenir. Bilgilerin girilmesi ya da es geçilmesinin ardından bir package.json dosyası oluşturulur.

Paket Kurulumları

— Yükleme işlemini global olarak gerçekleştirmek için global parametresini eklemek yeterli.

yarn add global [paket-adi]

— Proje dizinine yeni bir paket / bağımlılık (dependency) eklemek istediğimizde de yarn add komutundan faydalanırız.

yarn add [paket-adi]
yarn add [paket-adi]@[paket-versiyonu]
yarn add [paket-adi]@[etiket]

— Yarn özelliklerine değindiğim paragrafta paralelleştirmeden bahsetmiştim.

yarn add [paket-adi-1] [paket-adi-2] [paket-adi-3] [paket-adi-4]

PNPM

pnpm, performant npm’in kısaltması olan, npm ile Yarn’ın tüm özelliklerine sahip ve birçok açıdan daha iyi performans gösteren bir paket yöneticisidir.

Hem npm hem de Yarn’dan çok daha hızlı olduğu iddia edilmektedir. Benchmark kıyaslamalarına buradan ulaşabilirsiniz.

Sabit bağlantıları kullanarak sistemdeki Node Modülleri tekilleştirir, ardından her bir projenin node_modules klasörü içinde sembolik linkler(symlinks) kullanır; yani artık sisteminizde örneğin lodash’ın tek bir kopyası olacak 🎉. Bu da diskinizde müthiş bir alan kazanımı demek.

Yarn da geçmişte sembolik bağlantıları kullanmayı düşündü, ancak birkaç nedenden ötürü başka bir karar vererek yollarını değiştirdiler. Bireysel denemelerde pnpm’in performasını oldukça başarılı buldum ve herhangi bir sorun yaşatmadı.

Komutları Yarn ile çok benzer olduğu için hiçbir alışma problemi de olmadı.

Kullanımı ile ilgili tüm detaylar için linkini kullanabilirsiniz.

Bu linkte açıklanan bir “strictess” özelliğine sahiptir. Bu özellik, package.json’da olmayan herhangi bir modülü kullanmanızı engeller. Bu, izlemesi zor hatalardan kaçınmanızı sağlayan harika bir özellik olarak dikkat çekiyor.

npm install -g pnpm

pnpm, bir drop-in replacement olduğu için, npm için geçerli olan tüm komutları pnpm için de kullanabilirsiniz.

FARKLAR

Hız — Performans

  1. npm aracı Node paketlerini merkezi repodan sıralı olarak indirirken, YARN eş zamanlı olarak birden fazla paketi indirebilir. Böylece daha hızlı yüklemelere kapı aralar. YARN ayrıca yarnpkg.com adında bir uzak depoya da sahiptir.
  2. YARN aracı ile yüklenen a.b.c sürümündeki bir paket, lokal bilgisayarınızda ayrıca depolanır. Böylece ilgili sürümdeki paket tekrar indirilmeye çalışıldığında uzak repoya uğraması gerekmez.
  3. pnpm, global store’dan projenin node_modules klasörlerine sabit bağlantılar oluşturur. Sabit bağlantılar, disk üzerinde orijinal dosyaların bulunduğu yeri gösterir. Örneğin, projenizde bir bağımlılık olarak foo varsa ve 1MB alan kaplıyorsa, projenin node_modules klasöründe 1MB alan ve global mağazadaki aynı miktarda alan kaplıyor gibi görünecektir. Ancak bu 1MB, diskte iki farklı konumdan adreslenen alanla aynıdır. Yani toplam foo 2MB değil, 1MB kaplar. Aynı paketler için her zaman yeni symlink oluşturulduğu için, hem hız hem de disk alanı açısından yarar sağlar

npm, pnpm veya Yarn, bir paket kurması gerektiğinde, bir dizi görevi yerine getirir. npm ve pnpm’de bu görevler paket başına ve sırayla yürütülür, yani bir paketten diğerine geçmeden önce tam olarak yüklenmesini bekler. Yarn ise bu görevleri paralel olarak gerçekleştirerek performansı artırır.

Tutarlılık

Node modül sisteminde her paketin bir versiyonu bulunmaktaydı. Versiyonlama biçiminde semantik versiyonlama usülü tercih edilmekteydi. Bilindiği üzere modül bağımlılıkları isim ve sürüm aralığı olarak package.json isimli dosyada tutulmaktaydı.

Örneğin, aşağıdaki amodule, lemodule modülünün sürüm olarak 1.0.0 ve yukarısı ve 1.0.7 ve aşağısına bağımlıymış. Onsuz yapamazmış.

{
“name”: “amodule”,

“dependencies”: {
“lemodule”: “>=1.0.0 <=1.0.7”
}

}

Fakat bu şekilde belirtilen sürüm aralıkları olası tutarsızlıklara açıktı. Örneğin sizin makinenizde 1.0.2 sürümü yüklüyken, arkadaşınızın makinesinde 1.0.4 sürümü yüklü olabilir. 1.0.2 de bulunabilecek bir olası bug tüm düzeni etkileyebiliyordu. Bunun bir de canlı ortamda karşınıza çıktığını bir düşünün!

YARN ise bambaşka bir bakış açısıyla yarn.lock adında özel bir dosya kullanmaya başlamıştı. Eğer projenizde yarn.lock bulunmuyorsa, YARN tarafından oluşturulmamakta ve güncellenmektedir. yarn.lock içinde, tam versiyon, paketin nereden indirildiği ve veri bütünlüğünün kontrol edilmesi için checksum bilgisi gibi bilgiler bulundurulur. Bu sayede aynı proje kullanıcılarının t anında aynı modül ağacıyla çalışması sağlanmış olur. Paketler ayrıca checksum bilgileri üzerinden kontrol edildiğinden gözler arkada kalmaz.

Bu yenilik çok cazipti ve geliştiricilerin endişelenmesi gereken bir şey değildi. Bununla birlikte, NPM v5.0.0’dan itibaren, NPM otomatik olarak aynı şeyi yapan kendi kilit dosyasını oluşturmaya başladı. Bu dosyanın ismi de Package-lock.json oldu.

Yarn’ın daha önce geliştirdiği bu yapı, npm’in da aynı çalışma mantığına dönmesi ile birlikte çok büyük fark yaratan bir avantaj olma özelliğini yitirmiş oldu.

Çıktı Detayları

Varsayılan olarak npm çok ayrıntılıdır. Örneğin, npm install <package> çalıştırıldığında tüm kurulu paketleri recursive olarak listeler. Öte yandan Yarn hiç de ayrıntılı değildir. Ayrıntılar diğer komutlar aracılığıyla alınabilir ama varsayılan olarak uygun emojilerle (Windows’ta değilseniz) çok daha az özet, ihtiyaç olan bilgileri listeler.

Güvenlik

Facebook’un Yarn’ı geliştirmesinin ana nedenlerinden biri, npm’in güvenlik konularını daha iyi ele almaktı. npm’de, paketlerin henüz daha kurulum sırasında otomatik olarak ve anında, hatta bağımlılıklarından otomatik olarak ve anında kod çalıştırmasına izin verilir. Bu özelliğin kolaylıkları olsa da, özellikle daha önce bahsettiğim production paketi oluşturma sürecinde oluşabilecek açıkları göz önünde bulundurarak birkaç güvenlik endişesi ortaya çıkarıyor. Tersine, Yarn yalnızca yarn.lock veya package.json dosyalarınızdan yüklenir. Daha spesifik olarak yarn.lock, aynı paketin tüm cihazlara yüklenmesini sağlar, böylece hataların farklı sürümlerin kurulma şansını büyük ölçüde azaltır.

Bu kaygılar yazım aşamasında hala yürürlükte olduğundan, Yarn’ın güvenlik açısından tercih edilebilir olduğunu düşünüyorum.

Komunite Verileri

Sonuç

npm’den alınmış bir fork olmamasına rağmen, Yarn npm’in birçok noktadaki eksiklerini kapattı. Teknolojiye yön veren şirketlerin ihtiyaçları ve sıkıntılarıyla birlikte geliştirilen Yarnnpm’in 5.0 sürümünden sonra bile komünite tarafından daha çok tercih edilmeye ve kullanılmaya devam ediyor. Buradaki tek sorun, Yarn’ın yol haritasının belli olmaması. Pnpm ise aktif olarak fazla proje geliştiren, bilgisayarında birçok farklı projede aynı kütüphaneler bulunan geliştiriciler için fark yaratıyor. Ama yine de kendi geliştirdiğimiz React Native projemizde de yaptığım denemelerde her seferinde yaklaşık %25’lik performans katkısı sunan Yarn, hem hali hazırdaki sorunları çözen öncü yapısı, hem de performans anlamında kattığı verimlilik ile benim de tercihim oluyor.

Peki sizin tercihiniz hangisi?

Kaynaklar:

https://www.kochan.io/nodejs/why-should-we-use-pnpm.html
https://medium.com/pnpm/never-ever-forget-to-install-a-dependency-1c39dd3bbb37
https://github.com/pnpm/benchmarks-of-javascript-package-managers
https://smddzcy.com/posts/2019-05-19/npm-vs-yarn-vs-pnpm-package-manager-comparison
https://flaviocopes.com/pnpm/
https://pnpm.js.org/en/about-package-store
https://iamturns.com/yarn-vs-npm-2018/
https://waverleysoftware.com/blog/yarn-vs-npm/
https://www.keycdn.com/blog/npm-vs-yarn
https://github.com/appleboy/npm-vs-yarn
https://dev.to/urfan/npm-vs-yarn-2a2e
https://ceaksan.com/tr/npm-node-package-manager/

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