Archive

Archive for the ‘NyanyianKode’ Category

HTTP Listener dengan netcat

March 18, 2015 Leave a comment

Terkadang kita membutuhkan HTTP listener (seperti WebServer). Listener ini akan menerima HTTP get atau post yang dikirimkan oleh host lain yang mengarah ke HTTP listener kita. Untuk melakukan hal tersebut kita tidak perlu install “real” HTTP Server. Dengan berbekal netcat dan sedikit shell script, kita bisa membuat simple listener ini.

Kebetulan saya sedang ada keperluan untuk me-log semua stream HTTP yang dikirimkan dari host lain.

http_smslistener.sh:

#!/bin/bash

PORT=1234

while true; do
netcat -lp $PORT >> /pbx_u01/logs/sms.log < /opt/freeware/bin/index.html
done

Script diatas akan merespon setiap request HTTP yang masuk, dengan stream yang ada di index.html.
Semua request HTTP akan di log ke dalam file sms.log

index.html:

HTTP/1.0 200 OK
Content-Type: text/txt
Content-Length: 1

0

Sample http request via browser:
http://10.25.131.54:1234/mtpush?appsid=smsbanking&pwd=1234567&msisdn=628123456789&trx_date=20150318170257&sms=HelloWorld

sms.log:

GET /mtpush?appsid=smsbanking&pwd=1234567&msisdn=628123456789&trx_date=20150318170257&sms=HelloWorld HTTP/1.1
Host: 10.25.131.54:1234
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive

Sekian..semoga bermanfaat.

Salam,

Advertisements
Categories: Ngoprek, NyanyianKode

JBoss-seam double datasource

January 11, 2012 Leave a comment

Suatu hari anak muda mendapat tugas membuat sopwer yang menggunakan dua database. Yang satu menggunakan MySQL dan satu lagi Oracle. Sang anak muda sudah terbiasa menggunakan seam-framework dan akan menggunakan seam juga untuk membuat program yang ditugaskan.

Datasource yang pertama digunakan untuk main data transaction (smsgw), sedangkan datasource yang kedua digunakan sekedar baca (mbmcDatasource). Berikut adalah langkah2 yang dilakukan oleh anak muda dalam menggunakan dua datasource di seam-projectnya:

  1. Definisikan datasource di *-ds.xml
    <local-tx-datasource>
    <jndi-name>smsgwDatasource</jndi-name>
    <connection-url>jdbc:mysql://localhost:3306/smsgw</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>smsgw</user-name>
    <password>rahasia</password>
    </local-tx-datasource>

    <no-tx-datasource>
    <jndi-name>mbmcDatasource</jndi-name>
    <connection-url>jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:ORACLESID</connection-url>
    <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
    <user-name>root</user-name>
    <password>rahasia</password>
    </no-tx-datasource>

  2. Definisikan entity manager di component.xml
    <persistence:managed-persistence-context name=”entityManager”
    auto-create=”true”
    entity-manager-factory=”#{smsgwEntityManagerFactory}”/>
    <persistence:entity-manager-factory name=”smsgwEntityManagerFactory”
    persistence-unit-name=”smsgw”/>
    <persistence:managed-persistence-context name=”mbmcEntityManager”
    auto-create=”true”
    entity-manager-factory=”#{mbmcEntityManagerFactory}”/>
    <persistence:entity-manager-factory name=”mbmcEntityManagerFactory”
    persistence-unit-name=”mbmc”/>
  3. Definisikan jndi datasource nya di persistence-*.xml
    <persistence-unit name=”smsgw” transaction-type=”JTA”>
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>java:/smsgwDatasource</jta-data-source>
    <properties>
    <property name=”hibernate.dialect” value=”org.hibernate.dialect.MySQLDialect”/>
    <!– property name=”hibernate.hbm2ddl.auto” value=”update”/–>
    <property name=”hibernate.show_sql” value=”true”/>
    <property name=”hibernate.format_sql” value=”true”/>
    <property name=”hibernate.transaction.manager_lookup_class” value=”org.hibernate.transaction.JBossTransactionManagerLookup”/>
    <property name=”hibernate.connection.release_mode” value=”after_transaction”/>
    </properties>
    </persistence-unit>

    <persistence-unit name=”mbmc” transaction-type=”RESOURCE_LOCAL”>
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <non-jta-data-source>java:/mbmcDatasource</non-jta-data-source>
    <properties>
    <property name=”hibernate.dialect” value=”org.hibernate.dialect.Oracle10gDialect”/>
    <property name=”hibernate.show_sql” value=”true”/>
    <property name=”hibernate.format_sql” value=”true”/>
    <property name=”jboss.entity.manager.factory.jndi.name” value=”java:/mbmcEntityManagerFactory”/>
    <property name=”hibernate.connection.release_mode” value=”after_transaction”/>
    </properties>
    </persistence-unit>
    4. Untuk menggunakan masing-masing entityManager, sang anak muda cukup menggunakan anotasi lookup @In yang dimiliki oleh seamframework.
    —SomeWhere.java–
    @In
    private EntityManager entityManager;
    @In
    private EntityManager mbmcEntityManager;

