Açık Kaynaklı J2EE Geliştirme Araçları. Ahmet Işık İdeal Teknoloji A.Ş.



Benzer belgeler
ORM & Hibernate. Ahmet Demirelli. SCJP 5.0, SCWCD 1.4 ahmetdemirelli@sabanciuniv.edu

Üst Düzey Programlama

Java EE 5 Teknolojileri Jboss Seam

ÖZGÜR YAZILIMLAR İLE J2EE

Üst Düzey Programlama

Java EE web uygulamaları geliştirmek için kullanılan açık kaynak web uygulama framework üdür.

JAVA RMI ve Hibernate teknolojileri kullanılarak çok amaçlı bir yazılım altyapısı hazırlanması

Client Server Database

JavaServerFaces. Ahmet Demirelli. SCJP 5.0, SCWCD 1.4

Arş.Gör.Muhammet Çağrı Gencer Bilgisayar Mühendisliği KTO Karatay Üniversitesi 2015

TCMB Deneyim Raporu. Kurumsal Java Uygulama Platformu. Sacit Uluırmak. Türkiye Cumhuriyet Merkez Bankası Sistem Araştırma ve Planlama Müdürlüğü

Üst Düzey Programlama

Ant + Ivy + SVN + CruiseControl ile Yazılım Geliştirme Yaşam Döngüsü. Kenan SEVİNDİK

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Veritabanı. Ders 2 VERİTABANI

Üst Düzey Programlama

Spring Ekosisteminde Kurumsal Yazılım Geliştirme. Kenan Sevindik Harezmi Bilişim Çözümleri A.Ş.

Web Tabanlı J2EE Uygulamalarında Struts Framework & Hibernate Desteği

Java Temel Özellikleri

Java Programlamaya Giriş

Android e Giriş. Öğr.Gör. Utku SOBUTAY

.com. Özcan Acar 2009 Kurumsal Java.com

MOBİL UYGULAMA GELİŞTİRME

19 Şubat 2016 Cuma

Kullanıcı Dökümanı. Flash B2B. Versiyon 0.1

Google Web Toolkit ile Öğretim Elemanı Otomasyon Sistemi

JBoss Seam Next Generation Integration Framework

VERİ TABANI YÖNETİM SİSTEMLERİ

«BM364» Veritabanı Uygulamaları

Üst Düzey Programlama

Tarih Saat Modül Adı Öğretim Üyesi. 01/05/2018 Salı 3 Bilgisayar Bilimlerine Giriş Doç. Dr. Hacer Karacan

HTML isteklerini anlayarak HTML sonucu üreten ve yaygın olarak kullanılan temel Servlet sınıfı HttpServlet tir.

Kaynak Kod Güvenliği Bir Güvensiz API Örneği

JavaServer Faces (JSF) Sunucu Yazılım Teknolojileri 2008

Java Dersi. Altuğ Bilgin Altıntaş

Üst Düzey Programlama

BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜM BAŞKANLIĞI DERS TANITIM BİLGİLERİ

Paket Erişimleri. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 4 1

Struts2 ile Merhaba Dünya uygulamas

Tomcat Uygulama Sunucusunun Kurulumu. İlk olarak adresine gidiyoruz.

Genel Kavramlar. Bilgisayar ortamında işlenebilecek durumda bulunan kayıtlar. Birbiri ile ilişkili veriler topluluğu ve veriler arası ilişkiler

Sunum Planı. Django Nedir? Django projesi oluşturmak Basit bir blog uygulaması. Şablon Kullanımı Diğer özellikleri

Öğr. Gör. Serkan AKSU 1

LINQ (Temel Kavramlar)

Veri Tabanı Yönetim Sistemleri Bölüm - 3

Veritabanı Uygulamaları Tasarımı

E-fatura Yenilikler. E-fatura uygulaması ile ilgili çeşitli yenilikler seti ile birlikte yayınlandı:

Java Programlama Giriş

VERİ TABANI UYGULAMALARI

Kaynak Kodlardan Derleme. Turquaz Muhasebe. Versiyon 0.2. Hüseyin Ergün. 26 Mart 2005

