Soyutlamalar

Oct 27 2017 Published by under java, software development

Yazılımcılar olarak bir iş mantığını daha hızlı ve kolay geliştirmek için çoğu zaman soyutlamalar (abstractions) kullanırız. Sık ve farklı istemciler tarafından kullanılan bir iş mantığını soyutlayıp istemcilerin işini kolaylaştırmaya çalışırız. Dar boğazımız “zaman kısıtı” ise soyutlama kullanmak çoğu zaman işe yarar ama dezavantajları da beraberinde gelir. Joel Spolsky “The Law Of Leaky Abstractions” başlıklı makalesinde TCP protokolü üzerinden örnek vererek her soyutlamanın mutlaka bir seviye sızdıracağından bahseder. Sızdırmaktan kasıt ise alttaki bir protokolün üzerine soyut bir protokol geliştirildiğinde, hala alttaki protokolle ilgilenme ihtiyacı duymamızdır. Soyutlamadaki alt katmana sızdıran delik ne kadar büyükse karmaşıklık o kadar artar ve işimizi kolaylaştırsın diye seçtiğimiz mantık ayağımıza dolanır. Ne soyutun avantajlarını yeteri kadar kullanabiliriz ne de onu çöpe atıp direk bir alt katmanı kullanabiliriz. Bunu ben en çok tam iki kat arasında kalmış bir asansöre benzetiyorum. Ne tırmanıp üst kattan çıkabilirsiniz ne de eğilip alt kattan. Sıkışıp kalırsınız.

Bu konuyu gündeme getirmemin sebebi yukarıda bahsettiğim gibi her gün bununla çok sık karşılaşmam. Örneğin Redis gibi bir bellek/veri tabanı kullanıyorsanız Redis’in komut satırından çalıştırabildiğiniz onlarca komut bulunuyor. Bu komutların ne iş yaptığını Redis’in kendi dokümantasyonundan net bir şekilde biliyorsunuz. Java programlama dili kullanıyorsanız Redis’e genellikle Jedis isimli istemci kütüphanesi aracılığıyla erişiyorsunuz. Burada bir seviye soyutlama bulunuyor zira Redis komutlarının küçük bir kısmını Jedis ile kullanamıyorsunuz. Bir de Jedis’in üzerine spring-data-redis gibi bir kütüphane daha kullanıyorsanız Redis komutlarının üzerine iki kat çıkmışsınız demektir. Operasyonlarda işiniz kolaylaştı fakat Redis’ten de iki kat uzaklaştınız. Varsayalım ki kullandığınız kütüphanelerden bir tanesi bir NullPointerException fırlatıyor. Buradan itibaren artık tamamen “Leaky Abstraction” kavramıyla karşı karşıyasınız demektir ve sorunun çözümü için ters mühendisliğe ihtiyaç duyacaksınız. Kat kat çıktığınız soyutlamaların sızdıran deliklerinden birer birer alt katlara ineceksiniz.

Örneğin spring-data-redis’in RedisOperations.java sınıfını açıyorsunuz ve şu şekilde bir kod dokümantasyonu göze çarpıyor:

“ Returns the operations performed on simple values (or Strings in Redis terminology) bound to the given key.”

Meali: Redis’teki basit operasyonları döner. Biz buna boundValueOps dedik ama bu aslında Redis terminolojisine göre String operasyonlarına karşılık geliyor.

Sızdıran delikten bir alt kata indiniz ve oradaki bir terimin aslında Redis’teki String operasyonları yaptığını öğrendiniz ve problemin karmaşıklığına göre en alt kata kadar inebilirsiniz.

Sonuç olarak biz yazılımcılar sürekli soyutlamaların sızdıran deliklerinden girip çıkıyoruz ve bu konuyu henüz çözebilmiş değiliz. Programlama tarihi de düşük seviyeden başlayıp en yüksek seviye programlama dillerine evrildi (Nesne yönelimli, belleği kendi yöneten diller). Hatta sürükle-bırak yaparak program yazılabileceğini iddia edenler dahi oldu. Bir takım donanım kısıtlarına gelindiğinde ise tekrar düşük seviye diller popüler olmaya başladı (Paralel programlama, Fonksiyonel programlama..vs.). Karşılaştığımız problemlere ve dar boğazlara göre ömrümüz kat kat soyutlamalar arasında inip çıkmakla geçecek gibi görünüyor. 🙂

