Hash/Encryption/Decryption

Önemli bilgilerimizi saklamak isteriz. Birileri bu bilgilere kolayca erişemesin, erişse bile kolayca anlaymasın isteriz. Ya da birisine bir bilgi gönderirken gönderdiğim bilginin gizli ve doğru bir şekilde karşı tarafa ulaşmasını isteriz.

Bunu yapmak için sistemler bizlere çeşitli önlemler sağlar; örneğin bir e-posta servisini kullanıyor olun, bu servis size bir kullanıcı kodu ve parola sağlayacaktır. Servisin sizi tanıyabilmesi için tabiki belirlediğiniz parolayı bir veritabanında saklaması gerekmekte. Bu e-posta servisinin size özel olan parolayı kimsenin anlayamayacağı şekilde saklaması gerekmekte. İşte bu noktada da şifreleme karşımıza çıkıyor. Parolanızın veritabanında şifreli olması gerekli ki bir şekilde e-posta servisinin veritabanı kötü niyetli kişiler tarafından ele geçirilse bile parolanız kolaylıkla anlaşılıp ele geçirilemesin.

Farkında olmasak bile internette sörf yaparken bazı siteler bizlere kendilerine erişimde güvenliği sağlıyorlar. Bunu browserların adres çubuğundaki yeşil ikonlar ile anyabiliyoruz. Bu demek oluyor ki o siteye girdiğinizde yaptığınız her işlem sadece sizin ve o sitenin anlayabileceği şekilde gerçekleşiyor. Networkünüzü gizlice dinleyen kötü niyetli yazılımlar/kişiler sizin o site ile aranızdaki bilgileri ele geçirse bile anlayamıyor çünkü bilgiler şifreli şekilde transfer ediliyor.

Cep telefonlarımızda bile “cihazı şifrele”, “SD kartı şifrele” gibi özellikler mevcut. Bu işlem de telefonunuzu kaybetseniz bile içerisindeki verileri kimsenin anlayamamasını sağlıyor.

Hayatımızda birçok yerde biz farkında olmasak bile sistemler hem kendilerini hemde kullanıcılarının güvenliğini sağlamak için şifrelemeyi kullanıyorlar.

Öncelikle şifreleme algoritmalarının kullanıldığı bir alan olan, yukarıda da değindiğim hashing konusundan bahsetmek istiyorum.

Hashing

Hash; bir metinden üretilen başka bir metin veya sayıdır. Ortaya çıkan metin veya sayı sabit uzunlukta ve girdideki içeriğe göre çok geniş çapta değişen yapıdadır. En iyi hash algoritmaları hash kodunu orjinal haline geri dönüştürülemeyecek şekilde üretmek için tasarlanmışlardır.

En popüler hashing algoritmaları; MD5, SHA, SHA-2’dir.

Bir web sitesinden bir program indirirken indirme linklerinin yanında birde “download check sum” linkleri görürsünüz; bu link ile karmaşık bir kod indirirsiniz ve bu kod ile indirdiğiniz dosyayı doğrularsınız. İndirdiğiniz bu kod dosyanızın tamamından bir şifreleme algoritması ile elde edilmiştir. Dosyayı indirdikten sonra sizde çeşitli programlar kullanarak indirdiğiniz, bilgisayarınızda olan dosyanın kodunu üretebilirsiniz. Ürettiğiniz bu kod ile sağlayıcının size verdiği kodu karşılaştırarak dosyanın değişmemiş olduğunu anlarsınız. Dosya bir şekilde değişmiş olabilir, bunu ancak bu şekilde anlayabilirsiniz. Bu işleme hashing denilmektedir.

Bunun yanında yukarıda bahsettiğim gibi sistemler parolaları veritabanlarında saklarlar ve bunları şifreli olarak saklarlar. Hashing işlemi parola saklama sürecine çok uygun bir yapıdadır. Çünkü saklanan hash verisinin geri dönüştürülmesi imkansızdır.

Bu tarz verileri saklarken oluşan hashi tahmin etmesi zor hale de getirmek gerekebilir. Yani brute force yönemler ile saklanan hash verisini tahmin edebilirler. Bunu önlemek için hash işlemi yapmadan önce veriye salt(tuz) diye adlandırılan farklı bir veri daha eklenir. Bu sayede brute force yöntemi ile tahmin etmeyi daha da zorlaştırmış oluruz.