13 Aralık Đlgili Versiyon/lar : ETA:SQL, ETA:V.8-SQL. Đlgili Modül/ler : Raporlar. Kullanıcı Tanımlı Raporlar Bölümünden Yapabildiklerimiz

Intercepting Filter Tasarım Şablonu KurumsalJava.com

Programlama Dillerinde Kullanılan Veri Tipleri

DENİZ HARP OKULU BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜM BAŞKANLIĞI DERS TANITIM BİLGİLERİ

Java ve Linux. Bora Güngören Portakal Teknoloji Akademik Bilişim

Üst Düzey Programlama

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 10. Yrd.Doç.Dr.Hacer Karacan

BİL-142 Bilgisayar Programlama II

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

Web Uygulama Anaçatıları. Tahir Emre KALAYCI. May 5, 2009

Akıllı Kod Desteği. Şekil 1

İnternet Programcılığı

Turquaz. Açık kodlu muhasebe yazılımı Turquaz Proje Grubu

ANA SINIF TÜRETİLEN BİRİNCİ SINIF TÜRETİLEN İKİNCİ SINIF

İçindekiler JPA - Genel Konular...1 Genel Bilgiler...1 JPA Hakkında...1 Temel Kavramlar...3 Kurulum ve Yapılandırma...3 Yapılandırma Dosyası

20461C Querying Microsoft SQL Server Modül Seviye Belirleme Testi

MİLLİ SAVUNMA ÜNİVERSİTESİ KARA HARP OKULU DEKANLIĞI BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ DERS TANITIM BİLGİLERİ

OMNET Ağ Benzetim Yazılımı (Network Simulation Framework) BİL 372 Bilgisayar Ağları. GYTE - Bilgisayar Mühendisliği Bölümü

Rahman USTA Editör Altuğ B. ALTINTAŞ Papatya Yayıncılık Eğitim

EGE ÜNĐVERSĐTESĐ BĐLGĐSAYAR MÜHENDĐSLĐĞĐ SUNUCU YAZILIM TEKNOLOJĐLERĐ LABORATUAR PROJESĐ

Erişim konusunda iki taraf vardır:

Swing ve JDBC ile Database Erişimi

C# nedir,.net Framework nedir?

DAO İLE SQL KOMUTLARI. Sql komutlarını artık veri tabanında kullanmaktan başka çaremiz yok arkadaşlar. Şimdi bu sql derslerimize başlayalım.

2.Eclipse açıldıktan sonra Workspace alanı seçilmesi gerekir. Workspace alanı projelerinizin fiziksel olarak bulunduğu kısımdır.

VERİ TABANI ve YÖNETİMİ

Spring Application Framework Harezmi Bilişim Çözümleri

Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

VERİ TABANI YÖNETİM SİSTEMLERİ

AKILLI TATIL PLANLAMA SISTEMI

Veritabanı Tasarımı Ve Yönetimi. Varlık-İlişki Modeli

ProFTPD FTP Sunucusu. Devrim GÜNDÜZ. TR.NET Sistem Destek Uzmanı.

Fonksiyonlar istenilen deger tipinde dönüs yapabilir. INT, VARCHAR deger döndürebileceğiniz gibi bir tablo da döndürebilirsiniz.

MyFaces Özgür JSF Uyarlaması. Bora Güngören Portakal Teknoloji

ORACLE DA KÜRSÖRLER. Gerekli sistem değişkenleri

Değerlendirme Soruları 140. Şerit Kullanımı 124 Şerit Sekmeleri 124 Şeridi Gizleme 125 Eklentiler 125

Cybersoft Bilişim Teknolojileri Sunucu Tarafı Programlaması Kursu Final soruları. Tarih: 27 Kasım 2010 Saat: 13:30 Süre: 3 saat

İŞLETİM SİSTEMİ KATMANLARI (Çekirdek, kabuk ve diğer temel kavramlar) Bir işletim sisteminin yazılım tasarımında ele alınması gereken iki önemli konu

Görsel Programlama DERS 01. Görsel Programlama - Ders01/ 1

SAKLI YORDAM (Stored Procedure) Sibel Somyürek

Liquibase ile Veri Tabanı Değişiklik Yönetimi

1 Temel Kavramlar. Veritabanı 1