Seingat anak muda itulah step2 yang dilakukannya. Semoga bermanfaat. Salam.

Categories: Ngoprek, NyanyianKode, seam

Ragam JAVA_OPTS untuk optimasi

June 23, 2011 Leave a comment

Berikut ini opsi-opsi JAVA_OPTS yang bisa digunakan untuk optimasi memori yang digunakan oleh JVM.

  • -Xms, mengatur besar inisialisai heap memori
  • -Xms, mengatur maximum heap memori
  • -XX:MaxPermSize, mengatur besaran heap space yang tidak akan kena gargage collector (GC)
  • -XX:+UseParallelGC, secara default JVM menggunakan GC dalam satu thread, namun dengan opsi ini GC bisa dijalankan dalam beberapa thread.
  • -XX:+AggressiveHeap, lebih optimal untuk long-running dan alokasi memori yang lumayan sering.

Sekian..semoga bermanfaat

Categories: Ngoprek, NyanyianKode

Remote debugging di Eclipse

June 15, 2011 Leave a comment

Bismillahirrahmaanirrahiim…

Udah lama tak terasa sekian tahun blog ini tak kukunjungi (haha, gaya kali kau meed). Kali ini aku ingin menuliskan tentang cara konfigurasi remote debugging di Eclipse.  Biar gak lupa..ku tuliskan saja disini, maklumlah boi aku ini agak2 payah dalam hal ingat-mengingat.

1. Tambahkan baris berikut di bagian parameter run-script dari aplikasi yang akan di debug:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=[PORT_NUMBER]

Sebagai contoh, yang akan didebug adalah aplikasi yang berjalan di JBoss (localhost). Maka di run-script JBoss nya kita tambahkan parameter diatas.


Sebagai contoh, nomor port yang akan digunakan oleh java agent sebagai “pintu masuk” debug adalah 9998. Nambahin parameternya tidak mutlak dari UI JBoss configuration yg ada di eclipse, ini cuma contoh saja. Dalam penerapan nanti bisa saja parameter di atas di tambahkan di dalam run.sh/run.bat ataupun run script bikinan sendiri.

2. Buat konfigurasi debug baru. Pillih menu Run->Debug configuration..lalu akan muncul form “Debug Configuration”.

Double click menu “Remote Java Application”, nanti akan ada form new debug configuration. Di bagian port, sila definisikan port mana si agent debug akan connect, di source project mana konfigurasi ini akan bekerja. Dari screenshot di atas, debug agent akan connect ke port 9998. Host bisa saja berupa komputer lain, namun pada contoh ini aplikasi yang akan didebug adalah di localhost.