Algoritma(Şifrelenecek metin + salt) = hash kodu

Yukarıda hashing işlemi ile bir veriyi geri dönüştürülemeyecek şekilde saklamadan bahsettim. Peki şifrelenmiş olarak saklanan ve geri dönüştürülmesi gereken durumları nasıl yönetebileceğimizden bahsedelim.

Encryption / Decryption

Bir uygulamada kullanıcıya gönderdiğimiz parola e-postasını saklamak istiyoruz, çünkü ne zaman kaç adet parola e-postasının gönderildiğini raporlamak istiyorum ya da e-postanın gönderilme esnasında bir hatadan dolayı gönderilememesi durumunda tekrar gönderecek bir yapı oluşturacağım. Fakat parola e-postası içerisinde sadece kullanıcının bilmesi gereken parola bilgisi var. E-postanın gönderim esnasında hataya düştüğünü varsayıyorum ve tekrar göndereceğim, bu durumda veritabanına şifreli kaydettiğim e-posta içeriğini çözümleyip tekrar e-posta sunucusuna göndermeliyim.

Ya da iki sistem arasında veri haberleşmesi yapmak istiyoruz fakat veriler güvenli bir şekilde transfer edilmeli. Yani elimde bir metin var bunu şifreleyeceğim, herhangi bir yöntemle(tcp, http…) karşı sisteme transfer edeceğim ve sonrasında karşı sistem bu şifrelenmiş veriyi çözüp anlaşılır hale getirecek ve kullanacak.

Bu tarz durumlarda kullanılmak üzere iki çeşit yöntem vardır;

Simetrik Anahtarlı Şifreleme / Asimetrik Anahtarlı Şifreleme

Simetrik Anahtarlı Şifreleme; Bir arabanız olduğunu düşünün arabayı açıp kapatırken anahtar kullanırsınız. Şifrelemede de durum aynıdır. Veriyi şifrelerken ve çözerken elinizde aynı anahtar olmalıdır.

Simetrik anahtarlı şifrelemede elinizde tek çeşit key (anahtar) bulunur ve bunu sadece belirlenen taraflar bilir. Yukarda bahsettiğim parola e-postası şifreleme işlemi için simetrik anahtarlı şifreleme uygundur.

Asimetrik Anahtarlı Şifreleme; Bu yöntemde iki adet key(anahtar) olması gerekir. Bunlara public key ve private key adı verilir. Bu anahtarların çalışma şekli şöyledir; Private key ile şifrelenmiş veri sadece public key ile çözülebilir ya da public key ile şifrelenmiş veri sadece private key ile çözülebilir.

Bu yöntem yukarıda da bahsettiğim HTTPS (SSL/TLS) ile web sitelerinin güvenli veri transferi yapmalarında kullanılır. HTTPS protokolünde private key web sitesi serverinde bulunur, public key ise herkesin erişebileceği şekildedir. Browserler HTTPS ile erişim yapılmaya başlandığında öncelikle public key’i indirir ve sucuya verileri transfer ederken public key ile verileri servere şifreleyerek transfer eder. Gelen verileri sunucu private key ile çözümleyip kullanır.

Asimetrik anahtarlı şifreleme için kullanılan popüler algoritma RSA tercih edilebilir.

Evet hayatımızın birçok yerinde şifreleme var fakat yaptığımız şifreleme işlemi ne kadar güvenli ne kadar güçlü? Yaptığımız şifreleme işleminin güçlü olması önemlidir. Bir şekilde verilerimiz şifrelenmiş olarak dahi birilerinin eline geçse çeşitli yöntemler ile şifrelenmiş veri çözülebilir.

Temel amaç bir bilginin güvenli bir şekilde başka bir tarafa gönderilmesi ya da saklanıp tekrar geri alınmasıdır. Burada şifrelemenin iki önemli özelliği ortaya çıkmaktadır gizlilik ve doğruluk/güvenilirlik.

Herhangi bir şifreleme işlemini güçlü hale getirmek için aşağıdaki parametrelerin doğru şekilde yapılandırılması gerekmektedir;

  • Algoritma(Algorithm) 