BİL 542 Paralel Hesaplama. Dersi Projesi. MPJ Express Java Paralel Programlama

Basit Mimari, Katmanlı Mimari ve doğrudan çalıştırma olarak üçe ayrılır.

Büyük Veri de Türkiye den Uygulama Örnekleri Dr. Güven Fidan

Kurulum ve Başlangıç Kılavuzu. DataPage için

Veritabanı Yönetim Sistemleri (Başarım Eniyileme Performance Tuning)

Kullanıldığı Başlıca Siteler

DITA ile Uygulama Belgeleri Hazırlamak

Transkript:

Açık Kaynaklı J2EE Geliştirme Araçları Ahmet Işık İdeal Teknoloji A.Ş. 1

Giriş Açık kaynaklı yazılım geliştirme araçları ile baştan sona web tabanlı bir kurumsal uygulama geliştirmek ve çalıştırmak mümkündür. Java nın platform bağımsızlığı sayesinde bu araçları Java Runtime Environment desteği olan herhangi bir platform da kullanmak mümkündür. Böylece hem geliştirme safhasında hem de çalıştırma safhasında hiçbir platforma bağımlı kalınmamış olur. Bu sunum kapsamında çeşitli uygulama katmanlarında kullanılabilecek araçlar, framework ler ve bunların nasıl entegre bir şekilde kullanılabileceği anlatılacaktır. 2

Uygulama Gereksinimleri Orta Katman Servisleri Kaynak Yönetimi, Kimlik Kontrolü, Yetki Kontrolü, Mesajlaşma, Yük Dağıtımı, Fail-Safety, vb Uygulama Framework ü Uygulama gerçekleştirimi sırasında kodun modüler ve birbirinden mümkün olduğunca bağımsız bileşenler halinde yazılmasını sağlar. Farklı geliştiriciler tarafından gerçekleştirilen bir uygulamada standartlaşma sağlar. Bazı orta katman ve sunum servislerini destekler. Örnek: Kimlik Kontrolü, Yetki Kontrolü, Ekran düzeni, Sunum araçları (Tag Kütüphaneleri) Kalıcı Bilgi Saklama Mekanizması Durum bilgisinin saklanması gereken nesneler için kullanılır. Veri tabanları, Dosya Sistemleri, RAM gibi saklama ortamları kullanılabilir. Sunum Servisleri Oluşturulan nesnelerin kullanıcıya gösterilmesi, uygulama akışının gidebileceği yönlerin kullanıcıya sunulması, fonksiyonların erişilebilir hale getirilmesi Make Aracı Uygulama çalışma zamanı dizin yapısının oluşturulması Uygulama kaynak kodunun derlenmesi Gerekli dosyaların (kütüphaneler, konfigürasyon dosyaları, destek dosyaları, vb.) uygun konumlara kopyalanması Otomatik kod ve konfigürasyon dosyası üretimi 3

Gündem Web Sunucusu: Apache Tomcat Uygulama Framework ü: Jakarta Struts Make Aracı: Apache Ant Persistency: Hibernate Otomatik Kod Üretme: XDoclet 4

Apache Tomcat 5

Tomcat Apache Software Foundation tarafından açık kaynaklı olarak Jakarta projesi altında geliştirilmektedir. jakarta.apache.org/tomcat Uygulama mimarisinde Web Sunucusu katmanını gerçekleştirir. En son versiyonu Servlet 2.4 ve JSP 2.0 belirtimlerini destekler. Tomcat in sunduğu servisler: Kimlik denetimi: Veritabanı, LDAP gibi standart mekanizmalar halihazırda gelmektedir. Genişletilebilir bir kimlik denetim mekanizmasına sahiptir. Bunların yanında SSL desteği, Kümeleme ve Yük dağıtımı imkanı sunar. 6

Jakarta Struts 7

Jakarta Struts Apache Software Foundation tarafından Jakarta projesi kapsamında geliştirilmektedir. jakarta.apache.org/struts Java Web uygulamaları için açık kaynak kodlu bir framework Uygulama mimarisini Model-2 yaklaşımına göre tasarlamayı kolaylaştırır. 8