Konfigurasi remote debugging sudah selesai. Kita bisa jalankan aplikasi yang akan didebug. Pastikan tidak ada firewall yang memblok port yang digunakan. Untuk melakukan debugging, pilih menu gambar kutu yang ada di toolbar eclipse, lalu pilih nama dari debug configuration yang telah didefinisikan pada point 2. Atau bisa melalui menu Run->Debug Configuration->Remote Java Application->[NAMA DEBUG CONFIGURATION]->debug.

Selesai – Semoga bermanfaat 🙂

Categories: NyanyianKode

Membaca event dari keypress

November 24, 2010 Leave a comment

Halo blog, udah lama kita ga ketemu. Kali ini aku mau menuliskan sedikit tentang nyanyian kode. Ini tentang membaca event dari keyboard, yang dipasang komponent.

                                   
function readKey(e) {
	var key;
	if(window.event)
		key = window.event.keyCode;     //IE
	else
		key = e.which;     		//Firefox
	if(key == 13)
		alert('enter boi');
	else
		alert('bukan enter');
}
       
<h:inputText value="#{bean.value}" onkeypress="readKey(event); return false;">

Semoga bermanfaat – salam;

Categories: NyanyianKode

Konfirmasi dialog popup di richfaces

September 9, 2009 3 comments

Kali ini saya mendapat tugas membuat konfirmasi dialog popup, yang menampilkan message tertentu..seperti “Are you sure..?” dilengkapi dengan tombol “Yes” atau “No”. Kebetulan teknologi web komponen yang dipakai kali ini adalah richfaces. Agar reusable, saya buat konfirmasi dialog popup tersebut sebagai komponen. Untuk itu dipakek lah teknologi facelets yang bisa bisa mendefine komponen dengan mudah. Dan kebetulan lagi, richfaces dan facelets tersebut sudah ada dan terkonfigurasi dalam JBoss Seam Framework, framework yang sedang saya gunakan sekarang. Untuk instalasi dan konfigurasi richfaces dan facelets, silahkan merujuk ke situs offi-sial-nya.