İki tür şifreleme yönteminden bahsetmiştik, her şifreleme türünde farklı algoritmalar kullanılmaktadır. Son dönemde türlere göre önerilen algoritmalar; simetrik şifreleme için AES, asimetrik şifreleme için RSA’dır. Bu türlere göre şifreleme işlemi yapılırken farklı operasyon modları kullanılır. Bu operasyon tipleri şifreleme algoritmalarının nasıl uygulanacağını belirler. Bu konuyu biraz daha detaylı olarak operasyon modları bölümünde inceleyeceğiz.

  • Başlangıç Vektörü(Initialization Vector – IV)

Bir metni sabit bir key ile şifrelediğinizde sonuç olarak oluşan şifrelenmiş metin her zaman aynı olacaktır. Bu durum şifrelenmiş metnin üzerinden çeşitli paternler çıkartarak açık metni tahmin etmeyi kolaylaştırır. Bu sebepten GCM gibi operasyon modları ile şifreleme işlemi esnasında açık metnin başına random IV ekleyerek her seferinde şifrelenmiş metnin farklılaşmasını sağlar ve tahmine bağlı çözümleme saldırılarını engellemiş oluruz.

  • Doğrulama Etiketi (Authentication Tag)

Yukarıda bahsettiğim şifrelemenin iki önemli özelliği olan gizliliği ve doğruluk/güvenilirliği sağlamak için diğer bir yöntem bulunmaktadır. IV ile verinin gizliliğini arttırabiliyoruz. Verinin doğruluğunu/güvenilirliğini arttırmak için ise Authenticated Encryption(AE) yöntemleri kullanılabiliyor. Bu yöntemlerin çalışma şekli kısaca şöyledir;

Blok şifreleme işleminde algoritmanın özelliklerine göre metin bloklara ayrılır. Yukarıda görüldüğü gibi açık metin bloklara ayrılarak şifreleme anahtarı ile şifreleniyor. Sonrasında bu metinlerden MAC(Message Authentication Code) üretmek için hash işlemi gerçekleştiriliyor. Oluşan bu MAC’lerden sonuç olarak bir TAG oluşturuluyor. Tag bilgisi şifrelenmiş metin ile birleştirilerek karşı sisteme gönderiliyor. Karşı sistem şifrelenmiş metni elindeki key ile çözümlüyor. Gönderilen mesajın güvenilir olduğunu anlamak için ise tag bilgisini kullanıyor. Şifreleme işlemi sonrası oluşan şifrelenmiş data şöyle olur; (şifrelenmiş data + tag).  Karşı sistem elindeki key ile metni çözümler, tag bilgisini tekrar oluşturur ve kendi oluşturduğu tag ile karşı sistemden gelen tag bilgisini karşılaştırır. Bu şekilde gelen veririn doğrulamasını yapmış olur.

  • Ek Veri (Additional Data – AD)

Doğruluğu arttırmak için kullanılan diğer bir parametre olan ek veri kullanılır. AD bir header bilgisi gibi düşünülebilir. Verinin kaynağına dair(IP, Domain name vb.) bilgiler içerir. Karşı sistem AD ile verinin kaynağını doğrulayabilir.

  • İşlem Modu (Mode Of Operation)

Belirlenen algoritmanın veri bloklarını nasıl şifreleyeceğini belirleyen parametredir.

ECB – Elektronik Kod Defteri( Electronik Code Book) : Bu yöntem mesajı bloklara ayırır ve her birini ayrı ayrı şifreler. Bu yöntem kullanılarak uygulanan algoritmaların sonucunda oluşan şifrelenmiş metin hep aynı olur.

CBC – Şifre Bloğu Zincirleme (Cipher Block Chain) : Bu yöntemde her blok şifrelenmeden önce kendinden önce şifrelenen blok ile XOR işlemine tabii tutulur. Bu sayede her şifreli metin bloğu kendisinden önce gelen tüm açık metinlere bağımlı olmuş olur. Ayrıca bu yöntem IV’yi deteklemektedir. IV kullanarak aynı key ile her seferinde farklı şifrelenmiş metinler oluşturulur.

GCM – Galois/Sayaç Modu(Galois/Counter Mode) : Bu yöntemde her blok numaralandırılır sonra her bir blok belirlenen algoritma ile şifrelenir. Şifreleme sonrası oluşan metin açık metin ile XOR işlemine tabii tutulur. Paralel olarak işlenebilir, bu sebepten çok hızlıdır.