Tasarım Kalıbı Model 1 Model-1 Web uygulaması Birbirinden bağımsız olarak çalışan JSP sayfalarından oluşur Her sayfa kontrolü direkt olarak bir sonraki sayfaya yönlendirir Ayrı bir akış kontrolcüsü yoktur 9

Model-1 Ana Sorunlar Basit bir değişiklik birçok farklı sayfada basamaklı olarak tahmin edilemeyecek etkilere neden olur. Karmaşıklık çabuk artar İlk bakışta basit gözüken bir iş parçalar eklendikçe büyük bir karmaşaya dönüşebilir. 10

Tasarım Kalıbı Model-2 Model-View-Controller tasarım kalıbını temel alır Model-2 de her istem kontrolcüden geçer Kontrolcü bir sonraki sayfayı seçer 11

Jakarta Struts Mimarisi 12

Controller 13

Controller (devam ) 14

Model 15

Model 16

Model (devam ) 17

View 18

MVC Dezavantajları MVC framework lerinin kurulması karmaşıktır Bir sayfa geliştirmek artık çok adımlı, önceden ekstra planlama ve düşünme gerektiren bir iş haline gelmiştir. 19

Apache Ant 20

Ant Another Nice Tool Apache Software Foundation tarafından Jakarta projesi kapsamında açık kaynaklı olarak geliştirilmekte ve dağıtılmaktadır. Unix lerdeki Make benzeri bir araçtır. Genişletilebilirdir Tamamen Java da, platform bağımsız olarak tasarlanmıştır Herhangi bir platform a özgü çağrılar içermez Ant build dosyası bir XML dosyasıdır Aktif Ant topluluğu tarafından Ant için sürekli yeni yetenekler eklenmektedir 21

Ant Kurmak Ant ı şu adresten temin edebilirsiniz: http://jakarta.apache.org/ant/ Zip veya Tar dosyasını <bir_dizin> e açın PATH çevresel değişkeni içerisine <bir_dizin>/ant/bin dizinini ekleyin ANT_HOME çevresel değişkenini <bir_dizin>/ant olarak ayarlayın 22

Ant ı Çalıştırmak Make e benzer şekilde: ant [opsiyonlar] hedef Bulunulan dizindeki build.xml dosyasını kullanır. 23

Örnek Bir build.xml Dosyası <project name= merhaba" default="compile"> <target name="compile"> <javac srcdir= src" destdir= build" /> </target> </project> Ant Task (Görev) Ant Target (Hedef) 24

Bağımlılık Zinciri Kullanıcı hedefi belirtir Ant sistemi o hedefin bağımlı olduğu tüm hedefleri bir kez olmak kaydıyla sırayla işler Dosyalar güncelse görev işletilmez Örneğin test ve deploy hedefleri compile hedefine bağımlı olacaktır. 25

Yerleşik Gelen Ant Görevleri Ant Deltree GZip Rename AntCall Echo Jar Replace AntStructure Exec Java Rmic Available ExecOn Javac SignJar Chmod Fail Javadoc Sql Copy Filter Mail Style Copydir FixCRLF Mkdir Tar Copyfile GenKey Move Taskdef Cvs Get Patch Touch Delete GUnzip Property Tstamp Unjar 26

Hibernate 27

Hibernate Gavin King tarafından başlatılan bir açık kaynaklı bir Nesne-İlişkisel eşleme (ORM) Projesi LGPL lisansı ile dağıtılmaktadır Ayda 13.000 kere indirilmekte olan popüler, endüstri standardı olma yolunda ilerleyen bir teknolojidir. Proje sayfası hibernate.org 28

Modern ORM Çözümleri Saydam kalıcılık Plain Old Java Objects (POJO) Kalıcı / Geçici Nesne Örnekleri Otomatik değişim kontrolü Geçişken Kalıcılık Çalışma zamanı SQL üretimi Üç farklı kalıtım eşleme stratejisi 29

Diğer Persistency Mekanizmalarından Üstünlükleri Doğal programlama modeli Yazılan kod miktarının daha az olması Uygulama sunucusu dışında da kodun geliştirilebilmesi ve test edilebilmesi Geliştirilen sınıfların kalıcı olmayan bağlamda da kullanılabilmesi Akıllı veri çekme stratejileri ile veritabanı erişimini minimize etmesi Model değişikliklerinin daha kolay yapılabilmesi 30

