+JAVA-ICINDEKI 9/23/11 3:05 PM Page vii ‹Ç‹NDEK‹LER 1 G‹R‹fi Bu Kitaba Neden ‹htiyaç Duyuldu? Kitap Nas›l Takip Edilmeli? Programlama Dili Nedir? Programlama Dillerinin Tarihçesi Programlama Dillerinin Türleri Makina Dili Assembly Dili Script Dilleri Yüksek Seviye Programlama Dilleri Çok Kullan›lan Programlama Dilleri Hakk›nda Özet Bilgiler Fortran Cobol Pascal Basic Visual Basic Delphi C C++ C# Java Nedir? Java’n›n Di¤er Programlama Dillerinden Fark› 1 1 2 2 2 4 4 4 5 5 5 5 6 6 6 6 6 7 7 7 7 8 2 BAfiLAMADAN ÖNCE B‹L‹NMES‹ GEREKENLER 9 JDK, JRE ve JVM Kavramlar› 10 JDK (Java Development Kit-Java Gelifltirme Kiti) 10 JRE (Java Runtime Environment-Java Çal›flma Ortam›) 11 JVM (Java Virtual Machine-Java Sanal Makinesi) 11 JVM ile JRE Aras›ndaki Fark 11 JDK ve JRE Kurulumu 11 Windows ‹flletim Sistemi Üzerinde JDK Kurulumu 11 Kurulan JDK’n›n ‹flletim Sisteminin PATH De¤iflkenine Eklenmesi 15 Kurulan JDK için ‹flletim Sisteminde JAVA_HOME De¤iflkeni Oluflturulmas›18 Linux ‹flletim Sistemi Üzerinde JDK Kurulumu 19 JRE Kurulumu 21 Java Programlar›n›n Yap›s› 24 Java Programlar›n›n Komut Sat›r›ndan Derlenmesi ve Çal›flt›r›lmas› 25 +JAVA-ICINDEKI 9/23/11 3:05 PM Page viii viii JAVA VE JAVA TEKNOLOJ‹LER‹ 3 JAVA PROGRAMLAMA D‹L‹ TEMELLER‹ Girifl Java Programlar›n›n Çal›flma fiekli Örnek Java Program› Temel (Primitif) Veri Tipleri Tamsay›lar Ondal›kl› (Kayar Noktal›) Say›lar Primitif Veri Tiplerinin Varsay›lan De¤erleri Literaller (De¤erler) Tamsay› (int) Literaller Kayar Noktal› Say› Tipindeki (float) Literaller Karakter Literaller Karakter Katarlar› (String ve StringBuffer S›n›f›) String S›n›f› StringBuffer S›n›f› De¤iflkenler ve De¤iflken Tan›mlama Tip Dönüflümleri (Type-Casting) Primitif Say› Tipleri ve Karakter Katarlar›n›n Birbirlerine Dönüfltürülmesi Bir int’i string’e Dönüfltürmek Bir string’i int’e Dönüfltürmek Bir double veya float’› string’e Dönüfltürmek Bir string’i double/float’a Dönüfltürmek De¤iflkenlerin Kullan›m›n› Gösteren Örnek Bir Program Operatörler Atama Operatörü (=) Aritmetik Operatörler (+ , - , * , / , %) Aritmetik Art›rma ve Eksiltme Operatörleri (++ , —) Aritmetik Atama Operatörleri ‹liflkisel Operatörler (< ,>,<=,>=,==, !=) Mant›ksal Operatörler Bitwise (Bit-Tabanl›) Operatörler ?: Operatörü: Operatör Önceli¤i Program Kontrol ‹fadeleri Kod Bloklar› If Cümleci¤i ve Yap›s› If Cümleci¤inin ‹ncelendi¤i Bir Program: HesapIslemleri.java If-Else Yap›s› If-Else Yap›s›n›n ‹ncelenmesi: HesapIslemleriV2.java 27 27 28 28 30 30 31 32 32 32 33 33 33 33 34 34 36 37 37 37 38 38 38 40 40 40 43 44 47 48 49 50 51 52 52 53 56 57 58 +JAVA-ICINDEKI 9/23/11 3:05 PM Page ix ‹Ç‹NDEK‹LER If Cümleci¤i ‹çerisinde Karmafl›k Mant›ksal ‹fadeler Kullanmak ‹ç ‹çe If-Else Yap›lar› Else If Deyimi switch-case Deyimi Diziler Tek Boyutlu Diziler Çok Boyutlu Diziler Döngüler while Döngüsü do while Döngüsü For Döngüsü Özelleflmifl for Döngüsü ‹ç içe Döngüler break ve continue Deyimleri Yorumlar Tek Sat›rdan Olufllan Yorumlar Blok Yorumlar 4 JAVA ‹LE NESNE TABANLI PROGRAMLAMAYA G‹R‹fi Girifl S›n›flar Nesneler public, private ve protected Anahtar Kelimeleriyle Üye De¤iflkenler ve Metotlar için Eriflim Seviyeleri Tan›mlamak new Operatörü Nokta (.) Operatörü Metotlar Metotlar›n Kullan›m› Yap›land›r›c› Metotlar (Constructors) Metotlar›n Afl›r› Yüklenmesi (Method Overloading) Statik Metotlar static Anahtar Kelimesinin Di¤er Kullan›mlar› Statik Üye De¤iflken Tan›mlama De¤eri De¤iflmeyen Sabit De¤iflkenler Tan›mlama Recursif Metotlar ‹stisna Yönetimi (Exception Handling) Try-Catch Blo¤u throws Anahtar Kelimesi throw Anahtar Kelimesi 59 60 61 63 67 67 71 74 74 76 78 80 83 86 87 87 88 89 89 90 92 93 95 95 96 98 99 101 102 103 103 105 105 108 108 109 109 ix +JAVA-ICINDEKI 9/23/11 3:05 PM Page x x JAVA VE JAVA TEKNOLOJ‹LER‹ finally Anahtar Kelimesi Paketler (Packages) Baflka Paketteki S›n›flar› Kullanmak Bir S›n›f› import Anahtar Kelimesini Kullanmadan Ça¤›rmak 111 112 114 114 5 JAVA ‹LE NESNE TABANLI PROGRAMLAMA TEMELLER‹ Girifl Kal›t›m Üst S›n›f (Super Class) ve Alt S›n›f (Sub Class) Kavram› super() Metodu ile Üst S›n›f›n Yap›land›r›c›s›n› Ça¤›rmak this Anahtar Kelimesi Kal›t›m Örne¤i Object S›n›f› instanceof Anahtar Kelimesi Çok Biçimlilik (Polymorphism) Soyut S›n›flar (Abstract Classes) Soyut Metotlar (Abstract Methods) Arayüzler (Interfaces) implements Anahtar Kelimesi final Anahtar Kelimesinin Kal›t›mda Kullan›m› S›n›flar Aras›ndaki Kal›t›msal ‹liflkiler Kolleksiyonlar (Collections) ArrayList Yap›s› ArrayList Kullan›m› için Örnek Bir Program 115 115 115 121 121 121 123 127 127 128 131 131 132 132 133 134 135 136 137 6 JAVA ENTEGRE GEL‹fiT‹RME ORTAMLARI VE NETBEANS KURULUMU Girifl Java Projelerini Elle Build Etmek ve Çal›flt›r›labilir jar Uzant›l› Dosyalar Oluflturmak Java Build Sisteml Ant Maven Ant ile Maven’›n Karfl›laflt›r›lmas› Java Entegre Gelifltirme Ortamlar› (Java IDE’leri) Eclipse (MyEclipse) IntelliJ Idea JBuilder JCreator JDeveloper Netbeans 139 139 140 144 144 148 155 155 156 157 158 159 160 160 +JAVA-ICINDEKI 9/23/11 3:05 PM Page xi ‹Ç‹NDEK‹LER Netbeans IDE’sinin Özellikleri Netbeans Kurulumu 7 TEMEL JAVA UYGULAMA YAPILARI Girifl Java Konsol (Komut Sat›r›) Uygulamalar› Java Masaüstü Uygulamalar› Java Masaüstü Uygulama Kütüphaneleri AWT SWT Swing SwingX Kütüphanesi Netbeans ile Masaüstü Uygulamas› Örne¤i Masaüstü Uygulamalar›n›n Temel Özelliklerini De¤ifltirmek Look and Feel ile Swing Uygulamalar›’n›n Görünümlerini De¤ifltirmek Java Web Uygulamalar› MVC (Model View Controller) Yap›s› Java Web Frameworkleri (Uygulama Çat›lar›) Servlet JSP (Java Server Pages-Java Sunucu Sayfalar›) Struts Spring Seam JSF (Java Server Faces-Java Sunucu Yüzleri) Web Uygulamas›na Geçmeden Önce Bilinmesi Gereken Kavramlar POJO (Pla›n Old Java Objects-Eski Düz Java Nesneleri) JavaBean Netbeans ile JSF Web Uygulamas› Temel JSF Bileflenleri h:form Bilefleni h:dataTable Bilefleni h:column Bilefleni h:›nputText Bilefleni h:outputText Bilefleni h:commandButton Bilefleni Expression Language (Deyim Dili) Web Projelerini Çal›flt›rmak CSS ile Web Sayfalar›n› Güzellefltirmek Temel Netbans ‹fllemleri 161 162 171 171 172 177 178 178 178 178 179 179 189 192 196 196 197 197 197 197 198 198 198 198 198 199 200 210 210 210 210 211 211 211 211 212 213 215 xi +JAVA-ICINDEKI 9/23/11 3:05 PM Page xii xii JAVA VE JAVA TEKNOLOJ‹LER‹ Varolan Projeleri Açmak ve Kapamak Netbeans’de Ana Projeyi (Main Project) Belirlemek Editörde Sat›r Numaralar›n› Göstermek Projede Hata Ay›klamak Netbeans’de Bookmark (S›k Kullan›lan) Tan›mlamak 215 216 217 218 221 8 VER‹TABANI TEMELLER‹ VE BLOG UYGULAMASI ‹Ç‹N VER‹TABANI TASARIMI 223 Girifl 223 Veritaban› Kavram› 224 ‹liflkisel Veritabanlar› 224 Veritaban› Yönetim Sistemleri (DBMS-Database Management Systems) 224 ‹liflkisel Veritaban› Yönetim Sistemleri (RDBMS-Database Management Systems) 225 Bir ‹liflkisel Veritaban› Örne¤i 225 Primary Key (Birincil Anahtar) Kavram› 226 SQL Dili 226 Create Komutu 227 Insert Komutu 227 Select Komutu 228 Where Anahtar Kelimesi 229 LIKE Operatörü 230 Where ‹fadesi ‹çerisinde Birden Fazla Koflul Kullanmak 231 Update Komutu 231 Delete Komutu 232 Drop Komutu 232 ‹liflkisel Veritaban› Tasar›m› 232 Blog Veritaban› Tasar›m› 233 Foreign Key (Yabanc› Anahtar) Kavram› 234 MySQL Kurulumu 235 MYSQL’in Yap›land›r›lmas› 239 MySQL Servisinin Otomatik Olarak Bafllat›lmas› 245 MySQL Komut Sat›r› ‹stemcisi (MySQL Command Line Client) 247 Navicat Uygulamas› ile MySQL ‹fllemlerini H›zland›rmak 250 Navicat Uygulamas›n›n Kurulumu 251 Navicat ile MySQL Üzerinde Blog Veritaban›n›n Oluflturulmas› 256 Netbeans ile Veritabanlar›na Eriflim 264 9 JDBC ‹LE VER‹TABANI PROGRAMLAMA TEMELLER‹ Girifl JDBC (Java Database Connectivity) 269 269 269 +JAVA-ICINDEKI 9/23/11 3:05 PM Page xiii ‹Ç‹NDEK‹LER Veritaban› Sürücüsü (Database Driver) Kavram› MYSQL Veritaban› Sürücüsü’nün Netbeans Uygulamalar›nda Kullan›lmas› VeritabaniIslemleri.java S›n›f› Blog Veritaban›ndaki Kay›tlar›n Tutulaca¤› S›n›flar›n Modellenmesi Kullanici.java S›n›f› Blog.java S›n›f› Girdi.java S›n›f› Yorum.java S›n›f› Araclar.java S›n›f› JDBC ‹fllemlerini Gerçeklefltirebilmek için Gerekli Olan Bileflenler Connection (java.sql.Connection) Statement PreparedStatement CallableStatement ResultSet JDBC ile Select ‹fllemi JDBC ile Insert ‹fllemi JDBC ile Update ‹fllemi JDBC ile Delete ‹fllemi JDBC ile Tablo Kolon Bilgilerinin (Metadata) Elde Edilmesi JDBC ile Transaction Yönetimi VeritabaniIslemleri.java S›n›f›n›n Tam Kodu BlogOlustur Uygulamas› 10 SWING ‹LE MASAÜSTÜ UYGULAMA TEMELLER‹ Girifl Matisse Görsel Arayüz Yöneticisi (Matisse GUI Builder) Design (Tasar›m) Modu Source (Kaynak Kod) Modu Palette (Palet) Penceresi Properties (Özellikler) Penceresi Inspector Penceresi Navigator Penceresi Swing Temelleri JFrame Bilefleni JTextField Bilefleni JTextArea Bilefleni JButton Bilefleni JComboBox Bilefleni 270 270 273 274 274 276 277 279 280 281 282 282 282 283 283 284 286 287 288 288 289 290 300 303 303 303 304 305 306 306 307 307 308 308 309 309 309 312 xiii +JAVA-ICINDEKI 9/23/11 3:05 PM Page xiv xiv JAVA VE JAVA TEKNOLOJ‹LER‹ JTable Bilefleni JDialog Bilefleni JPanel Bilefleni BlogYöneticisi Uygulamas› BlogYoneticisiView Penceresi jDialogYeniBlogOlustur Penceresi jDialogKullaniciBilgisiDetay Penceresi jDialogKullaniciBilgileriniDüzenle Penceresi BlogYöneticisi Uygulamas›nda Kullan›lan Paketler blogyoneticisi Paketi Alt›nda Bulunan S›n›flar blogyoneticisi.resources Paketi Alt›nda Bulunan Dosyalar blogyoneticisi.siniflar.genel Paketi Alt›nda Bulunan S›n›flar blogyoneticisi.siniflar.model Paketi Alt›nda Bulunan S›n›flar blogyoneticisi.siniflar.veritabani Paketi Alt›nda Bulunan S›n›flar BlogYoneticisiView S›n›f›nda Kullan›lan Önemli Üye De¤iflkenler Ana Form (BlogYoneticisiView) Üzerinde Bulunan Bileflenler ‹çin Tan›mlanm›fl Olaylar BlogYoneticisiView ‹çinde Kullan›lan Yard›mc› Metotlar jDialogYeniBlogOlustur Penceresi ‹çindeki Bileflenler için Tan›mlanm›fl Olan Olaylar jDialogKullaniciBilgisiDetay Penceresindeki Bileflenler için Tan›mlanm›fl Olan Olaylar jDialogKullaniciBilgileriniDüzenle Penceresi ‹çindeki Bileflenler için Tan›mlanm›fl Olan Olaylar Uygulaman›n Çal›flt›r›lmas› Uygulamaya Eklenebilecek Özellikler 11 JSF 2.0 ‹LE WEB BLOG UYGULAMASI Girifl JSF (Java Server Faces-Java Sunucu Yüzleri) Bir JSF Projesinin Temel Bileflenleri Java S›n›flar› Web Sayfalar› XML Uzant›l› Ayar Dosyalar› Projede Kullan›lan .jar Uzant›l› Yard›mc› Kütüphane Dosyalar› BlogWeb Uygulamas›n›n Oluflturulmas› BlogWeb Uygulamas›n›n Çal›flt›r›lmas› Projenin Genel Yap›s› Projedeki Web Sayfalar› ve Stil Dosyalar› Projede Bulunan Paket ve S›n›flar 313 315 315 316 317 318 319 319 320 320 321 321 324 326 328 328 333 335 336 336 338 339 341 341 342 342 342 343 344 344 344 345 345 345 345 +JAVA-ICINDEKI 9/23/11 3:05 PM Page xv ‹Ç‹NDEK‹LER Projede Bulunan Kütüphaneler Projede Bulunan Yap›land›rma Dosyalar› BlogWeb Uygulamas›nda Gerçeklefltirilen Temel JSF ‹fllemleri PrimeFaces için Yap›land›rma Ayarlar›n›n Eklenmesi Sayfa Tasar›mlar›nda Taglib Etiket Kütüphanelerinin Tan›mlanmas› Sayfa Tasar›mlar›nda CSS Dosyalar›n›n Kullan›m› Butonlar ve CommandLink’ler Arac›l¤›yla ManagedBean ‹çindeki Metotlar›n Ça¤r›lmas› Managed Bean ‹çindeki Metotlara Parametre Gönderme Kullan›c›n›n Girdi¤i Verilerin ‹stenilen Biçimde Olup Olmad›¤›n›n ‹ncelenmesi (Form Validation ‹fllemi) Managed Bean’ler ‹çinde Tan›mlanm›fl Metotlardan Veritaban›na Eriflim Sayfada Tekrar Eden ‹fllemler için <u›:repeat> Etiketinin Kullan›lmas› Yetkisiz Kullan›c›lar›n ‹fllem Yapmas›n› Önleyebilmek için Aktif Bileflenlerin rendered Özelli¤inin Kullan›lmas› Kullan›c›ya Yapt›¤› ‹fllem ‹çin Onaylama (confirm) Diyalo¤u Gösterilmesi Sayfa Yönlendirme ‹fllemi Girifl-Ç›k›fl ‹fllemi Yetkisiz Kullan›c› Giriflinin Önlenmesi PrimeFaces Bilefleni Olan <p:editor> Bilefleninin Kullan›lmas› BlogWeb Uygulamas›ndaki Sayfalar ve Görünümleri index.xhtml Sayfas› kullanici.xhtml Sayfas› tumgirdiler.xhtml Sayfas› blog.xhtml Sayfas› blogduzenle.xhtml Sayfas› girdiduzenle.xhtml Sayfas› yorumduzenle.xhtml Sayfas› BlogWeb Uygulamas›ndaki Kullan›lan S›n›flar KullaniciBean.java GirdiDetay.java VeritabaniIslemleri.java S›n›f›na Eklenen Metotlar BlogWeb Uygulamas›ndaki Kullan›lan CSS Dosyalar› cssLayout.css default.css 12 JAX-WS KÜTÜPHANES‹ VE NETBEANS ‹LE XML TABANLI WEB SERV‹SLER‹ OLUfiTURMAK Girifl Web Servisi Kavram› 346 347 347 348 348 349 349 351 351 353 354 355 356 357 357 359 362 364 364 366 368 371 376 378 380 382 382 397 398 406 406 409 411 411 411 xv +JAVA-ICINDEKI 9/23/11 3:05 PM Page xvi xvi JAVA VE JAVA TEKNOLOJ‹LER‹ Web Servisi Teknolojisinin Temel Bileflenleri UDDI (Universal Description, Discovery and Integration) WSDL (Web Servis Description Language) SOAP (Simple Object Access Protocol) SOA (Service Oriented Architecture) Bir Web Servis Uygulama Senaryosu Web Servislerinin Çal›flma Yap›s› Netbeans ile Web Servisi Uygulamas› Netbeans ile Web Servisini Oluflturma Netbeans ile Web Servis ‹stemcisi Oluflturma 412 412 412 412 413 413 413 414 414 424 13 D‹⁄ER UYGULAMA ÖRNEKLER‹ Java ile Temel Dosya ‹fllemleri Dosya Seçme ‹fllemi (Dosya Seç Butonu) Dizin Seçme ‹fllemi (Dizin Seç Butonu) Dosya Oluflturma ‹fllemi (Dosya Olufltur Butonu) Dizin Oluflturma ‹fllemi (Dizin Olufltur Butonu) Dosya Kopyalama ‹fllemi (Seçili Yolu Kopyala Butonu) Dosya Tafl›ma ‹fllemi (Seçili Yolu Tafl› Butonu) Dosya Silme ‹fllemi (Seçili Yolu Sil Butonu) Java ile Metin Dosyalar›na Eriflim Java ile Metin Dosyalar›na Yazmak (Text Dosyas›na Yaz Butonu) Java ile Metin Dosyalar›ndan Okumak (Text Dosyas›ndan Oku Butonu) Netbeans ile Java Applet Örne¤i Uygulamalarda JFreeChart ile Çizelge (Grafik) Oluflturmak Netbeans ile Otomatik Olarak JavaDoc Oluflturma Java ile Raporlama JasperReports Kütüphanesi IReport Uygulamas› IReport ile Rapor Oluflturma IReport ile De¤iflik Dosya Biçimlerinde Raporlar Almak 431 431 432 433 434 435 435 437 438 440 440 442 442 454 458 461 461 461 463 472 14 J2ME ‹LE CEP TELEFONU VE MOB‹L C‹HAZLAR ‹Ç‹N UYGULAMA GEL‹fiT‹RME Girifl Önemli Kavramlar J2ME MIDP (Mobile Information Device Profile) MIDlet CLDC (Connected Limited Device Configuration) CDC (Connected Device Configuration) 475 475 475 475 476 476 476 476 +JAVA-ICINDEKI 9/23/11 3:05 PM Page xvii ‹Ç‹NDEK‹LER Netbeans Mobility Toolkit Netbeans Mobility Toolkit Kullan›m› ve Örnek Bir Uygulama Projenin Oluflturulmas› Mobility Toolkit Araçlar›n›n ‹ncelenmesi Palette Penceresi Sihirbaz›n Üretti¤i Haz›r Projenin Simülatör Üzerinde Çal›flt›r›lmas› Proje ‹çeri¤inin De¤ifltirilmesi Projenin Çal›flt›r›lmas› 477 478 479 480 483 483 484 486 15 JPA VE HIBERNATE ‹LE VER‹TABANLARINA ER‹fi‹M Girifl ORM (Object Relational Mapping) Kavram› JPA (Java Persistence API) JDBC Sürücüsü (JDBC Driver) veya JDBC Veri Kayna¤› (JDBC Datasource) Persistence.xml Dosyas› Entity S›n›flar› (Entity Classes) Entity Yöneticisi (Entity Manager) Netbeans ile JPA Eriflimi JPAHibernateSwing Projesinin Oluflturulmas› Sihirbaz Taraf›ndan Otomatik Oluflturulan Dosyalar persistence.xml Dosyas› JPAQL (JPA Query Language-JPA Sorgu Dili) Normal Sorgu Örnekleri Parametreli Sorgu Örnekleri Annotation (Dipnot) Kavram› ve JPA’da Bulunan Önemli Dipnotlar @Entity @Table @NamedQuery @NamedQueries @Column @Id @OneToMany Eager (‹stekli) Fetch (Veri Çekme) ‹fllemi Lazy (Tembel) Fetch (Çekme) ‹fllemi Lazy ve Eager Fetch ‹fllemlerinin Performansa Etkisi @ManyToOn @OneToOne @ManyToMany JPA ile Temel Veritaban› ‹fllemleri Entity Manager’in Oluflturulmas› 489 489 490 490 491 491 491 491 491 492 496 497 511 511 511 511 512 512 512 512 513 513 513 514 514 515 515 516 516 518 518 xvii +JAVA-ICINDEKI 9/23/11 3:05 PM Page xviii xviii JAVA VE JAVA TEKNOLOJ‹LER‹ JPA ile SELECT ‹fllemi JPA Sorgular›nda NamedQuery Kullan›m› JPA Sorgular›nda Parametre Kullan›m› JPA ile UPDATE ‹fllemi JPA ile DELETE ‹fllemi JPAHibernateSwing Uygulamas›n›n ‹çeri¤i Programda Kullan›lan Temel De¤iflkenler Programda Kullan›lan Yard›mc› Metotlar Ana Penceredeki Bileflenler ‹çin Tan›mlanm›fl Olan Olaylar Blog ‹fllemleri Penceresinde Tan›mlanm›fl Olan Olaylar Kullan›c› ‹fllemleri Penceresinde Tan›mlanm›fl Olan Olaylar JFileChooser Kullan›m› 16 ‹LER‹ KONULAR Gelifltirdi¤iniz Masaüstü Uygulamalar› ‹çin Kurulum Sihirbaz› Oluflturma Inno Setup Yaz›l›m›n›n ‹ndirilmesi ve Kurulumu Yaz›l›m Gelifltirme Yaklafl›mlar› Waterfall (fielale) Modeli Agile (Çevik) Yaz›l›m Gelifltirme Modeli Scrum Faydal› Java Araç ve Kütüphanelerinin Bir Listesi Apache/POI Apache/Commons Substance JFreeChart JESS SAX LUCENE SOLR Zemberek RihFaces ICEFaces PrimeFaces GWT (Google Web Toolkit) JNI (Java Native Interface) JNDI JUnit Quartz SONSÖZ 518 518 519 519 519 520 522 522 525 527 528 530 533 533 534 544 545 545 545 545 545 546 546 546 547 547 547 547 547 547 547 547 547 548 548 548 548 549