Bunlar gibi farklı operasyon modları bulunmaktadır. Yapacağınız işin detayına göre farklı modlar tercih edilebilir.

  • Dolgulama (Padding)

Blok şifrelemede metinler şifrelenirken belirli bloklara ayrılırlar. Bu bloklar algoritmaya göre değişebilir. Örneğin AES algoritması 128 bitlik bloklar kullanır. 364 bitlik bir metni AES ile şifrelemeye çalışırken metin 3 bloğa ayrılır. Fakat son blokta 20 bitlik bir boşluk bulunmaktadır. Bu boşluğu doldurmak için padding yöntemleri kullanılır.

 

Özetleyecek olursak; bilgilerimizin güvenliğini sağlamak için sadece şifrelemek yetmiyor. Doğru şekilde doğru parametreler ile şifrelemek gerekiyor. Olabildiğince şifreleme işleminde nelere dikkat etmemiz gerektiğini paylaşmaya çalıştım.

Bu blog girdisine dair şuradaki linkten kodlara erişebilirsiniz.

Kaynak;

https://www.veracode.com/blog/research/encryption-and-decryption-java-cryptography

http://searchsecurity.techtarget.com/Understanding-encryption-and-cryptography-basics

https://en.wikipedia.org/wiki/Authenticated_encryption

https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html#Cipher

https://www.securityinnovationeurope.com/blog/page/whats-the-difference-between-hashing-and-encrypting

Swagger – Springfox MVC/RESTful Api Dökümantasyonu

Son dönemde RESTful servislerin popüler olması ile birlikte birçok yer projede bu servisleri görüyor. Hem geliştirirken hemde kullanırken farklı yöntemlerle işlerimizi yürütüyoruz.

RESTful servislerin doğası gereği bir tanım belgesi mevcut değil. Bu durum başlarda pek problem gibi görülmese de proje büyüdükçe ciddi bir problem haline dönüşüyor. Servisleri kullanmak için başka taraflara verdiğimizde bir dokümantasyona ihtiyaç olmakta. Hadi diyelim ki dokumanı hazırladık, geliştirme hengamesi içerisinde dokumanın güncelliğini sağlamakta ciddi bir problem haline geliyor.

Bu durumu çözümlemek için swagger grubu bir api dokümantasyon standardı belirlemiş ve bunu yayınlamış. Oldukça kullanışlı ve anlaşılır bir içerik sunuyor.

Sizde kendi apilerinizi dokümante etmek için bu standardı kullanabilirsiniz. Bu spesifikasyonu spring mvc/RESTful projeleri için uygulayan springfox projesini projenizee dahil edebilirsiniz.

Konuyla ilgili örnek uygulamaya aşağıdaki adresten erişebilirsiniz.

https://github.com/dilaverdemirel/springfox-swagger

Pentaho BI Server Community Edition

Merhabalar, uygulamalarınız için bir BI(business intelligence) aracına ihtiyacınız varsa Pentaho BI CE(community edition) genel olarak işinizi görecektir. Uygulama hakkında bir fikir edinmek için bu yazıya göz atabilirsiniz. Uygulamanın sunduğu özelliklerden temel olanları anlatmaya çalıştım.

Start 🙂

http://community.pentaho.com/ adresinden “Business Analytics Platform” sekmesinden BI Server aracı indirilir. Uygulamayı türkçe bir platformda çalıştırmak için “biserver-ce\tomcat\bin” dizinindeki “catalina.bat” dosyasına yurakıda biryerlere aşağıdaki satırı ekleyin

set “JAVA_OPTS=%JAVA_OPTS% -Duser.language=en -Duser.region=US”

Uygulamayı çalıştırmak için “biserver-ce\start-pentaho.bat” komutunu çalıştırın. Sonrasında uygulama açıldı ise browserdan “http://localhost:8080/” adresine girmeniz yeterli.Uygulama düzgün açıldı ise aşağıdaki ekranı göreceksiniz. 6.1 versiyonunda sorun yaşadığım için 6.0 versiyonunu kurdum. Design araçlarının versiyonu biserver versiyonuna uyumlu olmalıdır. Aksi takdirde tasarladığınız bir raporu sunucuya yükleyemeyebilirsiniz.

server-login

 

 

 

 

 