Yazıya medium’dan da erişebilirsiniz: https://medium.com/@yyenigun/soyutlamalar-478437b70144

Comments are off for this post

Scala Test ile Behavior-Driven-Development

Nov 11 2015 Published by under bdd, java, scala, software development

ScalaTest (http://www.scalatest.org) Scala veya Java kodlarını test etmek için kullanılan TDD ve BDD (http://dannorth.net/introducing-bdd/) kütüphanesidir. Bu alandaki alternatiflerine (JBehave & JUnit, Groovy Spock..vs.) göre daha esnektir zira hem Java’daki tüm test kütüphaneleriyle (JUnit, TestNG, Ant, Maven, sbt, ScalaCheck, JMock, EasyMock, Mockito, ScalaMock, Selenium, Eclipse, NetBeans, IntelliJ) entegre çalışabilir hem de istediğiniz isimlendirme standardını kullanabilirsiniz. (Flat Spec, Word Spec..vs.)

ScalaTest’i bir java projesinde kullanabilmek için:

  • IntelliJ IDEA kullanılıyorsa Scala plugin kurulur: http://www.scalatest.org/user_guide/using_scalatest_with_intellij
  • Maven ile testleri çalıştırmak için iki alternatif vardır.
    • Birincisi Maven ScalaTest plugin’ini kurmak:
    • İkincisi ise testlerin üzerine aşağıdaki ifadeyi eklemek. Eğer hem JUnit hem de ScalaTest kullanmak istiyorsak bu yöntem ikisini birlikte çalıştırmaya izin verir.
  • Son olarak Scala ile yazdığımız test kodlarını derleyebilmek için maven scala plugin’i kurmamız gerekiyor. Bunun için aşağıdaki plugin’i projenizdeki pom.xml dosyasına eklemeniz gerekiyor:

Artık ScalaTest yazmaya başlayabiliriz. İlk olarak kullanmak istediğimiz temayı (Spec) belirlememiz gerekiyor. (FlatSpec, WordSpec, FeatureSpec..vs.) İç içe senaryolara daha kullanışlı test yazmak için WordSpec, kullanıcı kabul testlerini (acceptance test) yazmak için ise FeatureSpec tercih edilir.

Ardından eğer Mock yapacaksak bir Mock kütüphanesi seçilir ve pom.xml’e bağımlılık eklenir. (Mockito, ScalaMock, JMock, PowerMock..vs.)

Artık ScalaTest ile test geliştirmeye başlayabiliriz. WordSpec örneği:

FlatSpec örneği:

Detaylı bilgi için:

http://www.scalatest.org

https://github.com/s4nk/scalatest-maven-template

Comments are off for this post

Asynchronous Servlet

Jan 07 2015 Published by under java, software development

Servlet 3.0 ile birlikte asenkron servlet desteği geldi ve artık geliştirdiğimiz Servlet’leri asenkron olarak da çağırabiliyoruz. Bunun için @WebServlet notasyonuna asynSupported=true parametresi ekliyoruz.

Ardundan request.startAsync() ile AsynContext‘e erişiyoruz. Context’e bir dinleyici ekliyoruz. Dinleyici sınıfımızın AsyncListener arayüzünü implement etmesi gerekiyor.

Son olarak asenkron yapmak istediğimiz uzun süren işlemi çalıştırması için bir Thread‘e verebiliriz. Aşağıda ThreadPool kullanarak gerçeklenmiş bir örneği bulabilirsiniz.

 

Comments are off for this post

Monitoring Sensor Data Open Source Project: Waiting for your contributions!!

Oct 26 2014 Published by under wireless sensor networks

My open source project is waiting for your contributions :

https://github.com/yyenigun/mobile-sensing-web

This is an academic web application of Galatasaray University Activity Recognition project for monitoring mobile phone’s sensor data. (used technologies: Java, Spring MVC, Javascript, Bootstrap, Gradle..etc.)

Abstract

Human activity recognition using wireless sensors and crowdsourced sensing are both emerging topics in the domain of pervasive computing. Activity recognition involves the use of different sensing technologies to automatically collect and classify user activities for different application domains, ranging from medical applications to home monitoring. Whereas crowdsourced sensing aims to collect environmental or personal data especially using the mobile devices carried by the people. In this sense, smart phones provide a unique platform both for human activity recognition and crowdsourced sensing applications with the integrated rich set of sensors, such as GPS, accelerometer, microphones, their ubiquity, ease of use and wireless communication capabilities with various interfaces, hence the ability to transfer sensing data to backend servers. In the literature, example crowdsourced sensing applications generally aim to collect geo and time-tagged environmental data, such as noise or air pollution levels in the city. Research on human activity recognition using the sensors available on the phones mostly focuses on the development of applications for the end-user, such as monitoring fitness level of the phone user or the health status. In fact, recognition of the activities of the crowds and communities rather than the activities of individual can enable a new set of application domains in the fields of urban planning, urban transportation, targeted advertising. Hence, it will be an interesting topic to merge these emerging domains of human activity recognition and crowdsourced sensing on the ubiquitous smart phones. One of the objectives of this project is to design and develop an activity based crowdsourced sensing platform where the activities of the individuals related to movement, such as walking, running, as well as their transportation modes, biking, travelling with a vehicle, will be recognized with the sensors on the phones, such as accelerometer, GPS, and the findings will be transmitted to the backend servers where the behaviors of the crowds will be analyzed. This sensing platform will differ from the previous examples in the literature in the sense that the activities will be recognized on the phone rather than offline processing of raw sensor data on the backend servers. Additionally, the platform will support two modes of operation: in the online mode, collected data on the phone is uploaded to a backend server periodically, such as in every 10 minutes to capture the activity dynamics in real-time, whereas in the offline mode, data is uploaded once or twice a day for offline analysis. Additionally, the second objective of the project is to create a large-scale dataset which will be shared with other researchers working in the domain and hence will constitute as a benchmark platform for the comparison of different studies in the field. This dataset will be different from the existing datasets of mobile phone sensing in the sense that the sensors contributing to the activity recognition will be utilized and the data will be collected with newer generations of smartphones which are equipped with a richer set of sensors and provide better capabilities in terms of processing and storage. To achieve these objectives, we have identified the related research challenges and problems which will constitute the topics of the project and which will be addressed following an applied research methodology. The work plan will be divided into four work packages. Particularly, during the project we will first investigate the problems related to the activity recognition process. Selection of machine learning algorithms and the application of those to the mobile phone platform, efficient feature selection techniques for better activity recognition, person and position independent activity recognition will constitute the research problems that will be tackled in this phase. Next, we will investigate the tradeoffs in activity recognition accuracy and the sensor sampling frequency as well as the data transmission frequency and data sizes using optimization algorithms. After solving these problems and developing the required software for the platform, we will proceed with the data collection process. The data collection process will start with the identification of voluntary participants and it will continue for 9 months with at least 20 participants. As the final main research topic of the project, we will investigate the issues related to data processing. The data will be processed with methods such as clustering, and topic models for the identification of places with the activities (semantic tagging) and for the discovery of routine activity patterns for the places. The platform will be tested with a case study where the activities in the university campus will be targeted. The findings of these research problems will be disseminated with research publications, with the objective of 3 conference and 2 journal papers for each year. Additionally, during the project, two meetings will be organized with the objective of sharing the results of the project with other academicians, as well as the industry partners and the municipalities who are identified as the target interest groups who can benefit from the findings of these projects. Researchers who are well-known in the field will be invited to these meetings for sharing their visions on the related problems.

Comments are off for this post

Spring 4’le Gelen Yenilikler

Sep 19 2014 Published by under java

İlk sürümü 2004 yılında çıkan Spring Framework’ün şu ana kadar çok kez büyük sürümü çıktı. Spring 2.0 ile XML ve AspectJ desteği, Spring 2.5 ile notasyon (annotation) konfigürasyonu ve Spring 3.0 ile de Java tabanlı konfigürasyon modeli geldi.

Spring’in en son büyük (major) sürümü olan Spring 4.0 ile gelen en büyük yenilik ise Java 8 desteği. Spring 4.0 ile gelen tüm yenilikler :

1. Spring’e Başlangıç deneyiminin iyileştirilmesi

Spring’in yeni web sitesine (http://spring.io/)  Spring’e başlangıç ve Spring’i öğrenme dokümanlarının tamamı eklendi:  http://docs.spring.io/spring/docs/current/spring-framework-reference/html/overview.html

 2. Son kullanma tarihi geçmiş (deprecated) paketlerin ve metodların silinmesi

Versiyon 4 ile birlikte son kullanma tarihi geçmiş (deprecated) birçok metot ve sınıf kaldırıldı. Eğer projelerinizdeki Spring versiyonunuzu Spring 4’e yükseltmek istiyorsanız Java’nın son kullanma tarihi geçmiş metod, sınıf ve arayüzlerini kaldırdığınızdan emin olmanız gerekiyor. Kaldırılan tüm işlevleri görmek için şu doküman kullanılabilir: http://docs.spring.io/spring-framework/docs/3.2.4.RELEASE_to_4.0.0.RELEASE/

3. Java 8 (Java 6 ve Java 7 ile birlikte)

Spring 4 ile birlikte gelen en önemli yenilik Java 8’in bazı özelliklerini desteklemesi. Spring’in callback arayüzleri ile Lambda ifadelerinin kullanımı sağlandı. Halihazırdaki bazı notasyonların (ör: @Repeatable) java.time (JSR-310) paketini desteklemesi sağlandı. Geriye uyumlu olan versiyon 4 Java 6 ve Java 7 ile de kullanılabilir.

4. Java EE 6 ve 7

Spring 4 JPA 2.0 ve Servlet 3.0 versiyonları ile birlikte Java EE 6 ve üstü için temel versiyon haline geldi. Aynı zamanda JMS 2.0, JTA 1.2, JPA 2.1, Bean Validation 1.1 ve JSR-236 Concurrency kütüphaneleri gibi temel Java EE 7 standartlarını destekler duruma geldi.

5. Groovy Bean Tanımlamaları (Groovy DSL)

Spring Framework 4.0 ile birlikte Groovy DSL kullanarak bean konfigürasyonu yapılabilir hale geldi. Yazım olarak XML konfigürasyonuna benzese de konfigürasyon yazımı XML’e göre kısaldı. Örnek:

6. Container iyileştirmeleri

Bean’leri enjekte ederken “generic” tiplerin de kullanılabilmesi sağlandı.

7. Genel Web İyileştirmeleri

Spring MVC uygulamalarında @RestController notasyonunun kullanılması sağlandı.

8. WebSocket Mesajlaşma

Spring’in yeni spring-websocket modülü ile client-server web uygulamalarında çift yönlü iletişim sağlandı.

9. Test İyileştirmeleri

Yeni SocketUtils sınıfı sayesinde TCP/UDP soketleriyle entegrasyon testleri yapılabilir hale geldi.

Comments are off for this post

Gömülü yazılımdan bulut bilişime : Java 8

May 13 2014 Published by under java, software development

Java SE 8 ve Java ME 8‘i içerisinde barındıran Java 8 Java’nın şu ana kadar çıkardığı sürümler içerisinde en belirleyici sürümlerden bir tanesi olarak kendini gösteriyor. Lambda ifadeleri ve yeni Stream API’si hem platformun ifade gücünü arttırıyor hem de yazılımcıların modern, çift çekirdekli işlemcilerin avantajlarını kullanabilmelerine imkan sağlıyor. Java ME (Micro Edition) 8  en güncel JVM’i (Java Virtual Machine), programlama dilini ve kütüphaneleri içerisinde barındıracak şekilde güncellendi ve  küçük gömülü  (embedded) cihazlara odaklanıldı. Java 8 ile birlikte yazılımcılar aynı platformu kullanarak en küçük cihazlardan (Internet of Things) en büyük bulut (cloud) kurumsal servislere kadar geniş bir alana ulaşabilecekler.

Java 8 ile birlikte 8 temel özellik geliyor:

1. Lambda İfadeleri (closures) : Lambda ifadeleri davranışları veri şeklinde göstermeye yarayan basit ifadelerdir. Listeleri (collections) işlemek çok daha kolay ve etkili hale gelecektir. Örneğin 8 şarkıdan daha az şarkı barındıran albümlere sahip olan sanatçıları sorgulamak istiyoruz. Lambda ifadelerinden önce bunu standart for döngüsüyle geliştirebiliyorken Java 8’den itibaren tek bir satırda geliştirebileceğiz :

2. Nashorn ve Javascript : Nashorn Java 8 ile birlikte gelen ve JVM’in bir parçası olarak çalışan modern bir Javascript kütüphanesidir. JDK’nın içerisinde javax.script paketi içerisinde bulunur. Bu sayede geliştiriciler Java kodlarının içerisine Javascript bileşenleri ekleyebileceklerdir. Aynı zamanda içerisinde Nashorn’u script dili olarak komut satırından çalıştırabilmek için jjs komutu da bulunmaktadır.

3. Compact Profiller : Bu profiller Java Standard Edition ile Java Mobile Edition’ı birbirine yakınlaştıran 3 adet temel Java API gruplarıdır. Yıllardır gömülü yazılım geliştiriciler küçük cihazlara küçük Java binary’ler yükleyebilmek istiyorlardı. Compact profiller sayesinde tüm platformu yüklemeden sadece ilgili binary’yi küçük cihazlara yükleyebilme olanağı sağlandı. Bu sayede kısıtlı kaynağı olan cihazlara da küçük JVM’ler yüklenebilecek.

4. Date ve Time Kütüphaneleri : Yeni java.time kütüphaneleri sayesinde geliştirilmesi ve okunması daha kolay uluslararası zaman standartları kullanılabilir. Bu paketteki her bir Java sınıfı ilgili işe özgü sınıflardır ve aynı zamanda aynı anda erişim (concurrency) problemlerini çözmek için değeri değiştirilemeyen (immutable) sınıflar olacaklar.

5. Java FX 8 : Java FX’in 8. sürümü Lambda ifadelerini destekleyen bileşenleri içerisinde barındırıyor. Bu sayede kullanıcı davranışlarını yakalama (event handling) gibi kodlar çok daha kısa hale geliyor. Aynı zamanda dışarıdan (3rd party) bileşen kullanımı kolaylaşıyor. Performans tarafında da birçok geliştirme yapılmış bu sayede Raspberry Pi gibi cihazlarda gömülü JavaFX kullanılabilir.

6. Topluluğun İyileştirilmesi : Java 8 ile birlikte Java geliştiren topluluğun yapısında ve süreçlerde iyileştirme yapıldı. JUG (Java User Groups) toplulukları Java topluluğunun öğrenim ve katılım konularında birleştirici yerel merkezler oldu. Dünyanın her yerindeki bu Java grupları Java’nın geliştirilmesinde ve öneriler toplamada yeni bir anlayış getirdi. “Adopt a JSR” programı sayesinde yeni katılımcılar ve organizasyonlar Java’nın gelişmesinde katkıda bulundular. 26’dan fazla JUG JAva 8’in gelişiminde pay sahibi oldu.

7. Java ME 8 (Java Micro Edition) : Java ME 8 ile birlikte Java SE ve Java ME birbirine yaklaşmış oldu. Bu sayede aynı yetkinliğe sahip yazılımcılar hem büyük ölçekli kurumsal uygulamalarda hem de küçük gömülü sistemlerde uygulama geliştirebilecekler.

8. Java SE 8 (Java Standart Edition)  ve JVM : Java SE 8 ile birlikte çöp toplayıcı (garbage collection) altyapısı iyileştirildi. Yeni geliştirmelerle birlikte kullanıcılar bir GC (garbage collection) türünden diğerine kolaylıkla atlayabilecek. Aynı zamanda Java SE 8 ile birlikte yazılımcıların PermGEN alanını iyileştirmelerine (tuning) ihtiyaç kalmadı. PermGEN bölümündeki sınıfların meta verileri kuyruğa (heap) taşındı. Bu sayede yazılımcıların bu alanın boyutunun ne olması gerektiği konusunda fikir sahibi olmalarına ihtiyaç kalmadı. Son olarak Java ME 8 güncellenerek Java SE 8’deki kütüphanelerin bir kısmını kullanabilmesi sağlandı.

Sonuç olarak Java 8 yazılımcılara aynı yetkinlikleri kullanarak küçük cihazlara gömülü yazılımlardan bulut bilişim (cloud) üzerinde çalışan büyük ölçekli kurumsal uygulamalara kadar geniş bir oyun alanı sunuyor. Lambda ifadeleriyle de kodun satır sayısını azaltıp fonksiyonel programlama dillerinin avantajlarını kullanarak yazılımcıların verimliliğini arttırmayı hedefliyor.

Comments are off for this post

Rescheduling Job in Quartz

Jan 21 2014 Published by under java

Quartz kütüphanesi kullanan Job‘larımız varsa ve o Job’ları tekrar zamanlamak (rescheduling) istiyorsak ilk olarak varolan Cron‘u alıp ardından yeni bir CronTrigger oluşturmamız gerekmektedir.

 

Örnek kod aşağıdaki gibidir:

Comments are off for this post

Ehcache vs Hazelcast

Jan 12 2013 Published by under software development

Bu yazıda iki açık kaynak kodlu dağıtık bellek ürününün karşılaştırmasını yapmak istiyorum. Bunlardan biri Terracota firmasının Apache lisansına sahip ürünü Ehcache (http://ehcache.org/), diğeri ise İstanbul’dan çıkıp açık kaynak kod dünyasına hızlı bir giriş yapmış olan Hazelcast. (http://www.hazelcast.com/)

Google Trends’in verilerine göre Ehcache’de yavaş bir düşüş varken, Hazelcast’te piyasaya yeni girmiş olmasından kaynaklanan bir yükseliş bulunuyor.

Ehcache:
ehcache

Hazelcast:
hazelcast

İki ürünün açık kaynak kodlu versiyonlarını karşılaştırdığımızda Hazelcast önde gözüküyor. Sebeplerine gelirsek Hazelcast’in açık kaynak kodlu versiyonunda dağıtık bellek (distributed cache) olarak genişletilebilir (scalable) bir bellek sunucusu (cache server) varken Ehcache’in açık kaynak kodlu versiyonunda ayrı bir bellek sunucusu yok ve dağıtık bellek, nesne kopyalama (object replication) ile sağlanıyor. Ehcache’te ayrı bir bellek sunucusuna (Terracota Array) sahip olabilmek için kurumsal versiyonu satın almak gerekiyor. İki ürün de konfigürasyon altyapısı olarak JMX’i desteklemekle beraber Hazelcast açık kaynak kodlu versiyonunda web arayüzü ile yönetime de imkan tanıyor. Ehcache’te ise bu imkan kurumsal (enterprise) versiyonda bulunuyor. Bu açılardan Hazelcast bir adım önde görünse de Ehcache’in arkasındaki halk desteği (community support) daha güçlü.

Her kurumun kendi gereksinimlere göre bu iki üründen birini seçme özgürlüğü var fakat küçük bir genelleme yapmam gerekirse küçük firmalar (start-up) için Hazelcast daha uygun görünüyor zira Ehcache’e göre kullanımı çok daha kolay ve bedavaya Ehcache’in kurumsal versiyonunda olan bir çok özelliğe sahip olmak mümkün. Kurumsal firmalar için ise Ehcache tercih edilebilir çünkü hem arkasında Terracota isimli görece güçlü bir firma var hem de Hazelcast’e göre daha oturmuş ve riski az bir ürün.

Bu arada iki ürünün de Spring entegrasyonu bulunuyor şöyle ki @Cacheable notasyonuyla (annotation) belleğe atılan bir veri yapısı, altyapıdaki bellek ürünü değiştirilse de çalışıyor. Dolayısıyla altyapıdaki bellek ürünü, koda dokunmadan sadece konfigürasyonla değiştirilebiliyor.

Not: Bir de şöyle bir karşılaştırma var: http://stackoverflow.com/questions/5245487/hazelcast-vs-ehcache/5271450#5271450

Comments are off for this post

JAPI Checker

Oct 01 2012 Published by under software development

Java ile bir API yazıyorsunuz ve o API’nin her daim geriye uyumlu olmasını mı istiyorsunuz? İşte tam size göre bir Maven plugini: JAPI Checker

Plugin sizin Java kaynak kodunuzla daha önce compile edilmiş binary versiyonunuzu karşılaştırıyor ve geriye uyumluluğu bozan her türlü kodu sizin gözünüze sokuyor. Gözünüze sokmakla kalmayıp aynı zamanda projeniz maven’la build olmuyor. Birileri Continous Integration mı dedi? 🙂

Kullanmak için pom.xml’inize aşağıdaki maven pluginini eklemeniz yeterli:

Detaylı bilgi için: http://code.google.com/p/japi-checker/

Comments are off for this post

Java Persistence API

Sep 10 2012 Published by under software development

“Java for Telco” eğitimleri kapsamında “Java Persistence API” ile ilgili, teknoloji departmanlarında çalışan Vodafone Discover programı katılımcılarına verdiğim eğitimin sunumu ekte paylaşıyorum:

Java Persistence API

Comments are off for this post

Older posts »