27 Eylül 2015 Pazar

Linux Terminalinden YouTube Videosu İndirme

YouTube dan video indirmek için JDownloader ve Free YouTube Downloader gibi uygulamalar kullanılabilir.Bildiğim kadarıyla Free YouTube Downloader ' ın Linux için bir sürümü mevcut değil.Fakat Jdownlaoder ubuntu markette şu an mevcut.

Bunları kullanmak yerine http://www.youtubevideoindir.org/ sitesine URL i girip de videoyu indirebiliriz.

Bu yazımda Linux terminalinden youtube-dl ile bir YouTube videosunun nasıl indirileceğinden bahsedeceğim.


Öncelikle aşağıda ki gibi youtube-dl paketini sudo apt-get install youtube-dl ile yüklüyoruz.


Bu paketi yükledikten sonra artık YouTube'dan video indirebiliriz. Bu işlemi ;

youtube-dl -o videoadi.mp4 videoUrl

Bu komutu verince aşağıda ki gibi indirme işlemi başlar ve home dizinimize video inmiş olur.


30 Haziran 2015 Salı

REST With Java (JAX-RS) -Jersey Kullanımı


Bu yazımda bir Jersey implementationu olan JAX-RS ile RESTful webservislerinin nasıl geliştirildiğinden bahsedeceğim.

Rest(Representational State Transfer) : REST , SOAP gibi bir servisdir.REST in SOAP dan en önemli farkı XML ve JSON formatı ile mesaj yollayıp geri alıyor olabilmesidir.REST , HTTP protokolü üzerinden GET,POST,PUT veya DELETE komutlarını kullanarak isteklerini bildirir.Şimdi bu komutlara bir göz atalım.

GET : Sunucuda bulunan kaynağı(resource) almak için kullanılır.Bu metod ile resource değişmez.Bir nevi select görevi görür.

POST : Yeni bir kaynak(resource) oluşturmaya yarar.Bir nevi insert görevi görür.

PUT : Mevcut bir kaynağı değiştirmek-güncellemek için kullanılır.Bir nevi update görevi görür.

DELETE : Mevcut bir kaynağı silmek için kullanılır.

Java da Jersey ileJAX-RS Kullanımı

Java'nın REST desteği JSR (Java Spesification Request) 311 aracılığıyla olur. İşte bu JSR 311 özelliği JAX-RS(Java API for RESTful Web Services) diye bilinir.

Jersey : Jersey bir JSR 311 implementationudur.Bu implementation Restful web servisleri için bir kütüphane sağlar.
Jersey hem server hem de client tarafında iletişim kurmamızı sağlar. URL aşağda ki gibidir;

      
http://your_domain:port/display-name/url-pattern/path_from_rest_class


Bu servlet gelen HTTP requestlerini analiz eder ve bunlara uygun bir response için uygun classı seçer.
JAX-RS , JAXB ' ye alternatif olarak JSON ve XML formatlarının ikisini de destekler.

@Produces(MediaType.TEXT_PLAIN[, more-types]) : Mime türünün belirlememize yarar.Gelen data GET metodu ile alınan datadır.Bu tür ayrıca “application/xml” ya da “application/json” da olabilir.Yanda ki kısımda “text/plain” örnek olarak kullanılmıştır.
@Consumes(type[, more-types]) : Alınan kaynağın mime type ını belirlemek için kullanırız.

@PATH(your_path) : URL + /your_path.Aşağıda ki örnek gibidir.

 http://your_domain:port/display-name/url-pattern/path_from_rest_class


Jersey kütüphanelerini buradan indirebilirsiniz.


Aşağıda ki örnekler Jersey kullanarak XML ve Json formatında RestFul webservis yazılışını göstermektedir.

 Java classlarımızı yazmaya başlamadan önce açtığımız Dynamic Web Projesinde ki web.xml dosyamıza aşağıda ki gibi eklemeler yapmamız lazım.

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>KutuphaneOtomasyonu</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet- class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.mesutemre.kitaplarJAXRS</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>


KitaplarRestModel.java