Sonrasında admin olarak login olun. “Create New > Datasource” adımlarını takip ederek bir datasource tanımlayın. Burada datasource’a verdiğiniz raporları ve OLAB cube’ü yüklerken kullanacağınız için bu önemli.

Bağlanacağınız db’nin driveri yoksa sunucuda “biserver-ce\tomcat\lib” dizinine ilgili jdbc driverinin jar’ını koymanız gerekmektedir.

Pentaho bi server’in en güzel özelliklerinden birisi plugin mantığı ile genişletilebilir olması. Uygulamayı ilk kurduğunuzda Marketplace’e erişebilimeniz için bu plugini manuel kurmanız gerekiyor. Bunun için http://www.pentaho.com/marketplace/ adresinden “Pentaho Marketplace” pluginini download edin ve sonra sunucunuzda “\biserver-ce\pentaho-solutions\system” dizini altına koyun. Sonra uygulamayı restart edin. Artık anamenüde “Marketplace” linkini görüyor olacaksınız.

marketplace

 

 

 

 

 

Report

Rapor tasarlamak için “Report Designer” sekmesinden uygun paket indirilir. Türkçe olan işletim sisteminde çalıştırmak ve memory parametreleri için report-designer.bat  dosyasına “-Duser.language=en -Xms1024m -Xmx2048m -XX:MaxPermSize=256m” eklemesini yapmanız gerekir.

start “Pentaho Report Designer” “%_PENTAHO_JAVA%” -Duser.language=en -Xms1024m -Xmx2048m -XX:MaxPermSize=256m -jar “%~dp0launcher.jar” %*

Oracle DB’ye bağlanmak için “lib\jdbc” dizinine oracle jdbc driverini eklemeniz gerekmektedir.

DB’ye bağlanmak için Report Designer arayüzünden “Data>Add Data Source>JDBC” adımlarını takip ediniz.

Datasource tanımladıktan sonra rapor tasarlarken kullanmak için sorgular tanımlamanız gerekiyor. Bu sorguları parametrik yapabiliyorsunuz. Oluşturduğunuz parametrelerin datasını yine farklı bir sorgu üzerinden alabiliyorsunuz.

datasource

report-parameter

preview

 

 

 

 

OLAP Cube

OLAP Cube tasarlamak için “Schema Workbench” sekmesinden uygun paket indirilir.

Report aracındaki gibi bu araçtada dil ve driver ayarlarını yapmanız gerekmektedir. Tasarıma başlamadan bir connection tanımı yapmanız gerekmekte. “Options>Connection” menüsünden db bağlantı parametrelerinizi tanımlayıp kaydedin. Örnek çok mantıklı değil ama mantığını anlamak için yeterli. Elimde bir ürün tablosu var bu tabloyu kullanarak bir küp oluşturacağım.

Tablo : SER_MAM_TNM

Alanlar : MAM_KOD(ürün kodu),MARKA_KOD(marka),MODEL_KOD(model),URETICI_KOD(üretici),MAM_ANAGRP(Ürün grubu)

Adımlar;

  1. Add cube
  2. Table : [name : SER_MAM_TNM]
  3. Add dimension: [name : Urunler, foreignKey:MAM_KOD, type : StandardDimension]
  4. Dimensiona hierarchy eklenir : [name : Default]
  5. Hierarchy’ye table eklenir [name : SER_MAM_TNM]
  6. Hierarchy’ye Level eklenir [Name: marka, table : SER_MAM_TNM, column: MARKA_KOD]
  7. Hierarchy’ye Level eklenir [Name: uretici table : SER_MAM_TNM, column: URETICI_KOD]
  8. Cube’e measure eklenir [name: UrunKodu, aggregator : distinct-count, column: MAM_KOD]
  9. Cube’e measure eklenir [name: AnaGrubu, aggregator : distinct-count, column: MAM_ANAGRP]

cube

 

 

 

 

 

Tasarımı tamamladıktan sonra “File > Publish” seçenekleri ile sunucuya yükleyin.

publish-cube

 

 

 

 

 

 

 

 

Sonuç;

cube-preview

 

 

 

 

 

 

Pivot tabloları daha güzel sunan “Pivot4J” pluginini marketplace’den kurabilirsiniz.

Dashboard