İlişkisel Veritabanlarının İyi Olduğu İşler Büyük miktardaki veri ile çalışma Arama, sıralama Veri kümeleri ile çalışma Birleştirme, kümeleme Paylaştırma Eş zamanlılık (Transaction) Çok uygulamalılık Bütünlük Alan kısıtları Transaction Isolation 31

İlişkisel Veritabanlarının Kötü Modelleme Olduğu Noktalar Polimorfizm eksikliği Detaylı modeller kullanmanın güçlüğü İş Mantığı Stored Procedure ler uygulama mantığını dağıtmaktadır. 32

Hibernate JavaBean ler için kalıcılık mekanizması Fine-Grained (İnce elenmiş) veri modellerine izin verir 33

Örnek Nesne Modeli 34

Örnek Nesne Modeli Sınıf Kodu Varsayılan (parametresiz) Constructor Get/Set ikilileri Koleksiyon özellikleri sınıf değil arayüz ile tiplendirilmiş ID özelliği public class AuctionItem { private Long _id; private Set _bids; private Bid _successfulbid private String _description; } public Long getid() { return _id; } private void setid(long id) { _id = id; } public String getdescription() { return _description; } public void setdescription(string desc) { _description=desc; } 35

Örnek Nesne Modeli XML Eşleme Dosyası Okunabilir metadata Veritabanı sütun, tablo eşleştirmeleri Doğal ID numarası üretme stratejisi Koleksiyon metadata sı Veri çekme stratejisi <class name= AuctionItem table= AUCTION_ITEM > <id name= id column= ITEM_ID > <generator class= native /> </id> <property name= description column= DESCR /> <many-to-one name= successfulbid column= SUCCESSFUL_BID_ID /> <set name= bids cascade= all lazy= true > <key column= ITEM_ID /> <one-to-many class= Bid /> </set> </class> 36

Otomatik Değişim Kontolü Bir AuctionItem nesnesi yükleme ve description özelliğini değiştirme Session session = sessionfactory.opensession(); Transaction tx = s.begintransaction(); AuctionItem item = (AuctionItem) session.get(actionitem.class, itemid); item.setdescription(newdescription); session.save(item); tx.commit(); session.close(); 37

Geçişken Kalıcılık Bir AuctionItem nesnesi yükleme ve yeni bir Bid nesnesi yaratma Bid bid = new Bid(); bid.setamount(bidamount); Session session = sf.opensession(); Transaction tx = session.begintransaction(); AuctionItem item = (AuctionItem) session.get(actionitem.class, itemid); bid.setitem(item); item.getbids().add(bid); Session.save(bid); tx.commit(); session.close(); 38

Nesne Ayırmak Bir AuctionItem nesnesi yükleme ve yeni bir Bid nesnesi yaratma Session session = sf.opensession(); Transaction tx = session.begintransaction(); AuctionItem item = (AuctionItem) session.get(actionitem.class, itemid); tx.commit(); session.close(); item.setdescription(newdescription); Session session2 = sf.opensession(); Transaction tx = session2.begintransaction(); session2.update(item); tx.commit(); session2.close(); 39

Hibernate Sorgu Dili Hibernate Query Language (HQL) SQL i nesneye yönelik hale getirmek için tasarlanmıştır Tablo ve sütunlar yerine sınıflar ve özellikler Polimorfizm Sınıf ilişkileri SQL den daha yüksek seviyeli İlişkisel işlemler için tam destek Inner/outer/full join işlemleri, kartezyen çarpımları Projeksiyon Kümeleme (max, avg) ve gruplama Sıralama Alt sorgular SQL fonksiyon çağrıları 40

Hibernate Sorgu Dili En basit sorgu from AuctionItem Bütün AuctionItem nesnelerini çek List allauctions = session.createquery( from AuctionItem ).list(); 41

Hibernate Sorgu Dili Daha faydalı bir örnek: select item from AuctionItem item join item.bids bid where item.description like hib% and bid.amount > 100 Diğer bir deyişle: Değeri 100 den büyük olan ve açıklaması hib ile başlayan bütün AuctionItem nesnelerini çek 42