@XmlRootElement(name = "kitap")
public class KitaplarRestModel {

private Integer kitapID;
private String kitapad;
private String yazarad;
private String kitaptur;
private String kitapdurum;

public Integer getKitapID() {
   return kitapID;
}

public void setKitapID(Integer kitapID) {
   this.kitapID = kitapID;
}

public String getKitapad() {
   return kitapad;
}

public void setKitapad(String kitapad) {
   this.kitapad = kitapad;
}

public String getYazarad() {
   return yazarad;
}

public void setYazarad(String yazarad) {
   this.yazarad = yazarad;
}

public String getKitaptur() {
   return kitaptur;
}

public void setKitaptur(String kitaptur) {
   this.kitaptur = kitaptur;
}

public String getKitapdurum() {
   return kitapdurum;
}

public void setKitapdurum(String kitapdurum) {
   this.kitapdurum = kitapdurum;
}
}

Yukarıda yazdığımız POJO , XML ve JSON elde etmek için kullanacağımız POJO dur.

Artık Resource dosyalarımızı yazabiliriz.


KitaplarRestResource.java


@Path("/kitaplar")
public class KitaplarRestResource {

@GET
@Produces(MediaType.TEXT_XML)
public List<KitaplarRestModel> getKitaplarBrowser() {
   return findAllBooks();
}

@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public List<KitaplarRestModel> getKitaplar() {
   return findAllBooks();
}

@GET
@Path("kitapsayisi")
@Produces(MediaType.TEXT_PLAIN)
public String getCount() {
   return String.valueOf(findAllBooks().size());
}

private List<KitaplarRestModel> findAllBooks() {
List<KitaplarRestModel> kitapRestList = new ArrayList<KitaplarRestModel>();
List<Kitaplar> kitapList = new ArrayList<Kitaplar>();
try {
    KitaplarFacade service = (KitaplarFacade) new InitialContext()
     .lookup("kitapservice");
    kitapList = service.findAllKitaplar();
    for (int i = 0; i < kitapList.size(); i++) {
        KitaplarRestModel krm = new KitaplarRestModel();
        krm.setKitapID(kitapList.get(i).getKitapID());
        krm.setKitapad(kitapList.get(i).getKitapad());
        krm.setYazarad(kitapList.get(i).getYazarad());
        krm.setKitaptur(kitapList.get(i).getKitaptur());
        krm.setKitapdurum(kitapList.get(i).getKitapdurum());

        kitapRestList.add(krm);
     }
  } catch (Exception e) {
      e.printStackTrace();
  }
   return kitapRestList;
 }
}

Burada findAllBooks() metodu ile DB deki kitap listesini çekiyoruz.Çektikten sonra kendi POJO typında bir List dolduruyoruz.


Yukarda ki URL'i tarayıcımıza yapıştırdığımız zaman bize XML formatında bir sayfa açacaktır.





<kitaplarRestModels>
   <kitap>
     <kitapID>12</kitapID>
     <kitapad>Java Server Pages</kitapad>
     <kitapdurum>Rafta</kitapdurum>
     <kitaptur>Bilgisayar</kitaptur>
     <yazarad>Mimar ASLAN</yazarad>
</kitap>

....


JSON formatında bir servis elde etmek için resource classımız aşağıda ki gibi olur.

KitaplarRestResourceJSON.java

@Path("/kitaplarjson")
public class KitaplarRestResourceJSON {

@GET
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
public List<KitaplarRestModel> getKitaplarJson() {
   return findAllBooks(); 
  }
}

http://localhost:9090/KutuphaneOtomasyonu/rest/kitaplarjson

Yukarıda ki URL ise bize JSON formatında kitap listemizi gösterir.

5 Nisan 2015 Pazar

JSF PhaseListener Kullanımı


PhaseListener ; JSF lifecycle ını dinleyen bir listenerdır.Bu class içerisinde ki beforePhase sayfa render edilmeden önce , afterPhase sayfa render edildikten sonra çalışır.

PhaseListener a JSF in Interceptor larıda diyebiliriz.

Yetkilendirme , loglama vs gibi işlemler burada yapılır.Aşağıda ki kodlarda logout olmuş bir kullanıcının , login olupta görmesi gereken bir sayfayı görüntülemeye çalışmasının PhaseListener kodları yazılıdır.Burada eğer kullanıcı logout olmuşsa , herhangi bir sayfaya gitmeğe çalıştığı zaman , kullanıcının index.xhtml sayfasına redirect edilmesi lazımdır.

Lafı fazla uzatmadan kodlama kısmına geçelim.



AuthorizationPhaseListener.java