Pentaho biserver üzerinde gelişmiş dashboardlar tanımlayabilirsiniz. Anasayfada “Create New > CDE Dashboard” seçenekleri ile yeni bir dashboard oluşturabilirsiniz. Pentaho üzerinde CDE(community dashboard editor)  dashboard ile oluşturulan dashboardların mantığı şöyledir;

3 adet bölümden oluşur :

  1. Datasource bölümü; Burada grafiklerde ve diğer componentlerde kullanmak için farklı tiplerde queryler oluşturmanız gerekiyor
  2. Components bölümü: Burada dashboarda eklemek istediğiniz grafik,harita.rapor vb. componentleri tanımlamanız gerekiyor. Burada tanımlama yaparken datasource bölümünde tanımladığınız query’leri kullanıyorsunuz.
  3. Layout bölümü; Burada ise dashboardınızın nasıl görünmesi gerektiğini belirliyorsunuz. Yerleşimde kullanmak için ihtiyaçları karşılayacak nitelikte yeterli seçenek mevcut. Burada oluşturduğunuz alanlara verdiğiniz isimleri components bölümünde tanımladığınız componentlerin “HtmlObject” kısmına yazdığınızda hangi componentin layoutda nerede görüneceğini belirtiyorsunuz.

dashboard-1

 

 

 

 

Basit bir dashboard oluşturup bir grafik ekleyelim;

Önce datasource bölümünde bir query tanımlayalım. Sol taraftaki sekmelerden “SQL Queries” kısmından “sql over sqljndi” linkine tıklayarak bir query oluşturun. Sonra sağ tarafta name kısmına anlamlı bir isim verin. JNDI özelliğini ilk aşamada tanımladığımız datasource’nin ismini yazın. İlk harfini yazdığınızda ya da aşağı ok tuşuna bastığınızda sistemde tanımlı datasource’lar listelenir. Query kısmına kendinize uygun bir aşağıdakine benze bir sorgu olusturun;

select hizmet_tipi_ad hizmet_tipi,bolge_adi bolge,adet from BI_BOLGE_VW where yil = ${yil} [Bu sorgu bölge bazında yapılan hizmetleri hizmet tipine göre adetlerini vermekte]

Bu sorgu yil parametresine göre çalışmakta. Dashboarda bir yıl parametresi ekleyip o parametrenin değerine göre grafiği filtreleyeceğiz.

Parameters kısmına “Name:yil, value : yil, type : string” şeklinde parametre tanımlayın. Bu şekilde query’imizi tanımlamış olduk.

Sonra components bölümüne geçiyoruz.

Burada sağ tarafta “Generic” sekmesinden “Simple Parameter” seçeneğini seçerek bir parametre oluşturuyoruz. [Name: yil, property value : 2012]

simple-parameter

 

 

 

Sonra yılların olduğu bir combobox oluşturmamız gerekiyor. Bunun için sağ bölümden “Select” sekmesinden “Select Component” seçerek ekleyin.  [Name: YilSecim, parameter : yil, Listeners : yil, values : 2011,2012…2016 ]

select-component

 

 

 

Sağ tarafta “Charts” sekmesinden “CCC Bar Chart” seçeneğini seçerek bir bar chart oluşturuyoruz. [name : bolgeBazliHizmet, Listeners : yil, parameters : (yil,yil), datasource : (datasource bölümünde tanımladığımız query adı, crosstabMode : False)]

bar-chart

 

 

 

Sonra layout bölümüne geçiyoruz, burada dashboard yerleşimini oluşturacağız.  İlk aşamada hazır templatelerden birini seçerek devam ediyoruz. Üst kısımda 2. buton olan “Apply Template” seçeneği ile uygun bir template seçin. Ben iki sütunlu olanı seçtim.

layout

 

 

 

Sonrasında üstten “spacer” satırından sonra bir satır daha ekledim ve adına “Kriterler” dedim. İçerisine bir column ekleyerek adına “YilKriteri” dedim. Bu bilgiyi şimdi gidip components bölümünde tanımladığımız “YilSecim” componentinin “HtmlObject” kısmına yazmamız gerekiyor. Böylece yil comboboxı yerleşimde bu kısımda görünecek.

Sonra kriterlerden sonraki “Body” kısmındaki ilk columna (yani Panel_1)’in name bilgisini components bölümünde tanımladığımız bar chartın “HtmlObject” kısmına yazıyoruz.

