STEM

STEM

Kotlin’de Özel Sınıflar

Herkese merhabalar. Kotlin serisinin 7. ve son yazısını okumaya başlamak üzeresiniz. Benim için hem yazarken hem de doküman karıştırırken öğretici ve keyifli bir süreçti. Buraya kadar gelen, 7 aydır birlikte bir programlama dili üzerine konuştuğumuz bütün okurlara teşekkür ederim. Umarım sizlere bir şey katabilmişimdir. Bu yazıda son basamağımız olan özel sınıflara değineceğiz.

STEM

Flutter’da Null Safety

Herkese merhaba! Bu yazıda sizlere null safety ve Flutter’da null-safety’den bahsedeceğim.  Dart geliştirici ekibinin hazırladığı null safety hepimizin heyecanla izlediği Flutter Engage etkinliğinde duyurulan Flutter 2.0’dan itibaren kullanılabilir durumda. Peki null kavramı ne anlama gelir? Basitçe null, İngilizce’de “hiçlik” anlamına gelir. Null değerinin varlığı, bir değerin olmadığını veya değerin bilinmediğini gösterir. Ayrıca null değeri karşılaştırılamaz, yani iki null değerini karşılaştırmak yine null verecektir. Çünkü karşılaştırılacak değeriniz tam anlamıyla hiçliktir. Null safety’i daha iyi öğrenmek için biraz geçmişe gidelim. Null pointer ya da null reference, 1965’de Tom Hoare tarafından icat edildi. Kendisi 2009’daki bir konuşmasında bundan “milyar dolarlık bir hata” olarak bahsedecekti. Tom, nesne tabanlı programlama için  kapsamlı bir type system tasarlıyordu. Bütün referans kullanımlarının güvende olduğundan emin olmak için en kolay çözüm olan null pointer reference implement etti ve bunun bir sonucu olan “Null Error” doğdu. [youtube v=”ybrQvs4x0Ps”] Null Safety Nedir? Her dilde bildiğiniz gibi integer, double, string olmak üzere birçok değer alan değişken türleri vardır. Bu değişken türleri bazen null bir değer aldığında uygulamamız bu null değerleri işleyemez. Null-safety ile birlikte aslında nullable (null atanabilen) ve non-nullable (null atanamayan) değişkenleri ayırt ederek daha güçlü bir yapı elde edilir. Null Safety’nin amacı “null” değeri ortadan kaldırmak değildir. Bir değerin sadece “hiç” olmasına izin vermek, bir dilin esnek ve kullanışlı olmasına fayda sağlar. Null safety’nin gerçek amacı, hangi değişkenlerin null değer alıp alamayacağının kontrolünü geliştiricilerin eline bırakmaktır. Böylece bu değerden dolayı oluşabilecek hataların ve çökmelerin önüne geçebilirsiniz. Flutter’da null-safety’den bahsetmek gerekirse Dart 2.12.0 sürümünden önce değişkenlere null değeri atayabiliyorduk ama bu değer fonksiyonların içerisinde kullanılırsa karşımıza bir hata çıkıyor. Dart 2.12.0 sürümüyle beraber herhangi bir değişkene null bir değer atadığım durumda dart analysis’de bir hata ile karşılaşacağız. Dart’a bir değerin null olabileceğini söylemediğimiz sürece, nun-nullable (null olamaz) olarak değerlendirilir. Bu bütün değerler için varsayılandır. Flutter ekibi, geliştiricilerin kullandığı API’lardan en popülerinin non-null olduğunu fark ettiği için non-nullable varsayılan tercih edildi. Peki eski kodlarımız artık işe yaramaz mı? İstediğiniz bir anda kodlarınızı kademeli olarak null-safety’e geçirmek mümkün. Aynı projede aynı anda null-safe ve Non-Null-Safe kod kullanmanız da mümkün. Ayrıca Flutter ekibi geçişte size yardımcı olacak araçlar da sağladı. Null-safety’nin tek avantajı daha az bug almak değil, daha küçük binary’ler ve daha hızlı çalıştırma imkanı sağlamasıdır. Dart dilinde Null Safety Bu aldığımız hata Dart dilinde null safety etkinleştirdiğimizde birinci değer değişkeninin null olamayacağı anlamına gelir ve bu değerin null olup olamayacağını belirtmediğimiz sürece null değerine sahip olamaz. Bu problemleri daha kodu çalıştırmadan önce bulabilmemiz için çok yardımcı olur. Artık bir değişkenin null olup olmadığını sürekli kontrol etmenize gerek kalmaz. Kodunuzu daha güvenle yazabilirsiniz ve artık çalışırken null hataları yerine kod yazarken static hatalar alırsınız. Daha önce de bahsettiğim gibi null-safety’nin gerçek amacı, hangi değişkenlerin null değer alıp alamayacağının kontrolünü geliştiricilerin eline bırakmaktır. Peki nasıl? “Late” kelimesi, “?” ve “!” karakterlerini kullanarak Dart’da karşılaşacağımız null hatalarımıza çözüm bulabiliriz. Bunların nasıl kullanıldığını ve egzersizlerini Dart’ın kendi dokümantasyonunda da bulabilirsiniz. ? Operatörü Kullanımı Değişken türümüzün sonuna bir soru işareti (Null Aware Operator) eklemek Dart’a null değer kullanımına izin verdiğimizi söyler. O zaman bu hem kendi değişken türünde bir değer hem de null değer alabilir. Bu değişkeni nullable olarak belirlediğimiz zaman, bu değişkenden etkilenen kodları buna göre uyarlamazsanız yine hata alırsınız. Özellikle bununla ilgili Dart’ın codelab’inde bir sürü egzersiz bulunuyor. Bu egzersizler sayesinde bu özelliğe daha hakim olabilirsiniz. Late Kullanımı Değişkenimizin önüne “Late” koymamız ile Dart’a, bu değişkene değer atamadığımızı fakat ilk fırsatta değer atayacağımızı ve null yapmamasını belirtiyoruz. Bu sayede kodumuz, null gözüken değerin belirlendiği satıra kadar sorunsuzca çalışmaya devam edecektir. Burada “late” yerine “?” kullanmak da işe yarayabilir. Ancak “late” kullanmaktaki amacımız, kodun değer alana kadar sorunsuzca çalışmasını sağlarken null olmayacağından emin olmak. Ayrıca “late” başka güçlere de sahip, örneğin initializer bulunduran bir alanda “late” kullanarak bu alanı tembel hale getirebilir tam olarak bir üst düzey değişken veya statik alanda bir initializer gibi çalıştırabilirsiniz. Bu, bir alanın çalıştırılmasının maliyetli ya da gereksiz olduğu anlarda oldukça kullanışlı olabilir. Bir başka kullanım ise “late” ve “final” kombinasyonu. Bu şekilde normal bir “final” gibi anında çalıştırılması (initialize) yerine daha sonraya atayabiliyorsunuz. ! Operatörü Kullanımı Null Assertion Operator olarak da görebileceğiniz ünlem, daha önce nullable olarak belirlediğimiz değişkenin null değer alamayacağından eminseniz güvenlikten ve performanstan ödün vermeden önceden nullable olan değişkenler üzerindeki metodları daha sonra da çağırabilmenize olanak sağlar. Son olarak bunlar şimdiden göze karmaşık gelebilir, özellikle Dart’ın bu konuyla ilgili upuzun bir dokümantasyonu mevcut. Ancak hepsini özümseyip kodunuzu null-safety dünyasına adapte ettiğinizde sapasağlam bir uygulamaya ulaşmak için harcadığınız çabaya değdiğini içten içe hissedeceğinizi umuyorum. Null safety hakkında daha fazla bilgi edinmek için Understanding null safety | Dart ve CodeLab egzersizleri için Null safety codelab | Dart linklerine gidebilirsiniz.