Hibernate Hakkında Daha Fazla Bilgi İçin http://hibernate.org Hibernate in Action (Manning, 2004) Araç desteği http://xdoclet.sf.net http://www.andromda.org 43

XDoclet 44

XDoclet Nedir? XDoclet bir kod üretim mekanizmasıdır Açık kaynaklı (flexible BSD lisansı ile) bir yazılımdır. JavaDoc metadata şablon mekanizması Attribute-Oriented Programming EJBDoclet projesinden türemiştir 45

XDoclet in Amaçları Gereksiz manuel işleri kısmak Kod/Metadata çakışmasını engellemek Pragmatik Programlama Prensipleri DRY (Don t Repeat Yourself) Problem alanına yakın kod yazın Kod üreten kod yazın JSR 175 & 181 46

JSR 175 Sınıflar, arayüzler, alanlar ve metodların bazı özelliklere sahip olduğu şeklinde işaretlenmesini sağlayacak bir metadata tekniği sağlanması 47

XDoclet Mimarisi XJavaDoc üzerinde inşa edilmiştir XJavaDoc bir Java Kod yapı analizi aracıdır. Modüllere ayrılmıştır Farklı amaçlar için şablonlar içerir Ant ile çalışır. Bunun için gerekli Ant görevleri tanımlanmıştır. 48

XDoclet Kullanımı Web uygulamalarında web.xml konfigürasyon dosyası üretiminde Tag kütüphanesi TLD dosyası üretiminde Struts konfigürasyon dosyası üretiminde J2EE uygulamalarında Deployment descriptor üretiminde Enterprise Java Bean geliştirilirken Hibernate kullanılırken Eşleme dosyaları üretilirken 49

Hibernate İle Kullanım /** * @hibernate.class proxy="domain.personel.personel" */ public class Personel extends DomainObject { private String ad; /** * @hibernate.property not-null="true" */ public String getad() { return ad; } public void setad(string ad) { this.ad = ad; } private String soyad; /** * @hibernate.property not-null="true" */ public String getsoyad() { return soyad; } public void setsoyad(string soyad) { this.soyad = soyad; } } private String sicilno; /** * @hibernate.property not-null="true" unique="true" */ public String getsicilno() { return sicilno; } public void setsicilno(string sicilno) { this.sicilno = sicilno; } 50

Ant ve XDoclet Ortak Çalıştırma XDoclet Hibernate modülünün tanımlanması <!-- hibernate taskdef --> <taskdef name="hibernatedoclet" classname="xdoclet.modules.hibernate.hibernatedoclettask"> <classpath refid="xdoclet.classpath"/> </taskdef> 51

Ant ve XDoclet Ortak Çalıştırma Ant içerisinden XDoclet ile Hibernate eşleştirme dosyalarının üretilmesi <!-- Execute the hibernatedoclet task --> <target name="hibernate.generate" depends="prepare" description="generates hibernate mappings"> <!-- Hand crafted hibernate mappings--> <copy todir="${temp.dir}"> <fileset dir="${src.hibernate.dir}"/> </copy> <hibernatedoclet destdir="${temp.dir} mergedir="${merge.dir}"> <fileset dir="${src.java.dir}"> <include name="**/*.java"/> </fileset> <hibernate version="2.0"/> </hibernatedoclet> <!-- Pack the generate d *.hbm.xml mapping files into {hibernate.mappings} --> <jar destfile="${hibernate.mappings}" basedir="${temp.dir}"> <include name="**/*.hbm.xml"/> </jar> </target> 52

XDoclet Hakkında Bilgi XDoclet proje sayfası Xdoclet.sourceforge.net XDoclet In Action http://www.manning.com/walls/ 53

Özet Bu sunumda tamamen açık kaynaklı bileşenler ve araçlarla web tabanlı bir J2EE uygulamasının gerçekleştirilmesi üzerinde durulmuştur. Bu sunumda anlatılan teknolojiler hakkında daha fazla bilgi için ilgili teknolojinin proje sayfası, API dokümanları, ilgili forumlar, ve Java Portal lerinden faydalanılabilir. 54