Böylece dashboardımızı tamamlamış oluyoruz.

dashboard-preview

 

 

 

 

Not : 

Tanımladığınız dashboardı fakrlı bir web uygulamasında iframe içerisinde göstermek için aşağıdaki değişikliği yapmanız gerekmekte;

“biserver-ce\pentaho-solutions\system\security.properties” dosyasındaki aşağıdaki parametreyi true yapmanız gerekiyor.

requestParameterAuthenticationEnabled=true

Anasayfadan “Browse Files” seçeneği ile dashboardınızı kaydettiğiniz dizinden bulun ve seçip sağ taraftan “Open in a new window” seçeneği ile açın. Açılan pencereden adresi kopyalayın. Adresin sonuna aşağıdaki parametreler ile user ve password bilgisini ekleyin.

http://:8080/pentaho/api/repos/%3Apublic%3ASteel%20Wheels%3ADashboards%3ADilaver.wcdf/generatedContent?userid=admin&password=password

Bu şekilde farklı bir web uygulamasında dashboardınızı görüntüleyebilirsiniz.

Harita

pentaho üzerinden birkaç harita görselleştirme componenti var. Bunun yanında IvyDasboard componentleri içerisinde de bir map componenti var. Burada bunlardan Custom>NewMapComponent ve IvyVectorMap componentlerini anlatacağım.

IvyDC – Ivy Dashboard Components kurmak için marketplace’e gidin ve plugini bulup yükleyin. Sonrasında uygulamayı restart edin. Artık dashboard editor ekranında components bölümünde görüyor olacaksınız.

ivy-dashboard-components

IvyVectorMap türkiye haritası ;

https://github.com/cbilgili/jVectorMap-Turkey adresinden jquery-jvectormap-data-turkey-tr-en.js dosyasını indirin. Sunucunuzda “biserver-ce\pentaho-solutions\system\IvyDC\resources\components\jQVectorMapsComponent” dizinine gidin. İndirdiğiniz dosyası bu dizine yapıştırın. “component.xml” dosyasını açıp “<Dependencies>” kısmına indirdiğiniz dosyayı ekleyin. “<CustomProperties>”  altındaki “<Values>” kısmına “<Value display=’Turkey’>turkey_1_mill_en</Value>” eklemesini yapın. Böylece haritalarda türkiye haritası da çıkmış olacak. Bu compoenetdeki haritalar http://jvectormap.com/maps/world/world/ adresindeki haritalardır.

IvyVectorMap’i dashboarda eklemeden bir datasource eklemeniz gerekiyor. Veri yapısı ise “select city,Measure from temp_tr_map_ivy_view” bu sorgunun sonucu olan aşağıdaki gibi data seti olmalı.

ivy-map-data

Bu data setinde 53: Konya, 7: Ankara, 63 : Ordu, 40 : İstanbul şeklinde. Maalesef harita plaka koduna göre ayarlanmamış.

Sonra components bölümüne geçerek sol taraftaki sekmelerden “Ivy IS” bölümünden “SVG Vector Map” linkine tıklayarak componenti ekleyin. Ve ayarlarında datasource kısmına tanımladığımız datasource adını girin.

ivy-map-properties

Sonrasında layout bölümünde uygun bir alan oluşturarak haritayı buraya yerleştirin yani JQVectorMapComponentinin HtmlObjet kısmına layout bölümünde oluşturduğunuz alanın adını yazın ve önizleme yapın.

ivy-map-preview

NewMapComponent Kullanımı

Bu componeti kullanmak içinde öncelikle bir datasource tanımlamak gerekiyor. Datasource “select Latitude,Longitude,city name ,MEASURE total from temp_map_view” querynin sonucu olan datayı içermelidir.

new-map-component-data

Sonrasında components bölümüne geçin ve sol tarafta “Custom” sekmesinden “NewMapComponent” linkine tıklayın. Ve parametreleri aşağıdaki gibi belirleyin. Önemli kısım datasourceu yazmayı atlamayın.

new-map-component-props

Sonrasında componenti layout üzerinde uygun bir yere yerleştirin ve önizleme yapın.

new-map-component-preview

Sonuç olarak haritanız bu şekilde görünecektir.

 

Test Driven Analysis