STEM

Test Süreçlerinde Operasyonel Yönetim Disiplini: TestOps

Ops ops ops … TestOps, DevOps, DevSecOps… Nedir bu Ops, nereden çıktı, nasıl oldu da iş süreçlerimizin, iş akışlarımızın vazgeçilmez bir parçası oldu. Operasyonel süreçler neden bu kadar önem kazandı ve yazılım süreçlerine büyük fayda getirdi. Bu yazımda sizlere yazılımda hemen hemen her alanda olan operasyonel süreçlerin, test dünyasında nasıl şekillendiği, test dünyasına getirdiği artılar ve test dünyasında nasıl yer aldığından bahsedeceğim. Test süreçlerinde uçtan uca test ihtiyaçları her geçen gün uygulamaların gelişmesiyle ve yeni trend teknolojilerin kullanılmasıyla artarken, test operasyonel süreçlerinde de iki ana trend karşımıza çıkmaktadır. Test operasyonel süreçleri web uygulama testlerinde B2B ve B2C amaçları için önemini artırırken, browser’ların her geçen gün gelişmesi ve değişmesiyle, asıl olan uygulama kodu, browser üzerindeki uygulamaların front-end tarafına kaymıştır. Test operasyonel süreçlerindeki ikinci trend ise, birçok development metodolojileri daha hızlı tekrar ve versiyonlama sağlıyor. Development ekibi teslimatı ve development sürecini yavaşlatmadan, test ekibine kodu teslim etmek zorundadır. Daha kısa ve daha sık aralıklarla development ve test ekibi arasında kod aktarımı yapılması gerekmektedir. Sonuç olarak, fonksiyonel UI ve E2E otomasyon testlerine operasyonel bakış açısı çeviklik getirecektir. Aynı zamanda, shift-left testing, continuous testing ve agile testing yaklaşımları, test süreçlerinde daha fazla yetkin insan gücüne ihtiyaç olduğunu gösteriyor. Ayrıca developer ve product owner’ların test otomasyon süreçlerine ve test analist süreçlerine dahil olması gerektiğini ve olduğunun da bir göstergesidir operasyonel süreçler. TestOps, genellikle agile metodolojileri içerisinde yazılım test süreçlerini hızlandırmayı amaçlayan bir DevOps alt kümesi olarak tanımlayabiliriz. Test planı, test data management, test process organization, test management süreçlerini yönetebilmek ve bu süreçler hakkında bilgi alabilme süreçlerini içerir. TestOps konusunda farklı anlayışlar söz konusudur. Bu tanımlar test uzmanları ve iş birimi arasında omuz omuza bir çalışma ve yakın etkileşimi destekleyen tanımları işaret eder. TestOps kavramı ile, Test Otomasyon uzmanlarının görev tanımına yeni sorumluluklar eklenmiş, test ortamının kurulumu ve sürdürülebilirliği konusunda ciddi görevler verilmiştir. Otomatize edilen testleri koşmak için testlerin Docker gibi sistemlerde paketlenmesi, test edilecek yazılımın bu sistemlerde koşumunun başlatılması, koşumların tamamlanması ve koşum sonuçlarının istenilen şekilde raporlanması TestOps sürecinin bize sağladıkları arasındadır. TestOps ile birlikte, yazılım test türlerinin zorunlu yük ve güvenlik testleri ile genişletilmesi, test uzmanı için hem test ortamlarında hem de production ortamında tüm sistemleri izlenme sorumluluğunu da test uzmanına vererek, test uzmanının görev tanımını ve yetkinliklerini artırmıştır. Ayrıca TestOps özellikle test verilerinin oluşturulması için harcanan zamandan tasarruf etmek için kullanılan bir metodoloji. TestOps sayesinde izleme metriklerini analiz etmek için daha fazla zaman harcanmasına ve aynı anda tüm kullanıcılar yerine küçük test gruplarını etkileyen değişiklikler yapılmasına olanak sağlar. Bu da daha kaliteli test anlamına gelmektedir. Test süreçlerini olabildiğince hızlı hale getirebilmek için farklı araçlar yardımıyla manuel ve otomasyon testlerini gerçekleştiriyoruz, aynı şekide production ortamında yine aynı hızı elde etmek için tüm süreçleri TestOps yardımı ile bir adım öteye taşımız oluyoruz. DevOps ekibi süreçlerin hızlandırılmasına yardımcı olur, Genellikle belirli bir şeyi test etme zamanının yüksek olduğu ve ürünün hızlı bir şekilde, zamanında teslim edilmesinde büyük bir sorun olduğu düşünülür ve TestOps yaklaşımı ekibe, özellikle DevOps ekibine bu konuda fazlasıyla yardımcı olur. TestOps işlevinin iyi çalışıp çalışmadığını doğrulamak için, yüksek unit test kapsamı ve sıfır bug politikası ile yaklaşım izlenebilir. TestOps disiplinini daha etkili kullanmak ve daha çok fayda sağlamak için, use-case’ler, tool’lar ve test teknikleri geliştirilirken aynı zamanda ekipler arası iletişim ve çalışma modellerine de farklı bir bakış açısı getirilmelidir. Ayrıca yazılım/uygulama yaşam döngüsüyle ilişkili disiplinlerinde gelişmeye ihtiyacı vardır. TestOps disipliniyle ilgili birçok kuruluşun shift-left yaklaşımı olarak kullandığı yeni bir trend de mevcuttur. TestOps yazılım yaşam döngüsü ve test süreçleri boyunca aşağıdaki noktalara odaklanır. Test edilen sistemde kullanılacak test verilerinin hazırlanmasına. Manuel ve otomasyon test süreçlerinde, test tiplerinde TestOps trendlerinin kullanılmasına. Building development esnasında sorunu kontrol etmek ve çözmek için CI/CD kurulum bilgisine. TestOps, ekiplerin büyük otomasyon test suite’lerinin ölçeklendirilmesini sağlayan ve dört temel prensipten yararlanan bir süreçtir: Planning Control Management Insights TestOps, farklı test türlerini (birim, entegrasyon, uçtan uca) kapsar ve birden fazla test tool içerebilir. TestOps’un verimliliği artırabileceği bu alanlarda bu dört temel prensibe dayanır. Şimdi sırayla TestOps’un bu dört ana prensibini açıklayalım. Planning: Planlama, software development life cycle’ın başlarında yapılmalı ve hızlı yineleme için devam eden bir süreç olmalıdır. Planlama, ekibin genellikle algılanan risk, kod karmaşıklığı, mevcut kapsam veya diğer değişkenlere göre testleri önceliklendirmesine yardımcı olur. Neyi test edeceklerini, testin hedeflerini ve testi kimin yapacağını belirlemelerine yardımcı olur. Ürün ve işletme sahipleri, geliştiriciler ve kalite ekibi üyeleri, ekip uyumunu sağlamaya yardımcı olmak için kararlarını ortaklaşa planlamalı ve dokümante etmelidirler. Control: Kontrol, sürekli olarak yüksek standartlarda testleri nasıl oluşturduğunuzla ilgilidir. Daha önce belirtildiği gibi, küçük ekiplerle kişi hafızasına ve sözlü anlaşmalara güvenilirken, daha büyük ekiplerde süreçlere ihtiyaç duyulmaktadır. Test uzmanları, ekip üyelerine mevcut test bileşenlerini yeniden kullanma konusunda rehberlik edebilir. Gerekli incelemeler de dahil olmak üzere değişiklik kontrol süreçleri, en iyi uygulamaları standartlaştırmaya yardımcı olabilir. Management: Yönetim, testlerin, ekiplerin ve araçların organizasyonunu ve yönetimini temsil eder. Testler üzerinde kimin çalıştığını veya hangi testlere öncelik verileceğini koordine etmeyi içerebilir. Naming kuralları, labeling ve paketleri, klasörlerde testleri nasıl düzenlediğimize yardımcı olur. Flaky testler bizi yavaşlatmakla kalmaz, aynı zamanda takımın kendisine olan güvenini de zedeler. Insights: Insights, sürüme hazır olma durumu, proje kalitesini ve ekibin etkinliğini daha iyi anlamamıza yardımcı olmak için testlerimizde ve ekiplerimizden elde ettiğimiz bilgilere atıfta bulunur. Operasyonel yöne ek olarak, kalite sürecinin liderlerinin potansiyel süreç iyileştirmelerine de dikkat etmesi gerekir. Sonuçta öğrenme ve sürekli iyileştirme süreçleri kolaylaştırmaya, tekrarlayan sorunları ortadan kaldırmaya ve zamandan tasarruf etmeye yardımcı olabilir. Özetleyecek olursak, TestOps test süreçlerini operasyonel anlamda daha verimli daha proaktif gerçekleştirmemizi sağlayan bununla birlikte test uzmanı görev tanımını genişletirken kendisinden farklı yetkinlikler isteyen operasyonel bir yaklaşımdır. Bu trendin agile metodoloji gibi süreçlerle harmanlanarak kullanılmasının verimliliği daha çok artıracağı düşüncesindeyim.