Langsung saja ke code nya y, daripada berpanjang lebar g jelas (talk is cheap, show me the code, Linus – 2000).

  • Buat satu page popup dialog konfirmasi. Kita beri nama confirmation.xhtml, kira-kira begini isinya:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    &ltui:component xmlns="http://www.w3.org/1999/xhtml"
       xmlns:h="http://java.sun.com/jsf/html"
       xmlns:a4j="http://richfaces.org/a4j"
       xmlns:rich="http://richfaces.org/rich"
       xmlns:f="http://java.sun.com/jsf/core"
       xmlns:ui="http://java.sun.com/jsf/facelets">
      
    <a4j:jsFunction name="#{submitName}" action="#{resolver.resolveMethodExpression(actionBean)}" reRender="#{listName}"/>
     
    <rich:modalPanel id="#{modalPanelId}" width="250" height="150">
       <f:facet name="header">#{messages['common.Confirmation']}</f:facet>
       <h:panelGrid>
          <h:panelGrid columns="2">
             <h:graphicImage value="/img/msginfo.png" />
             <h:outputText value="#{textMessage}" style="FONT-SIZE: large;" />
          </h:panelGrid>
          <h:panelGroup>
             <rich:spacer height="20px" />
    		 <input type="button" 
    		 value="OK" 
    		 onclick="#{rich:component(modalPanelId)}.hide();#{rich:component('wait')}.show(); 
                                 #{submitName}();return false;" />
    		 <input type="button" value="Cancel" onclick="#{rich:component(modalPanelId)}.hide();return false" />
          </h:panelGroup>
       </h:panelGrid>
    </rich:modalPanel>
    </ui:component>
                
  • Konfirmasi dialog akan menjalankan action tertentu jika jawaban dari user meng”iya”kan. Nah action tersebut kita jadikan parameter agar konfirmasi dialog yang kita pasang dapat memiliki action yang berbeda satu sama lain. Untuk keperluan ini maka kita buat backing bean Resolver. Resolver ini berfungsi me-resolve ekspresi EL berupa action atau method dari backing bean yang dijadikan parameter. Langkah berikutnya adalah membuat bean resolver tersebut. Berikut kodenya:
    /* Resolver.java */
    import org.jboss.seam.ScopeType;
    import org.jboss.seam.annotations.Name;
    import org.jboss.seam.annotations.Scope;
    import org.jboss.seam.core.Expressions;
    import org.jboss.seam.core.Expressions.MethodExpression;
    
    @Name("resolver")
    @Scope(ScopeType.APPLICATION)
    public class Resolver {
    	public Object resolveMethodExpression(String elStr) {
    		MethodExpression resolvedEl = Expressions.instance().createMethodExpression("#{" + elStr + "}");		
    		if (resolvedEl != null) {
    			resolvedEl.invoke();
    		}		
    		return resolvedEl;
    	}
    }
           

    Resolver mempunyai scope “application” karena bean ini akan digunakan berulang kali selama konfirmasi popup dialog digunakan. Sebagai catatan, Resolver diatas spesifik ke seam, karena menggunakan method yang dimiliki oleh seam.

  • Berikutnya tinggal membuat file definisi taglib atas komponen konfirmasi popup dialog dan mendefinisikan file taglib tersebut dalam web.xml.
                <!--- confirmation-taglib.xml --->
                <?xml version="1.0"?>
    <!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "facelet-taglib_1_0.dtd">
    <facelet-taglib>
       <namespace>https://urangbiase.wordpress.com/ui</namespace>
    	<tag>
    		<tag-name>confirm</tag-name>
    		<source>confirmation.xhtml</source>
    	</tag>
    </facelet-taglib>
           
                 <!--- web.xml --->
                 <context-param>
                     <param-name>facelets.LIBRARIES</param-name>
                     <param-value>/WEB-INF/confirmation-taglib.xml</param-value>
                 </context-param>
            
  • Selesai sudah komponen konfirmasi popup dialog yang kita buat. Berikutnya adalah implementasi dari komponen yang telah kita buat.

    <!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <ui:composition xmlns="http://www.w3.org/1999/xhtml"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:f="http://java.sun.com/jsf/core"
       -------------cutted text-----------8<
        xmlns:urang="https://urangbiase.wordpress.com/ui">
        -------------cutted text-----------8<
        <a4j:form>
    	&lturang:confirm actionBean="transportationList.removeSelected()" modalPanelId="removeSelectedTransportation" 
    				   listName="transportationList" textMessage="Are you sure remove selected row?"
    				   submitName="submitRemoveSelectedTransportation"/>
        -------------cutted text-----------8<
        <a4j:commandLink id="comLinkRemoveSelected">
               <h:graphicImage value="/img/trash.gif" />
        </a4j:commandLink>
       <rich:componentControl attachTo="comLinkRemoveSelected" 
               for="#{removeSelectedConfirmation}"
               event="onclick" 
               operation="show"/>
       <rich:toolTip value="#{messages['common.RemoveSelected']}" for="comLinkRemoveSelected2"/>
       </a4j:form>
    </ui:composition>
    

    Dan inilah hasil tangkapan layar dari konfirmasi dialog popup.

    popupdialog

    Demikianlah, semoga bermanfaat. Kritik, saran dan THR amat dinantikan :).

    PS: tulisan ini dibuat ketika belum dapat kucuran THR.

    Categories: NyanyianKode, seam

    Klausa equals String

    April 25, 2009 Leave a comment

    Untuk membandingkan dua String, biasa nya saya menggunakan cara ini:

        
        String str = "SangPemimpi"; 
        if (str.equals("SangPemimpi")) { 
            // do something 
        }

    Cara itu sudah benar, namun ada best-practicenya:

        
        if ("SangPemimpi".equals(str)) { 
            // do something 
        }
    

    Dimana letak perbedaanya? Cara yang pertama sangat riskan, bisa terkena NPE (NullPointerException) jika variabel str bernilai null. Sedangkan cara kedua, meskipun str bernilai null tidak akan terjadi NPE.

    Sekian, semoga bermanfaat

    Categories: NyanyianKode