İş süreçlerimizde analizin çok önemli olduğunu düşünenlerdenim. Maalesef öyle zamanlar geliyor ki işle uğraşmaktan çok, işi verenlerle uğraşmak zorunda kalıyorsunuz. Bu konunun literatürde detaylarını hiç araştırmadım. Ama yaşananlar insana “ya kesinlikle test yönelimli analiz yapılmalı” cümlesini kurdurtuyor.

Neden Böyle? diye sorduğumda…

Analiz eksikliklerinin bence en önemli sebebi yönetimdeki anlayıştır. Birçok yerde kurallar vardır ama büyük oranda bu kurallara uyulmaz. Konulan kurallar da zamanla verimsiz hale gelir. Bir zaman sonra artık bu kurallar sadece denetimlerde gündeme gelir ve sonraki denetime kadar raflarda kalır.

Yukarıda neden en önemli sebep yönetimdeki anlayış dediğimi biraz daha açıklayacak olursam; kimse durup dururken birşeyleri standartlaştırmanın peşine düşmez. Neden kendi kendine kurallar koyup kalıba girsin. Tabiki standartlaşmanın asıl amacı ölçümleyebilmektir. Standart olmayan birşeyi belirli kriterlere göre ölçmek çok zor olsa gerek.

İş süreçlerinizi ölçümleyemezsiniz nerede problem olduğunu göremezsiniz. Bunu göremezseniz işinizi iyileştirip, konforunuzu arttıramazsınız vb…

Tabi böyle bir iyileşmenin ihtiyaç olduğunu anlayabilmek en önemli mesele 🙂 Eğer dünyada/dünyanızda neler olup bittiğini görmüyorsanız, farkında değilseniz, nasıl olsa işler yürüyor öylese sorun yok diyorsanız ilerleme kaydetmek neredeyse imkansız oluyor.

Bunlar iş süreçlerinin daralıp maalesef e-mail ile yürüyen bir akışa kadar inmesine sebep oluyor. Yönetici açısından bakınca; kimse süreci denetlemiyor, işi yapanlarda bir şekilde e-mail içerisindeki söylenenleri yapıyorlar. İşin detayında yirmi kez de değişiklik yapılsa, komple de değişse problem olarak görülmüyor.

Ben bir analist değilim, bu işin eğitimini de almadım. Sadece yaşadıklarıma dayanarak temel düzeyde yorumlar yapıyorum. Bir konuyu analiz etmek, konuyu bütün detayları ile ortaya koyabilmek olmalı. Tüm detayları ortaya koymak demekse konuya kafa yormak, anlaşılmayan noktaları tartışmak, netleştirmek olmalı.

Eğer bu kafa yorma süreci işlemiyorsa iş delik deşik oluyor. Ortaya karmaşık, bakım maliyeti yüksek bir iş çıkıyor. Çünkü iş anlaşılmadan yapılmaya başlanıyor, sonra müşterinin karşısına çıkıyor, müşterinin beklentisini karşılamammış oluyor. Sonra tekrar müşterinin taleplerine göre değişiklikler yapılıyor vb. Bu değişiklikler çok köklü de olabiliyor.

Bu kadar sorunu yaratmak ve yönetmek yerine dikkatli bir analiz süreci ile herkesin memnun olacağı bir iş yürütmek daha mantıklı ve kolay değil mi?

Analizin bir de test driven olduğunu düşünsenizya ne kadar muhteşem olur 🙂 İşi yapanlar sadece kendi işlerini yaparlar, analistlerin işlerini değil.

Adaptive Object Model

Dinamiklik gerektiren ve hızlı değişime ihtiyaç duyan uygulamaların domain modellerini yönetmek için AOM design patterni kullanılabilir. AOM classları,attributeleri,ilişkileri ve classların operasyonlarını metadata olarak saklayıp dinamik olarak kullanmayı sağlar. Kullanıcılar doğrudan metadatayı değiştirerek domain modeli değiştirebilirler. Object modeli ister XML dosyalarında ister databasede saklayabilir ve yönetebilirsiniz.

Bu tasarıma baktığımızda aslında NoSQL databaselerin temel aldığı mantığı yansıtmaktadır. Yani MongoDB gibi NoSql databaselerin temelindeki pattern AOM diyebiliriz.

AOM’u anlatan güzel bir blog girdisi gördüm. Paylaşmak istedim;

Buradan erişebilirsiniz.

Kaynak