public class AuthorizationPhaseListener implements PhaseListener {

private static final long serialVersionUID = 1L;

Logger logger = Logger.getLogger(AuthorizationPhaseListener.class);

@EJB
GeneralFacade service;

@Override
public void afterPhase(PhaseEvent event) {
logger.debug("afterPhase() Evresine geçildi..");

FacesContext facesContext = event.getFacesContext();
String currentPage = facesContext.getViewRoot().getViewId();

int isLoginPage = currentPage.lastIndexOf("index.xhtml");
HttpSession session = (HttpSession) facesContext.getExternalContext()
.getSession(true);
Object currentUser = session.getAttribute("kullaniciadi");

if (isLoginPage != 1) {
   if (currentUser == null) {
       ExternalContext ec = facesContext.getExternalContext();
       try {
           ec.redirect(ec.getRequestContextPath()
              + "/faces/index.xhtml");
       } catch (IOException ex) {  
              logger.error(ex);
       }
     }
   }
}

@Override
public void beforePhase(PhaseEvent arg0) {
}

@Override
public PhaseId getPhaseId() {
logger.debug("getPhaseId() Evresinde");
return PhaseId.RESTORE_VIEW;
}
}


Uygulamanın bu classı sürekli dinlemesi için faces-config.xml dosyasına aşağıda ki satırları eklememiz gerekiyor.

<lifecycle>
     <phase-listener>com.mesutemre.phases.AuthorizationPhaseListener</phaselistener>
</lifecycle>



27 Şubat 2015 Cuma

ZK FRAMEWORK İLE JPA KULLANIMI - 2

Önceki yazımda bir form uygulaması yapıp JPA kullanarak Database e kayıt atmıştık.Bu kayıtlar int,varchar ve longblob tipinde datalardı.
Bu yazımda kaydettiğimiz dataların  ZK Frameworkünün Listbox componenti üzerinde nasıl göstereceğimizi ele alacağım.
Şunu söylemeliyim ki data binding olayı ZK ya göre JSF de daha esnek daha anlaşılır ve daha kolay.ZK nın bu işi daha kolaylaştıracağını temenni ederek kodlamaya başlayalım.


kitapListesi.zul

<?page title="Kitap Listesi" contentType="text/html;charset=UTF-8"?>
<?taglib uri="http://www.zkoss.org/dsp/web/core" prefix="c"?>
<zk>
<listbox id="kitapListBox" emptyMessage="Kayıt yok!"
     mold="paging" pageSize="4" width="1000px"
     checkmark="true"                          apply="com.mesutemre.kitapIslemleri.KitapListesiControl"
     model="${win$composer.kitapListModel}">

     <listhead>
          <listheader width="32px" />
                <listheader label="Kitap Adı" align="center"
                          sort="auto(kitapad)" width="190px" />
                <listheader label="Yazar Adı" align="center"
                          sort="auto(yazarad)" width="190px" />
                <listheader label="Kitap Tür" align="center"
                          width="190px" sort="auto(kitaptur)" />
                <listheader label="Kitap Durum" align="center"
                          sort="auto(kitapdurum)" width="190px" />
                <listheader label="Kitap Resmi" align="center"
                          width="190px" />
     </listhead>
     <template name="model">
                <listitem>
                    <listcell />
                    <listcell label="${each.kitapad}" />
                    <listcell label="${each.yazarad}" />
                    <listcell label="${each.kitaptur}" />
                    <listcell label="${each.kitapdurum}" />
                    <listcell>
                          <image content="${c:new2('org.zkoss.image.AImage','',each.kitapimage)}" />
                    </listcell>
                </listitem>
     </template>
  </listbox>
               
</zk>


KitapListesiControl.java

public class KitapListesiControl extends SelectorComposer<Component> {

     private static final long serialVersionUID = 1L;

     private List<Kitaplar> kitapList = new ArrayList<Kitaplar>();
     private ListModel<Kitaplar> kitapListModel;

     @Wire
     private Listbox kitapListBox;

     @Wire
     private Image kitapImageId = new Image();

     KitapIslemleriDao kid = new KitapIslemleriDaoImpl();

     @Override
     public void doAfterCompose(Component comp) throws Exception {
          super.doAfterCompose(comp);
          kitapList = kid.findAllKitaplar();
          kitapListModel = new ListModelList<Kitaplar>(kitapList);
          kitapListBox.setModel(kitapListModel);

     }

     public List<Kitaplar> getKitapList() {
          return kitapList;
     }

     public void setKitapList(List<Kitaplar> kitapList) {
          this.kitapList = kitapList;
     }

}


DAO katmanında ki metodları bir önceki yazımda gösterdiğim için burada tekrar yazmaya gerek duymadım.Ekran aşağıda ki gibi olur.