STEM

Python İle Web Scraping: Temeller

Merhaba, Gün içinde birçok web sitede geziyoruz. Bu mecralardaki fotoğraf, tweet, yazı, fiyat gibi kayıtların aynı zamanda “veri” olduğunun pekala farkındayız. Bu verinin farkı ise bir veritabında, excelde veya csv dosyasında değil de bir web sitede ürün olarak karşımıza çıkıyor olması. Peki oluyor ya arada, bu sitelerdeki verilere ihtiyacımız olursa ne yapacağız? Kimi web siteler ücretli veya ücretsiz verileri API’lar ile kullanıma açabiliyor, kimisi tabloları indirme bağlantısı paylaşıyor; peki ya bunları sağlamıyorlarsa bu verileri nasıl alabiliriz? Yöntem basit, tek tek bütün satırları kağıt kalem ile kaydedebiliriz veya bir Excel tablosu açıp her gördüğümüz değeri tek tek Excel’e yazabiliriz ama efektif bir yöntem değil bu. Burada imdadımıza Web Scraping yetişiyor, bu yöntemle verileri tek tek kaydetme işlemini otomatize edebiliyoruz. Bu yazı serimizde Web Scraping ve kullanım alanları üzerinde duracağız. Yol haritamız şöyle: Web Scraping temelleri, E-ticaret sitelerinden otomatize scraping, Web Scraping kullanarak Twitter botu oluşturma. Web Scraping Web Scraping web sitelerinde sunulan içerikleri programlama dilleri yardımı ile alma yöntemidir. İşlem aslında tek tek siteleri tıklamamız ve gördüklerimizi kağıt kalem ile kaydetmemize eşdeğer bir süreç, sadece programlama dilleri saatler sürebilecek bu süreci saniyeler içerisinde gerçekleştirmemizi sağlıyor. Sitelerden sadece site yöneticilerinin kullanıcılara sundukları bilgileri (html, xml vb. formatta) alıyor olduğumuz için aslında yaptığımızda yanlış bir şey yok. Fakat içeriği kullanım amacınıza göre ilgili site yönetiminden izinler almanız gerekli olabilir. Eğer ki verileri çektiğiniz sitenin kazanç kaynağı ürünlerin fiyatlarını sunmak ise (ürün satmaktan farklı bu bahsettiğim), kullanıcıları bu sitelerdeki verileri görmek ve paylaşmak için ücret ödüyor ise bu sitelerden izinsiz veri çekme işlemleri hukuki yönden sıkıntılar çıkartacaktır. Bir web sayfasında mouse ile sağ tıklayıp “sayfa kaynağını görüntüle” dediğimizde karşımıza çıkan yazılar, karakterler aslında bizim gördüğümüz web sayfasının bütün detaylarının belirlendiği kısım. Web Scraping işleminde aslında o kısımda yer alan html taglarını ayrıştırarak odaklandığımız verileri aradan çekip çıkarıyoruz. Web Scraping örneklerimiz için çok çok basit düzeyde html bilgisi gerekiyor. Ben bu sürece “html okumak” diyorum, html’i yazabilmemize gerek yok Web Scraping için basit düzeyde okuyabilmemiz yeterli. Bu yazı serimizde çok basit düzeyde scraping işlemlerini göreceğiz ve bunun için Python – Beautiful Soup kütüphanesini kullanacağız. Seride kullanacak olduğumuz web sitelerini ise örneklerin nokta atışı ve daha anlaşılır olmasını amacıyla kendi oluşturduğum web sayfaları üzerinden ilerleyeceğiz. Bu yazıda kullanacak olduğumuz web sayfamız: https://bilative.github.io/sisterslab/web_scraping Uygulama Öncelikle daha önce kullanmadıysanız import öncesi beautifulsoup ve request paketlerinin pip installation işlemlerini yapmanız gerekecektir. Bu süreçte: İlk olarak bir web sitesine get request (istek) atıp bir kez sayfa içeriğini (html olarak) görüntülüyoruz. Bu işlem tarayıcıda sağ tıklayıp “sayfa kaynağını görüntüle” dediğimizde gördüğümüz tüm içeriği almamızı sağlıyor. Ve daha sonra bu html kodlarınını -elde etmek istediğimiz bulunduğu alanın bilgilerine göre- filtreleyerek gerekli bilgiyi aradan sıyırıp alıyoruz. İstek atma ve içeriği alma kısmında “request” paketinden yararlanıyor ve bu html kodlarının düzeltilmesi ve tag’ler olarak ayrıştırılması kısmında da Beautiful Soup paketinden yararlanıyoruz. Burada bahsettiğimiz gibi sayfa içerisindeki tüm html içeriği soup içerisine kaydedildi. Tablo Verilerini Kazımak Tablo verilerini kazımadan önce işimizi kolaylaştıracak bir işlem olarak web sayfasında “sayfa kaynağını görüntüle” işlemini yapıp “Ctrl + F” kombinasyonu ile tablo elemanlarını aramakta fayda var. Bu şekilde direkt kazımak istediğimiz bölümün taglerine ve class bilgilerine ulaşabiliriz. Örnek olarak bu alanda Ctrl + F sonrası “Icimizdeki Seytan” kelimesini arayalım. Direkt olarak gittiğimiz satırda “td” etiketinde “col9” class’ının belirlendiğini görebiliyoruz, ve tüm kitap isimleri “col9” class’ı ile tanımlanmış. Html td etiketi satırları gözelerini belirtir. Buradan aldığımız bilgiler doğrultusunda Beautiful Soup’a arama işlemimizin sınırlarını söyleyebiliyoruz. Bu şekilde tablonun tüm elemanlarına ulaşmak, filtrelemek ve bunları dataframe’e çevirmek bize kalmış. Örnek web sayfası üzerindeki daha detaylı örnekleri buradaki github reposundan görüntüleyebilirsiniz. E-Ticaret Verilerini Kazımak Ürün hakkında özet bilgileri barındıran ürün kutucuklarını tüm e-ticaret sitelerinde görebiliyoruz. Bu kutulara tıklayınca ürünlerin detaylı sayfasına ulaşabiliyoruz. Web sayfaları gezinirken direkt olarak göremesek de o kutucukta yazan bilgiler ile birlikte ürünün sayfasının linki ve satıcısının profil linki de o kutucuğa gömülü ve hatta oradaki küçük görselin de bilgisi de o kutucukta yer alıyor. Tıklayınca bizi yönlendiriyorsa o bilgi orada bir yerde olmalı, değil mi? Kaynak kodlarının olduğu kısma geldiğimizde mesela “Bilal Manavcilik” linkine ulaşmak istediğimizi varsayalım. Bunu aradığımızda “a” etiketi içerisinde yer aldığını, bir url barındırdığını ve “urun-satici” div’i içerisinde yer aldığını görüyoruz. O zaman bu şekilde bir filtreleme” işlemi yaparak bu bilgiyi ayrıştırmak da mümkün. Tüm ürün satıcılarının isimlerine ve profil url’lerine ulaşmak için ise şöyle bir yol izlememiz gerekiyor. Tabii ki de tekil olarak verileri almak pek bir şey sunmuyor bizlere, ürünlerin bilgileri ile dataframe oluşturma için de şöyle bir yol izleyebiliriz: Bu yazımızda çok basit düzeyde örnekler ile Python ile Web Scraping konusuna giriş yaptık. Değindiğimiz örnekler Web Scraping konusunda ilerledikçe en fazla kullanma ihtiyacı hissedeceğimiz 2 konuydu. İlk başlarda html bilgisi olmayanlara belki süreç karmaşık görünüyor olabilir fakat adaptasyon çok hızlı olacaktır ve kısa sürede html bilgisi de kazanmayı sağlayacaktır bu uğraş. Web Scraping gerçekten çok keyifli bir konu olmakla birlikte bazı püf noktalara da dikkat etmek gerekiyor. Serimizin sonraki adımlarında daha da derinleşerek bu alanda farklı kullanım örnekleri sunacağız. Bir sonraki yazıda görüşmek üzere.

STEM

Python ile Etkileşimli Dashboard Oluşturma

Merhaba, Daha önceki yazılarımızda veri tiplerine göre görselleştirme yöntemlerinden dashboard araçlarına kadar bir özel sunmuştuk. Veri görselleştirme serisinin bu son yazısında ise etkileşimli dashboard oluşturma konusuna değineceğiz. Serinin önceki yazılarına da ayrıca gözatabilirsiniz: Adım Adım Veri Görselleştirme: Tipler ve Tüyolar Adım Adım Veri Görselleştirme: Python Temelleri Adım Adım Veri Görselleştirme: Çeşitli Senaryolar ile Görselleştirme Adım Adım Veri Görselleştirme: Dashboard Oluşturmada Yardımcı Araçlar Toplu halde veri görselleştirme ile bilgi aktarımında amacımıza göre kullandığımız araç ve izleyeceğimiz yol değişebilir. Genel olarak durağan ve tek bilgi sunmayı hedefleyen görselleştirme görevlerimiz oluyor olsa da detaylı ve çok sayıda alt kırılımı olan veri setimiz veya araştırma konumuzda tüm bilgileri bir anda sunmak neredeyse imkansız olabiliyor. Diğer bir problem de farklı kişiler farklı bilgilere odaklanmak isteyebiliyor. Bu sebeple: Onlarca kategorik değişkenden hangisi veya hangilerini grafiğe dökmeliyim? Zamana bağlı onlarca numerik değişkenin hangisi veya hangilerini grafiğe dökmeliyim? x ve y seneleri arasındaki mi yoksa x+5 ve y+7 seneleri arasındaki verileri göstermeliyim? gibi soruların tek bir cevabı olamıyor. Burada görselleri oluşturma mantığımızı biraz değiştirmemiz, sabit girdi ile sabit bir grafik oluşturmaktan daha fazlasını yapmamız gerekiyor. Ve burada etkileşimli dashboardlara çıkıyor kapımız. Bir önceki yazıda bahsettiğimiz gibi dashboard oluşturmak bir çok farklı seçenek var. Yeteneklerimiz ve görev kısıtlarımıza göre farklı opsiyonlara yönelebiliriz. Powerbi ve Google Data Studio gibi opsiyonlar arayüz üzerinden seçimler yaparak veya Python gibi bir programlama dili yardımı ile de dashboard oluşturmak mümkün. Ben yine Python’dan ilerleyeceğim. Uygulama Üzerinden Dashboard Oluşturma ve Etkileşim Araçları Örnek olarak önceki yazılarda da kullandığımız “İBB Şehir Tiyatrolarında Sahnelenen Oyunlar Verisi”ni kullandım. Veri seti oyun adı, tarihi, oyun kategorisi, oyun tipi, sahne konumu ve ziyaretçi sayısı değişkenlerini içeren 27bin satır veriden oluşuyor. Toplamda 77 farklı salonu barındıran veri setinde kimi salonlarda binlerce kez oyunlar sahnelenmişken kimi salonlarda bir kaç kez oyunlar sergilenmiş. Her sahne içerisinde sergilenen oyunlar ve katılımcı grupları kendi içinde farklı desenler oluşturuyor. Bu gibi bir veri setinde oluşturulacak olan grafikler ancak farklı sorulara da aynı zamanda cevap verebilirse maksimum bilgiyi sunuyor. Bu konuda Python dash kütüphanesi ile oluşturmuş olduğum bir örnek dashboard üzerinde, dashboard etkileşim araçlarına ve etkilerine değineceğim. Kodlara github adresimden ulaşabilirsiniz. Şehir Tiyatrolarında Sahnelenen Oyunlar Verisi – (https://data.ibb.gov.tr/dataset/sehir-tiyatrolari-veri-seti/resource/79465ce9-8755-4b57-8e6c-def0c0caadc8) 15sn’lik bir incelemenin ardından genel olarak karşımızdaki 3 farklı grafiğin verdiği bilgiyi kolayca anlayabiliyoruz. Grafik başlıklarından da anlaşılacağı üzere spesifik sahnelere ait bilgiler sunulmuş, tüm veri setine ait bilgiler sunulmamış. Grafiklerimizin etkileşimli olması ve kullanıcının seçimleri ile yönetilebilmesini sağlayan aslında burada gördüğümüz dört farklı araç. Veri görselleştirmede bu araçların sırasıyla uygun kullanımlarına değinelim. 1. Dropdown Menu Dropdown menüler, içerisinde bulunan mümkün opsiyonlardan birini (çoklu da olabilir) seçmemizi sağlayan bir yardımcı araç. Etkileşimli dashboardlar oluştururken genellikle dropdown menüler ile kategorik değişkenlerin sınıflarını seçme imkanı sunuyoruz kullanıcıya. Kullanıcının seçtiği sınıfa göre veri setini daraltıyor ve görsellerin filtrelenmiş veri seti ile oluşturulmasını sağlıyoruz. Mesela bu örneğimizde “Fatih Reşat Nuri Sahnesi” seçildiğinde 27bin satır gözlemden sadece bu sahnenin bilgisini içerenleri kullanacağımızı belirtmiş olduk. Diğer görsellerin tümü sadece bu sahneye ait bilgileri kullanıyor oldu. Seçimi değiştirerek tüm bilgilerin farklı bir sahneye göre güncellenmesini sağlayabilirsiniz. Örnek diğer senaryolar ise şu şekilde olabilir: Araç plakasını seçerek, Uçuş ID’si seçerek, Meyve adını seçerek, sadece o meyve / grubun bilgilerini kullanarak görselleri oluşturmak 2. Button Buttonlar aslında her web sitede karşılaştığımız bildiğimiz bir yardımcı araçtır. Bir örneğini de burada gördüğünüz gibi random seçimler yaptırmak için ekliyor olduk. Fakat dashboardlarda buttonların kullanım genellikle hesaplama işlemlerini veya veri bilimi proje çıktılarından tahminleme motorlarını uygun değerler girildikten sonra tetiklemektir. Güzel bulduğum bir örneğine şuradan ulaşabilirsiniz. 3. Tarih Seçici Tarih seçiciler spesifik bir tarih veya 2 tarihin aralığını seçmemizi sağlayamaktadır. Zaman bilgisi ile birlikte tutulmuş büyük veri setlerimizde, kullanıcıların belirli zaman dilimlerine veya noktalara kolayca odaklanabilmelerini sağlamak için tarih seçicileri kullanıyoruz. Bazı veri setlerinizde buna ihtiyacınız olmayabilir fakat 100 sene boyunca tutulmuş kayıtları barındıran bir veri setinde 8 ocak 1995 tarihindeki bir değere odaklanmak isterseniz bu imkansız olacaktır. Tarih seçicileri kullanarak kullanıcı dostu, istenilen tarihe odaklanan, temiz bilgi sunulabilir görseller oluşturmak da mümkün olacaktır. Örneğimizde tüm grafikler seçilen tarih aralığındaki verilere göre güncellenerek kullanıcıya sunuluyor. 4. Radio Button – Opsiyon Button Kullanıcıların farklı opsiyonları bir arada görebildiği ve sadece birini seçebildiği bir yardımcı araçtır. Dashboardlarda da kullanıcıdan görmek istediği değişken veya kategori gibi bilgileri belirtmesi için kullanıyoruz, kullanıcı seçimine göre grafikleri güncelliyoruz. Buradaki örnekte direkt olarak kullanıcının görmek istediği grafiği seçmesini istedik. Seçimlere göre kullanıcının görecek olduğu grafikler şu 3’ünden biri olacak: Ek olarak bu araçları PowerBi veya GDS ile oluşturmak isterseniz programlar kendileri bu seçimleri aktif edebiliyor. Fakat eğer Python gibi bir programlama dili ile bu araçları kullanmak isterseniz arka plandaki uygun filtreleme, alt örneklemler alma ve doğru girdileri grafikler ile bağlama kısmı sizin omuzlarınızda, bu kısımlar zaman alsa da çok keyifli. Her ne kadar burada CSV dosyadan veriyi okumuş olsak da canlı akan / toplanan verileri de görselleştireceğiniz durumlarla karşılaşılabilir ve onlara uygun yaklaşımlar sergilemeniz gerekebilir (çok daha eğlenceliler). Veri görselleştirme serimiz boyunca en temelden başlayıp basit düzeyde de olsa tüyolar ve uygulama detayları paylaşıyor olduk ve bir dashboard ile bütün bir şekilde görsel çıktısını etkili bir şekilde sunmaya değindik. Çok defa uyguladıktan sonra giderek uzmanlaşılan konular olduğunu belirtmek gerek bu konuların. İlk yazı serim boyunca çok eğlendim ve genel olarak iş hayatımda da çokça kullanıyor olduğum başlıklar üzerinden bilgi aktarımları gerçekleştiriyor oldum. Anlattıklarımı profesyonel hayatta icra ediyor olsam da yazılarım amatörce olmuş olabilir. Seri boyunca gördüğünüz hatalarım, belirtmek/ paylaşmak istediğiniz herhangi bir konuda hakkında veya önerileriniz için benimle iletişime geçebilirsiniz. Bir sonraki seride görüşmek üzere.

STEM

Yabancı Dilleri Akıcı Konuşun: Sohbet Adacıkları

“Anlıyorum ama konuşamıyorum.” Klişeleşmesi nedeniyle artık espriye vurduğumuz ancak yabancı dil öğrenirken hala eskisi kadar karşılaştığımız bir sorun bu. Yeni bir dil öğrenmeye başladığımızda kendimizi ifade etmekte, dili öğrenmek kadar başarılı olamıyoruz. Dil bilgisi çalışıp, kelimeler ezberlesek ve kafamızda harika cümleler kursak bile, iş birisiyle konuşmaya geldiğinde, yine yeniden beynimizde konuşmak istediğimiz dilin yerinde yeller estiğini fark ediyoruz. Kem küm derken var olan iki gram özgüvenimiz de bedenimizi terk ediyor ve sonsuz döngü yeniden başlıyor.

STEM

Yapbozlar İle Büyük Resme: Beden Dilinin Önemi

Beden dili evrenseldir. Her durum ve ortamda kullanılabilir ve bunu okuyabilirsiniz. İletişimin %60’ını hatta bazen daha da fazlasını kapsayabilen sözsüz iletişim, aktarma ve anlamada güçlü rol oynar. Mesela bir arkadaşınız ile mesajlaştığınız zaman iletişimin sadece %7’lik kısmını kullanmış oluyorsunuz , emojiler ile desteklenmeye çalışılsa da yüzdelik kısım küçük bir oranda artıyor ve yüz yüze iletişim kadar sağlıklı olmuyor hiçbir zaman. Ses tınısı da sözsüz iletişim içerisindedir ve oldukça önemli bir etkendir. Ses tınımıza da duygu ve düşüncelerimiz yansır. Mesela telefon ile konuştuğunuzda karşınızdaki kişiye aynı cümleyi birincisinde sinirli ikincisinde heyecanlı ve mutlu bir şekilde iki kere söyleyin, yüzünüzdeki ifadeyi görmese bile bu duyguları rahatlıkla ayırt edebilir. Beden dilinin yanında ses tınısı da yalan yakalama gibi durumlarda sıkça kullanılır. Kendi beden dilimizi anlamamız ve etkin bir şekilde kullanmamız iyi ve başarılı bir etki bırakmamızı sağlarken aynı zamanda sözsüz iletişimde karşımızdakini daha iyi analiz edebilmemizi de sağlar. Her insan beden dilini okuyup öğrenebilir ama herkes iyi ve doğru analiz yapıp bir fazlasını yorumlayabilir mi burası muamma. Analiz yapılırken içinde bulunulan durum, ortam, konu ve şartlar gözetilmelidir. Bu bağlamlar dahilinde yapılacak olan analizin sağlıklı olacağı kesindir. Beden dilini hayatınızın her anında kullanabilirsiniz, bir doktorsanız hastanızı muayene ederken, bir ceo iseniz bir ihale toplantısında, bir iş verenseniz çalışan alacağınız zaman, çalışansanız mülakat esnasında vs. kullanabilirsiniz. Karşınızdakinin yalanını yakalayabilmek için, sizi seven ya da sevmeyen insanları ayırt edebilmek  için bu tarz kişisel hayat tecrübelerinizde de kullanabilirsiniz. Hatta dolandırılma gibi konularda da büyük kurtarıcınız olacak. Gözlem yeteneğiniz gelişeceği için bir süre sonra insanlarda bu saydıklarımdan daha fazlasını görebileceksiniz ve işte benim en önem verdiğim yer burası. İnsanlarda gördükleriniz sonucunda “önyargı” denen kavramı kırmış olacaksınız ,farklı bir bakış açısı edinebileceksiniz. Bu tabi ki sizin kendinizi ne kadar geliştirdiğiniz ile orantılı bir durum. Sözsüz iletişimi sadece yalan yakalama ,niyetleri ortaya çıkarma tarzı amaçlarla daha çok gündeme gelsede insanları anlama ve görülen mesajları alma olarak görmek bana daha anlamlı geliyor .  Joe Navarro Beden Dili Kitabı Sözsüz iletişimde iyi analiz için kendimizi karşıdaki kişinin yerine koymamız gerekiyor. Onun yaşadığı durumu yaşıyor gibi yapıp, verilen tepkilerin arkasındaki duygu-düşünce hatta belki yaşantı ve travmaları bile görebiliriz. Bu bir süre sonra empati yeteneğimizi geliştirir ,geniş bir bakış açısı sunar. Farkındalık arttırır ve olayların birbiri ile bağlantısını görüp yorum yapma yeteneğini de kazandırır. Her alanda karşımıza çıkabilen bu önemli olgunun bilimsel kanıtları mevcut. Sözel olmayan davranışları etkili bir şekilde okuyup yorumlayabilen ve karşılarındaki kişilerin bu davranışları (yani kendi davranışlarını) nasıl algıladığını yönetebilen insanların, bu beceriden yoksun olanlara kıyasla daha başarılı bir yaşam süreceği araştırmacılar tarafından ortaya konmuştur (Goleman, 1995, 13-92).  İletişimin sadece “aktarma” kısmı kullanıp “anlama” kısmı es geçiliyor ve ortaya günümüzün sorunlarından olan iletişim sorunu ortaya çıkıyor. İşte bu yüzden iletişim bana göre “karşılıklı aktarım ve anlama sanatıdır”. İnsanları dinlediğiniz zaman hep duyacağınız bir cümle vardır “beni kimse anlamıyor” peki biz kaç kişiyi anlıyoruz ya da en önemlisi kendimizi ne kadar anlıyoruz? İnsanların insanlarda aktarma ve anlama ile kendini bulabildiğine inanıyorum .Yaratılışı aynı olan ama bambaşka özelliklere sahip olan canlılar olarak birer yapboz parçası gibi birbirimizi tamamlıyoruz. İlk insanlardan  günümüze kadar bakıldığında hep bir topluluk olma bilincine sahibiz, tek başına devlet kuran insan gördünüz mü? Birbirimizi tamamlıyoruz aslında, birbirimize iyi geliyoruz. Her yapbozun her parçası birbirine uymuyor, birbirinin aynısı değil tabi, yoksa büyük resim nasıl ortaya çıkar? Buradan da her insanın her insana uymadığını anlayabiliriz. Uymayan yapboz parçası ile zaman kaybedip yıpranacağımıza uyan yapboz ile yol alıp güzel bir resim çıkarmamız daha mantıklı. İşte o yapbozu bulmamız anlamaktan geçiyor. Önce nasıl bir yapboz parçası olduğumuzu görüp anlamalıyız sonra bize uymayan parçalardan uzaklaşıp doğru parçayı bulmalıyız. Bu anlama ve bulma süreci iletişim ile sağlanır .  İletişim işte bu kadar önemli bir konu. Bu önemli olgunun büyük çoğunluğunu beden dilinin oluşturması beden dilinin ne kadar önemli olduğunu gayet net ifade ediyor. Diğer yazılarda görüşmek üzere… 🙂

STEM

Kotlin’de Nesne Yönelimli Programlama (2)

Herkese merhabalar. Geçtiğimiz yazıda Kotlin’de nesne yönelimli programlamaya ufak bir giriş yapmıştık. Bu yazıda ise nesne yönelimli programlamada kullanılan diğer kavramlardan bahsedeceğiz. Kalıtım (Inheritance) Önceki yazımızda bahsettiğimiz gibi, her sınıf nesne üzerinde çalışmak için özellikler ve yöntemler içerir. Peki biz bu özellikleri nasıl kullanacağız? Burada devreye kalıtım (inheritance) giriyor. Nesnelerin özelliklerinin ve yeteneklerinin üst sınıftan alt sınıfa miras alınmasına kalıtım denir. Kalıtım kodun tekrar kullanılabilirliğini arttırır. Kotlin’de tek ebeveynli (single-parent) sınıf kalıtım yapısı vardır. Her sınıf bir parent sınıfına sahiptir ve buna superclass denir. Her alt sınıf (subclass), üst sınıfın miras aldığı olanlar da dahil olmak üzere üst sınıfın bütün üyelerini miras alabilir. Kotlin’de sınıflar default olarak final’dır. Yani miras alınamazlar. Bir sınıfı kalıtsal hale getirmek istiyorsak başına open anahtar sözcüğünü getiririz. Bir önceki yazımızda sınıf kavramından bahsederken bir Car sınıfı oluşturmuştuk. Aynı sınıfı ele aldığımızı varsayalım ve bunu kalıtıma uyarlayalım. Araba özelliklerini tuttuğumuz bir sınıf oluşturduk ve bunu open anahtar kelimesiyle tanımladık. Bu sınıfta sadece renk, model ve satılık olup olmadığının bilgisini tutuyoruz. Şimdi Car adında ikinci bir sınıf oluşturalım ve bunu oluşturduğumuz ilk sınıfa bağlayalım. Bu sınıfın başında da open anahtar sözcüğünü kullandık çünkü bu sınıf ara sınıf görevi görecek. Görüldüğü üzere Car sınıfına ait brand parametresi dışında CarProp sınıfındaki parametreler de parantez içinde mevcut. Yani artık Car sınıfından CarProp sınıfındaki bütün özelliklere erişilebilir. Buna kalıtım denir. Aracın kasa tipini tutacağımız başka bir sınıf daha oluşturalım. CarType’da tutacağımız type bilgisi dışında diğer bütün özelliklerin yine bu sınıfa da aktarıldığını görmüş olduk. Şimdi main fonksiyonu içinde bu özellikleri nasıl kullanabileceğimize bakalım. CarType sınıfından car adında bir nesne oluşturduk. Car nesnesi görüldüğü üzere mevcut bütün özelliklere erişebilmektedir. Kodumuzun çıktısı şu şekildedir: Car brand: Opel Car type: Sedan Car color: Black Car model: 2020 Is for sale? : true Interface (Arabirim) Nesne yönelimli programlamanın temel yapılarından biri olan interface, classlarda yapılacak ortak işlemleri deklare etmek için kullanılır ve ilgili classlara implement edilir. Yapı şu şekildedir: interface  InterfaceAdı {  //kod  } Bir örnekle açıklayalım. AverageGrade adında bir interface oluşturduk ve Grade adında bir sınıf tanımladık. Kod bloğunun içinde calculate metodu override edildi. Bu interface’i implement eden herhangi bir sınıf interface içindeki metodu override etmek zorundadır. Overriding Bir metodun tekrar yazılması işlemine override denir. Herhangi bir sınıfa kalıtım yoluyla ya da interface kullanarak dahil edilen metotlar bu yöntemle değiştirilerek tekrar yazılabilir. Interface yapısında override zorunlu bir işlemdir. Abstract Class Tekrar kullanılmak istenen bir görevi ya da özelliği başka sınıflara devretmek için kullanılır. Kalıtım uygulanan diğer sınıflardan farkı ise abstract classtan nesne üretilemez. Tanımlama yaparken abstract anahtar sözcüğünü kullanırız. Bir örnekle açıklayacak olursak: Abstract sınıflar doğrudan başlatılamaz ve subclasslarda (alt sınıflarda) override edilmesi gereken işlemler olabilir. Abstract classlar metotların ve özelliklerin subclasslara implement edilmesi bakımından farklıdır. Yukarıdaki örneği baz alacak olursak eat() metodunu direkt olarak devraldığımızı görürüz. Fakat bazı özellikleri override ederek kullanmak zorunda kaldık. Extension Function Kalıtım kullanmadan bir sınıfı yeni işlevlerle genişletmek (extend) istediğimizde extension fonksiyonlarını kullanırız. Bu yöntemle kod üzerinde değişiklik yapmamıza da gerek kalmaz. Kotlin’de kalıtım mantığından ve kalıtım için diğer gerekli özelliklerden bahsetmiş olduk. Kotlin serimizin sonuna yaklaşmaktayız ve eğer buraya kadar geldiyseniz umarım keyifli bir yolculuk olmuştur. Bir sonraki yazıda Kotlin’de kullanılan özel sınıflardan bahsedeceğiz. Bir sonraki yazıda görüşmek üzere, hoşça kalın.

STEM

Zihin Aynamız: Beden Dili

Bu konuya kendimce kısa bir iletişim tanımı yaparak başlamak istiyorum. İletişim; karşılıklı aktarımdır ve anlama sanatıdır. Farklı yollarla bir şeyleri aktarmak, eğer aktarım verimli olursa da birbirini anlamaktır. Sadece insan-insan arasında değil tüm canlılar arasında olan temel bir olgudur. İnsanlarda iletişimin %7’sini kelimeler, %33’ünü ses tonu oluştururken %60’ını beden dili oluşturur, burada “ne dediğiniz değil nasıl dediğiniz önemli” sözünü de doğrulamış oluyoruz. Sözel olmayan davranışları etkili bir şekilde okuyup yorumlayabilen ve karşılarındaki kişilerin bu davranışları (yani kendi davranışlarını) nasıl algıladığını yönetebilen insanların, bu beceriden yoksun olanlara kıyasla daha başarılı bir yaşam süreceği araştırmacılar tarafından ortaya konmuştur. (Goleman, 1995,13-92). Joe Navarro -Beden Dili kitabı görselleri Beden Dili Tam Olarak Nedir? Beden dili; düşünce ,niyet ,ruh halinin bedene yansımasıdır . Karşınızda oturan bir insanın ne düşündüğünü, bir konu hakkındaki fikrini-yaklaşımını, o anki ruh halini, sevdiği-sevmediği ya da etkilendiği şeyleri yani zaaflarını görebilirsiniz ki bu listeyi uzatabilirsiniz bu da sizin kendinizi ne derece ilerlettiğinize bağlı. Kısaca beden dili insanları okuma sanatıdır. Buna limbik sistemimiz sebep olmaktadır. Limbik sistemi anlamak ve bilmek beden dili açısından önemlidir. Limbik sistem genel olarak öğrenme ve hatırlama merkezidir. Limbik beyin; bir şeyi öğrendikten sonra kendine kısa yol oluşturup otomatik bir şekilde yapmaya devam eder. Günlük alışkanlıklarımız ve hayat karşısında verdiğimiz tüm reflekssel ve anında tepkiler limbik beynin kontrolündedir. Don-savaş-kaç mekanizmamız limbik sistemimiz sayesindedir.  Bir uyarıda limbik sistemimiz ani tepkiler verir ve bu tepkiler bedenimize yansır. Düşünülmeden verilen bu tepkiler bizim asıl duygu, düşünce ve niyetimizi belli eder. Bu yüzden limbik sistemimiz ve bedene yansıyan mesajları dürüsttür. Bu dürüst sistemin en dürüst organı ise ayaktır. Limbik sistemimiz sinir sistemimize bağlı olduğu için engellenmesi ve kontrol edilmesi çok zordur. Limbik sistem, geniş ve detaylı bir konu olduğu için özenle anlatılması gerektiğini düşünüyorum, bu kısımda çok küçük ve genel bir şekilde beden dili ile bağlantısını anlattım ama serinin devamında sadece bu sisteme ait bir başlık ile detaylı anlatım yapmayı planlıyorum. Beden Dili Nasıl Ortaya Çıkmıştır? Beden dili tarihini net bir şekilde belirlemek mümkün değildir. Çünkü insanlar sözlü iletişimi etkili kullanmadan önce de beden dili ile iletişim kurdukları düşünülmektedir. Yani hep bizimle beraber olan bu dilin net bir şekilde ortaya çıkmak gibi bir tarihi yoktur. Yetenek ve doğal bir sezgi de barındıran bu dili fark edip kullanan kişiler de vardır tarihte. (Serinin devamında bunlar hakkında örnekler vermeye çalışacağım.) Sözsüz iletişimin tarihine bakacak olursak beden dilinin fark edilip yaygınlaşması 20.yüzyılda olduğu söylenmektedir. Bu alandaki ilk ciddi çalışma İngiliz filozof, bilim insanı, hukukçu, devlet adamı ve yazar olan  Francis Bacon tarafından hazırlanmıştır ve 1605 yılında yayınlanmıştır. Francis Bacon jest ve mimiklerin insanların iç dünyalarının dışa yansıması olduğunu belirtip, “Dil kulaklara seslenirken, beden dili göze hitap eder.” özlü sözü ile bu durumu özetlemiştir. Ayrıca sözsüz iletişimden bahsederken de bu alanda çokça okuduğum ve bu alanın en iyilerinden olan Amerikalı yazar, konuşmacı, eski FBI ajanı ve denetçisi olan Joe Navarro’yu da tanıtmak isterim .Bu alanda çeşitli makale ve çokça kitaba sahip olup bu alanda birçok üniversite de ders vermiştir. FBI ajanı olarak beden dilini her zaman kullandığını bu şekilde birçok olayı rahatlıkla çözebildiğini kitaplarındaki örnekleri ile görebilirsiniz. Aslında insanları anlamak istediğimiz zaman görebileceğimiz çok şey var. Beden dilinin en güzel yanı size görmeyi öğretmesi. Bir kelimenin arkasındaki duyguyu, bir bakışın anlamını, bir omuz hareketindeki niyeti, bir gülüşteki küçümsemeyi, bir mutluluğun arkasındaki gizli acıyı, bir duruşun düşüncesini, bir ses tınısındaki yalanı görmeyi, belki de bir öfkenin arkasındaki asıl yaşanmışlığı dolaylı ya da doğrudan görmeyi öğretir. Bu kadar çok şeyi gördükten sonra hayatınızın değişmemesi, bakış açınızın genişlememesi mümkün mü? Kendi gözlemlerimden yola çıkarak bu soruya ‘kesinlikle hayır’ cevabını verebilirim. Kendimizi ve başkalarını anlayıp kendimiz ve çevremiz ile sağlıklı iletişim kurmamız mümkün. Bir sonraki seride neden bu mümkünlüğün bu kadar önemli olduğunu anlatacağım. Serinin devamında görüşmek dileğiyle 🙂

Scroll to Top