Archive | Komputer RSS for this section

How to send MMS using SOAP MM7

Here’s an article describing how to implement MM7 connection to your service provider’s MMS center.

Perhaps for the start, I would like to tell the history of MM7 implementation. At first most vendors implement MM7 connection to send MMS content using their own proprietary library. E.g. One of biggest vendor uses PAP (Push Application Protocol) to send standard MMS content from VAS App to the subscriber. Basically it’s built on standard MIME Message class.

Good news, nowadays many vendor has dealt to implement their MM7 connection from VAS App using standard SOAP connection. Moreover, under this SOAP implementation, they can support SMIL class message. It’s a standard Markup Language to implement layouting in MMS content delivery. Also, using this SMIL implementation, we can present multi pages MMS that showed one after another with predefined duration.

Here’s the example of SMIL tag:

<smil xmlns=”http://www.w3.org/2001/SMIL20/Language”&gt;

<head>

<layout>      <root-layout width=”160″ height=”120″/>

<region id=”upper” top=”0″ left=”0″ />      <region id=”lower” top=”100″ left=”0″ />

</layout>

</head>

<body>

<par dur=”3s”>      <text region=”lower” src=”text0.txt” />      <img region=”upper” src=”zzz.JPG” />      <audio src=”01000000478.mid” />    </par>

<par dur=”5s”>      <text region=”lower” src=”text3.txt” />      <img region=”upper” src=”zzz.JPG” />      <audio src=”01000000478.mid” />    </par>

</body></smil>

For the art of software programming, I will put my example code here in Java from scratch. Actually you can code SOAP Message in Java using SAAJ standard library.

At first you need to make sure that you have variables that define the connection to the MMSC. They are MMSC IP, Port, VASID, VASPID, and Password. It can be defined from file configuration.

String mmsc_ip = Utility.getConfiguration(“MmscSoap.ip”); int mmsc_port = Integer.parseInt(Utility.getConfiguration(“MmscSoap.port”)); String mmsc_pwd = Utility.getConfiguration(“MmscSoap.pwd”); String mmsc_vaspid = Utility.getConfiguration(“MmscSoap.vaspid”); String mmsc_vasid = Utility.getConfiguration(“MmscSoap.vasid”);

Basically, SOAP connection is a like a HTTP socket connection using POST method. So, we need to define the HTTP header:

String header = “POST /vas_soap HTTP/1.1\n” +

“Host: “+mmsc_ip+”:”+mmsc_port+”\n” +

“Authorization: Basic “+toBASE64(mmsc_pwd,0)+”\n” +

“User-Agent: mm7submit/0.1\n” +   “Content-Type: multipart/related; boundary=\”–_=_NextPart_21B2_1EE0_E97.2593\”; type=\”text/xml\”; start=\”<mm7submit@localhost>\”\n” +

“Content-Length: “+data.length()+”\n” +

“Accept: */*\n” +

“SOAPAction: \”\”\n\n”;

You can specify either the connection is using HTTP/1.1 or HTTP/1.0. Also you can add more HTTP header there, depends on the server’s need.

MMS contents are simply the texts, multimedia contents (audio, video, and picture), and SMIL tags that defined how the contents presented. Multimedia contents are supposed to be sent as format Base64 Encoding. So, we’re going to put

import sun.misc.BASE64Encoder;

in top of the file.

For the contents’ location, this tutorial will search the contents based on the URL specified in the SMIL tags. Normally, SMIL tag should not be filled with URL. But, to simplify the solution, this code will accept SMIL with URL. Then it will string-process the SMIL to extracts the URL of the contents. Then, will put the content name based on the hashcode of the URL specified.

<img region=”upper” src=”http://www.google.com/images/logos/ps_logo2.png” />

will be replaced with:

<img region=”upper” src=”c63893e3754e335896165ed94d6ce67e” />

The code will differs multimedia into three different types (audio, video, and image). Then it will assume the Content-Type based on the suffix of the URL path.

The code will string-process the smil to get contents’ URL:

smil = URLDecoder.decode(smil);

Vector<String> gambars = new Vector<String>();

Pattern p = Pattern.compile( “<img[ *]region=.[^<>’\”]*.[ *]src=[‘\”]([^’\”<>]*)[‘\”][ *]/>”,  Pattern.DOTALL);
Matcher matcher = p.matcher(smil);

while (matcher.find()) {

String temp = matcher.group(1);

if(!gambars.contains(temp))

gambars.add(temp);

}

Vector<String> suaras = new Vector<String>();

p = Pattern.compile(“<audio[ *]src=[‘\”]([^’\”<>]*)[‘\”][ *]/>”, Pattern.DOTALL);
matcher = p.matcher(smil);

while (matcher.find()) {

String temp = matcher.group(1);

if(!suaras.contains(temp))

suaras.add(temp);

}

Vector<String> videos = new Vector<String>();

p = Pattern.compile(“<video[ *]src=[‘\”]([^’\”<>]*)[‘\”][ *]/>”, Pattern.DOTALL);
matcher = p.matcher(smil);

while (matcher.find()) {

String temp = matcher.group(1);

if(!videos.contains(temp))

videos.add(temp);

}

And here’s how we build the main HTTP body:

String data = “”+ “—-_=_NextPart_21B2_1EE0_E97.2593\n” +

“Content-Type: application/xml\n” +

“Content-ID: <mm7submit@localhost>\n” + “\n” +

“<?xml version=\”1.0\” encoding=\”UTF-8\”?>\n” +

“<SOAP-ENV:Envelope xmlns:SOAP-ENV=\”http://schemas.xmlsoap.org/soap/envelope/\” xmlns=\”http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-2\”>\n” +

“<SOAP-ENV:Header>\n” +

” <TransactionID SOAP-ENV:mustUnderstand=\”1\”>vas00001</TransactionID>\n” +

“</SOAP-ENV:Header>\n” +

“<SOAP-ENV:Body>\n” +

“<SubmitReq>\n” +

“<MM7Version>5.3.0</MM7Version>\n” +

“<SenderIdentification>\n” +

” <VASPID>”+mmsc_vaspid+”</VASPID>\n” +

” <VASID>”+mmsc_vasid+”</VASID>\n” +

” <SenderAddress><Number>”+ sender +”</Number></SenderAddress>\n” +

” </SenderIdentification>\n” +

” <Recipients>\n” +

” <To><Number>”+to+”</Number></To>\n” +

” </Recipients>\n” + ” <MessageClass>Informational</MessageClass>\n” +

” <DeliveryReport>false</DeliveryReport>\n” +

” <ReadReply>false</ReadReply>\n” +

” <Priority>Normal</Priority>\n” +

” <Subject>”+subject+”</Subject>\n” +

” <ChargedParty>Sender</ChargedParty>\n” +

” <Content href=\”cid:content@localhost\” allowAdaptations=\”true\”/>\n” +

“</SubmitReq>\n” + “</SOAP-ENV:Body>\n” +

“</SOAP-ENV:Envelope>\n\n” + “—-_=_NextPart_21B2_1EE0_E97.2593\n” +

“Content-Type: multipart/mixed; boundary=\”—-_=_NextPart_220A_232_2517.E38\”\n” +

“Content-ID: <content@localhost>\n” + “\n”;

String texts[] = text.split(“<next/>”);

for(int g = 0; g < texts.length; g++){

data+=”——_=_NextPart_220A_232_2517.E38\n” +

“Content-Type: text/plain; charset=\”us-ascii\”; Name=text”+g+”.txt\n” +

“Content-ID: <text”+g+”.txt>\n” +

“Content-Location: text”+g+”.txt\n\n” +

texts[g]+”\n” + “\n”;

}
String gambar_name[] = null;

int max_depth = 0;

if(gambars != null){

Log.getLogger().debug(“Parse image…”);

gambar_name = new String[gambars.size()];

for(int g = 0; g < gambars.size(); g++){

if(max_depth == g) max_depth++;

URL sourceURL1 = null;

try {

String url = gambars.get(g).replaceAll(” ” , “+”);

sourceURL1 = new URL(url);

byte[] byteArray = null;

HttpClient http = new HttpClient();

http.getParams().setSoTimeout(timeout);

if (proxyHost != null && proxyPort != null) {

Log.getLogger().info(“Using proxy = ” + proxyHost + “:” + proxyPort);

http.getHostConfiguration().setProxy(proxyHost, Integer.parseInt(proxyPort));

}

HttpMethod method = new GetMethod(url);

http.getParams().setParameter(“http.socket.timeout”, timeout);

http.getParams().setParameter(“http.connection.timeout”, timeout);

method.getParams().setParameter(“http.socket.timeout”, timeout);

method.getParams().setParameter(“http.connection.timeout”, timeout);

try {

int statusCode = http.executeMethod(method);

if (statusCode != HttpStatus.SC_OK && statusCode != 202) {

byteArray = null; Log.getLogger().debug(“Status HTTP:”+ statusCode);

} else { byteArray = method.getResponseBody(); }

} catch (Exception e) { Log.getLogger().error(“Error in httpGet”, e); byteArray = null; }

finally { method.releaseConnection(); }

String filename = sourceURL1.getFile();

BASE64Encoder encoder = new BASE64Encoder();

if(filename.contains(“/”)) filename = filename.substring(filename.lastIndexOf(“/”)+1);

gambar_name[g] = Integer.toString(filename.hashCode());

smil = replace(smil, url, gambar_name[g]);

String format = filename.substring(filename.lastIndexOf(“.”)).toLowerCase();

String type = “image/png”;

if(format.equals(“.gif”)) type = “image/gif”;

else if(format.equals(“.jpg”) || format.equals(“.jpeg”)) type = “image/jpeg”;

else if(format.equals(“.png”)) type = “image/png”;

else if(format.equals(“.tiff”)) type = “image/tiff”;

data+=”——_=_NextPart_220A_232_2517.E38\n” +

“Content-Type: “+type+”;

Name=”+gambar_name[g]+”\n” +

“Content-Transfer-Encoding: base64\n” +

“Content-ID: <“+gambar_name[g]+”>\n” +

“Content-Location: “+gambar_name[g]+”\n\n” +

encoder.encode(byteArray)+”\n” + “\n”;

} catch (Exception e) {// TODO Auto-generated catch block e.printStackTrace(); }

}

}

String suara_name[] = null;

if(suaras != null){

suara_name = new String[suaras.size()];

for(int g = 0; g < suaras.size(); g++){

if(max_depth == g) max_depth++;

URL sourceURL1 = null;

try {

String url = suaras.get(g).replaceAll(” ” , “+”);

sourceURL1 = new URL(url);

byte[] byteArray = null;

HttpClient http = new HttpClient();

http.getParams().setSoTimeout(timeout);

if (proxyHost != null && proxyPort != null) {

Log.getLogger().info(“Using proxy = ” + proxyHost + “:” + proxyPort);

http.getHostConfiguration().setProxy(proxyHost, Integer.parseInt(proxyPort));

}

HttpMethod method = new GetMethod(url);

http.getParams().setParameter(“http.socket.timeout”, timeout);

http.getParams().setParameter(“http.connection.timeout”, timeout);

method.getParams().setParameter(“http.socket.timeout”, timeout);

method.getParams().setParameter(“http.connection.timeout”, timeout);

try {

int statusCode = http.executeMethod(method);

if (statusCode != HttpStatus.SC_OK && statusCode != 202) {

byteArray = null;

Log.getLogger().debug(“Status HTTP:”+ statusCode);

} else { byteArray = method.getResponseBody(); }

} catch (Exception e) { Log.getLogger().error(“Error in httpGet”, e); byteArray = null; }

finally { method.releaseConnection(); }

String filename = sourceURL1.getFile();

BASE64Encoder encoder = new BASE64Encoder();

if(filename.contains(“/”)) filename = filename.substring(filename.lastIndexOf(“/”)+1);

suara_name[g] = Integer.toString(filename.hashCode());

smil = replace(smil, suaras.get(g), suara_name[g]);

String format = filename.substring(filename.lastIndexOf(“.”)).toLowerCase();

String type = “audio/wav”;

if(format.equals(“.wav”)) type = “audio/wav”;

else if(format.equals(“.mid”) || format.equals(“.midi”)) type = “audio/midi”;

else if(format.equals(“.mp3”)) type = “audio/mp3”;

else if(format.equals(“.3gp”)) type = “audio/3gpp”;

else if(format.equals(“.aac”)) type = “audio/aac”;

else if(format.equals(“.amr”)) type = “audio/amr”;

else if(format.equals(“.amr-wb”)) type = “audio/amr-wb”;

else if(format.equals(“.mpeg”) || format.equals(“.mpg”)) type = “audio/mpeg”;

else if(format.equals(“.mp4”)) type = “audio/mp4”;

else if(format.equals(“.rmv”) || format.equals(“.rmvb”)) type = “audio/rmv”;

else continue;

data+=”——_=_NextPart_220A_232_2517.E38\n” +

“Content-Type: “+type+”; Name=”+filename+”\n” +

“Content-Transfer-Encoding: base64\n” +

“Content-ID: <“+filename+”>\n” +

“Content-Location: “+filename+”\n\n” +

encoder.encode(byteArray)+”\n” + “\n”;

} catch (MalformedURLException e) {// TODO Auto-generated catch block e.printStackTrace(); }

catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

String video_name[] = null;

if(videos != null) {

video_name = new String[videos.size()];

for(int g = 0; g < videos.size(); g++) {

if(max_depth == g) max_depth++;

URL sourceURL1 = null;

try {

String url = videos.get(g).replaceAll(” ” , “+”);

sourceURL1 = new URL(url);

byte[] byteArray = null;

HttpClient http = new HttpClient();

http.getParams().setSoTimeout(timeout);

if (proxyHost != null && proxyPort != null) {

Log.getLogger().info(“Using proxy = ” + proxyHost + “:” + proxyPort);

http.getHostConfiguration().setProxy(proxyHost, Integer.parseInt(proxyPort));

}

HttpMethod method = new GetMethod(url);

http.getParams().setParameter(“http.socket.timeout”, timeout);

http.getParams().setParameter(“http.connection.timeout”, timeout);

method.getParams().setParameter(“http.socket.timeout”, timeout);

method.getParams().setParameter(“http.connection.timeout”, timeout);

try {

int statusCode = http.executeMethod(method);

if (statusCode != HttpStatus.SC_OK && statusCode != 202) {

byteArray = null;

Log.getLogger().debug(“Status HTTP:”+ statusCode);

} else { byteArray = method.getResponseBody(); }

}

catch (Exception e) { Log.getLogger().error(“Error in httpGet”, e); byteArray = null; }

finally { method.releaseConnection(); }

String filename = sourceURL1.getFile();

BASE64Encoder encoder = new BASE64Encoder();

if(filename.contains(“/”)) filename = filename.substring(filename.lastIndexOf(“/”)+1);

video_name[g] = Integer.toString(filename.hashCode());

smil = replace(smil, videos.get(g), video_name[g]);

String format = filename.substring(filename.lastIndexOf(“.”)).toLowerCase();

String type = “video/mpeg”;

if(format.equals(“mpeg”) || format.equals(“mpg”)) type = “video/mpeg”;

else if(format.equals(“.3gp”) || format.equals(“.3gpp”)) type = “video/3gpp”;

else if(format.equals(“.mp4”)) type = “video/mp4”;

else if(format.equals(“.rmv”) || format.equals(“.rmvb”)) type = “video/rmv”;

else continue;

data+=”——_=_NextPart_220A_232_2517.E38\n” +

“Content-Type: “+type+”; Name=”+filename+”\n” +

“Content-Transfer-Encoding: base64\n” +

“Content-ID: <“+filename+”>\n” +

“Content-Location: “+filename+”\n\n” +

encoder.encode(byteArray)+”\n” + “\n”;

} catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); }

catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }

}

}

if(use_smil != null && !use_smil.equals(“”) && !use_smil.equals(“false”)) {

if(use_smil.toLowerCase().equals(“default”)){

smil = “<smil><head><layout><root-layout/><region id=\”upper\” top=\”0\” left=\”0\” /><region id=\”lower\” top=\”100\” left=\”0\” /><region id=\”lowest\” top=\”200\” left=\”0\” /></layout></head><body>”;

for(int g = 0; g < max_depth; g++) {

smil += “<par dur=\”3s\”>”;

if(g < texts.length) smil += “<text region=\”lower\” src=\”text”+g+”.txt\” />”;

if(gambar_name != null && g < gambar_name.length) smil += “<img region=\”upper\” src=\””+gambar_name[g]+”\” />”;

if(video_name != null && g < video_name.length) smil += “<video region=\”lowest\” src=”+video_name[g]+” />”;

if(suara_name != null && g < suara_name.length) smil += “<audio src=”+suara_name[g]+” />”;

smil += “</par>”;

}

smil += “</body></smil>”;

}

data += “——_=_NextPart_220A_232_2517.E38\n” +

“Content-Type: application/smil; charset=\”us-ascii\”; Name=smil4.smil\n” +

“Content-ID: <smil4.smil>\n” +

“Content-Location: smil4.smil\n” + “\n” +

“<?xml version=\”1.0\” encoding=\”utf-8\”?>” +

“<!DOCTYPE smil PUBLIC \”-//3GPP//DTD SMIL rel5//EN\” \”http://www.3gpp.org/SMIL20/PSS5\”>” + smil + “\n”;

}

data += “——_=_NextPart_220A_232_2517.E38–\n” + “—-_=_NextPart_21B2_1EE0_E97.2593–\n\n”;

Finally, here’s the code to submit the header + contents (data) to the MMSC using HTTP Socket SOAP:

String dat;

try {

Socket so = new Socket(mmsc_ip, mmsc_port);

BufferedOutputStream bos = new BufferedOutputStream(so.getOutputStream());

String msg = header + data;

BufferedReader br2 = new BufferedReader(new InputStreamReader(so.getInputStream()));

bos.write(msg.getBytes());

bos.flush();

dat = “”;

Log.getLogger().debug(“MmsSOAP request :”+msg);

String temp;

while((temp = br2.readLine()) != null){

dat += temp;

}

so.close();

try {

String a = dat.substring(dat.indexOf(“<StatusCode>”) + 12, dat.indexOf(“</StatusCode>”));

Log.getLogger().info(“MmsSOAP response :”+a);

ret = Integer.parseInt(a);

} catch (Exception e) {  // TODO Auto-generated catch block  ret = -9;  e.printStackTrace();  } }

catch (UnknownHostException e1) { // TODO Auto-generated catch block e1.printStackTrace(); }

catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); }

For the response, normally MMSC will reply response String 1000 as Success.

Difference between MySQL’s InnoDB and MyISAM

MySQL has two primary storange engines: MyISAM and InnoDB. Each has its own performance characteristics and considerations. In the broadest sense MyISAM is good for read-heavy data and InnoDB is good for write-heavy data, though there are cases where the opposite is true. The biggest gotcha is how the two differ with respect to the COUNT function.

ISAM = Indexed Sequential Access Method, while InnoDB is named after the engine’s creator Innobase Oy

MyISAM keeps an internal cache of table meta-data like the number of rows. This means that, generally, COUNT(*) incurs no additional cost for a well-structured query. InnoDB, however, has no such cache. For a concrete example, let’s say we’re trying to paginate a query. If you have a query SELECT * FROM users LIMIT 5,10, let’s say, running SELECT COUNT(*) FROM users LIMIT 5,10 is essentially free with MyISAM but takes the same amount of time as the first query with InnoDB. MySQL has a SQL_CALC_FOUND_ROWS option which tells InnoDB to calculate the number of rows as it runs the query, which can then be retreived by executing SELECT FOUND_ROWS(). This is very MySQL-specific, but can be necessary in certain situations, particularly if you use InnoDB for its other features (e.g., row-level locking, stored procedures, etc.).

======= BAHASA INDONESIA ========

MySQL memiliki dua mesin storange utama: MyISAM dan InnoDB. Masing-masing memiliki karakteristik performa dan pertimbangan. Dalam arti yang luas MyISAM baik untuk membaca-data (red) dan InnoDB baik untuk menulis data (write), meskipun ada kasus dimana kebalikannya yang benar. Perbedaan utama adalah bagaimana keduanya berbeda dalam penanganan fungsi COUNT.

ISAM = Indexed Sequential Metode akses, sedangkan InnoDB ini dinamakan berdasarkan penciptanya : Innobase Oy

MyISAM menyimpan cache internal tabel meta-data seperti jumlah baris. Ini berarti bahwa, pada umumnya, COUNT (*) berlangsung tanpa biaya tambahan untuk query yang terstruktur dengan baik. InnoDB, bagaimanapun, tidak memiliki cache tersebut. Untuk contoh konkret, mari kita mengatakan bahwa kita mencoba untuk penomoran pd halaman table (pagination). Jika Anda memiliki pertanyaan SELECT * FROM users LIMIT 5,10, katakanlah, menjalankan SELECT COUNT (*) FROM users LIMIT 5,10 pada dasarnya gratis dengan MyISAM tapi mengambil jumlah waktu yang sama sebagai permintaan pertama dengan InnoDB. MySQL memiliki opsi  SQL_CALC_FOUND_ROWS pada InnoDB untuk menghitung jumlah baris seperti menjalankan permintaan, yang kemudian dapat retreived dengan mengeksekusi SELECT FOUND_ROWS (). Hal ini sangat MySQL-spesifik, tetapi dapat diperlukan dalam situasi tertentu, terutama jika Anda menggunakan InnoDB untuk fitur lainnya (misalnya, tingkat baris penguncian, stored procedure, dll).

Twitter status update via curl

Sometimes,,you just need to waste your time just to sending status update to your twitter.

Here’s my suggestion to make your wasting time more wasted :),, by sending twitter status update via curl in bash scripting environment.

vi some-file.sh, and write this bunch of code :

#!/bin/bash
/usr/local/bin/curl --basic --proxy 10.2.249.250:8080 --user $1:$2 --data status="$3" twitter.com/statuses/update.xml

Then save the file using (:wq!)
give chmod +x some-file.sh to your script
Here you can call your script using :
./some-file.sh username passwd "your status"

I recommend to use (“) in your status,,,so that the script can detect that everything in between ” is your status..

have fun !

Malam pertama -ku dengan LInux

Akhir – akhir ini anak-anak satu jurusan di tempatku kuliah lagi getol-getolnya eksplorasi LINUX,

maklum saja, soalnya ada mata kuliah pemrograman sistem, yang nugasin pesertanya untuk ngebuat program ngebunuh zombie….

Tentu saja, maksudnya bukan zombie pucat seperti yang ada di pelem-pelem china jadul, tapi jejak proses (sudah mati) yang masih tertinggal dan membebani sistem, yang state-nya Z itu lo.

Kebanyakan dari mereka nginstal UBUNTU (kalo prediksiku mah, mereka pada kagum ama perusahaan canonical yang support ubuntu :-))

AKhirnya, daku juga terpengaruh nginstal ubuntu di PC -ku, hal yang masih tetap kulakukan walaupun teman-teman tidak merekomendasikan untuk menginstal ubuntu pada sistem yang offline (tak ber-internet)

—-

Ternyata memang sangat merepotkan untuk ‘memakai’ ubuntu di kompie offline, soalnya default package -nya gak lengkap, bayangin aja : format-format video yang sering kutonton (seperti mp4, mpeg, avi, dkk) codec -nya belom keinstal, terus mp3 aja belom ada codec-nya, yang paling parah complier gcc yang menjadi dasar tumpuan sw open source aja gak ada.

Karena kebelet untuk menonton pelem2 dari linux, akhirnya aku cari2 installer yang bentuknya .deb untuk kebutuhanku itu di kampus. Setelah sampai di rumah, buru-buru deh nyoba untuk nginstal package2 nya.

Bodohnya aku telah menyamakan persepsiku antara OS Linux dengan convensionally Windows , kupikir package instalasi .deb itu sudah terintegrasi dengan library2 pendukungnya seperti yang terjadi pada setup.exe nya Windows. Ternyata mereka ( those .deb s) membutuhkan dependency2 eksternal yang wajib terinstal sebelum ybs diinstal.

Haaaaaaahhhhhhhhhhh !!!!!!!!!! stresss aku, bayangin aja misalnya : satu software butuh dependency a dan b, ketika ingin menginstal dependency a, ternyata ia juga butuh dependency c dan , begitu selanjutnya. REKURSIF hampir tanpa batas !

Bisa-bisa ribet kayak gini :

ipp.png

hehehehe, akhirnya aku menyerah (fufufufufufu……..), dan berniat memberangusnya !

Tapi karena aku masih cupu (peace…..!), aku gak tau gmana cara uninstall (emangnya sw windows, hehe…) nya

Setelah dicoba2, akhirnya ditemukan cara yang cukup efektif, yakni :

  • Dengan SW Partition Magic 8.0 (atau semacamnya) di windows, format bagian hard disk yang berisi linux (baik partisi utama, maupun swap partition nya)
  • Sampai saat ini, MRB dari sistem kalian bakal kacau, karena modul bootku terhapus secara paksa (pada kasus ini saya menginstal Linux setelah Windows, sehingga untuk boot nya diatur oleh modulnya Linux)
  • Untuk ngebenerin bagian MBR ini, jalankan CD Windows mu, masuk ke menu Recovery (R), lalu jalankan fungsi fixmbr
  • Sampai bagian ini, sistem-mu sudah beres

Selamat mencoba !!!

nb : Aku udah nge-burn 4 DVD untuk repository Ubuntu feisty fawn a.k.a version 7.04, bagi yang mau menebusnya dengan sejumlah uang bisa menghubungi saya lewat bagian comment (hehehehe….)

Pertanyaan seputar kompetisi Indosat IWIC 2007

Beberapa hari yang lalu, saya sempet nanyain beberapa hal mengenai ketentuan teknis kompetisi Indosat Wireless Innovation Contest ini dalam dua email yang terpisah, kira-kira seperti ini :

——————

 Q : Bagaimana prosedur pendaftaran peserta iwic 2007 ini? Apakah dipungut biaya?

A : Pendaftaran bisa langsung mengirimkan biodata dan materi ke Iiwic2007@indosat.com / mardi.hendra@indosat.com  (jika soft copy) tapi kalau hard copy silahkan titip di galeri Indosat terdekat atau kantor Indosat terdekat (UP PR nya) atau ke Jakarta langsung di Kantor pusat PT indosat di lt 2 podium depan (mardi Hendra) dan tidak dipungut bayaran sama sekali

——————

Q : Dalam pengembangannya, apakah saya diperkenankan menggunakan library / API open source? Ataukah, saya harus mengembangkan semuanya dari awal? Selain itu, untuk kategori ini, apakah produk yang berbasis content sms diperkenankan (proses pengembangan terletak pada engine content ybs)?

A : konsep bebas silahkan menggunakan keahlian masing masing  dan untuk content sms juga diperkenankann

——————

 Q : Bagaimana aturan mengenai hak cipta untuk produk yang di submit oleh peserta?

A : Untuk hak cipta jika tidak dipilih menjadi finalis atau pemenang tetap akan menjadi milik penciptanya tetapi jika nanti menjadi juara  karya akan dberi hak paten oleh kami dan kemungkinan akan digunakan oleh kami jika bisa diadaptasi

——————

 Q : 1. Dari email saya sebelumnya mengenai apakah boleh menggunakan api open source pada aplikasi kita, yang dijawab boleh. Dan, kemudian pernyataan bahwa seandainya menjadi juara, Indosat akan membantu untuk mematenkan aplikasi-nya. Pertanyaannya ialah :  Bukankan dengan menggunakan beberapa komponen open source, maka aplikasi-nya tidak boleh dipatenkan? Atau bagaimana kebijakan IWIC 2007 jika menemui hal seperti ini?

2. Apakah produk dari sang juara, harus dipatekan? Bagaimana jika ia memilih untuk meng-open source-kan produknya?
 

A : Point 1 dan 2 adalah pilihan dari pesertanya sendiri…
Jika peserta ingin mem-paten-kan karyanya, maka bisa saja menggunakan aplikasi yang bukan open source.  Namun, jika peserta bermaksud untuk mem-paten-kan karyanya, Insya Allah kami akan membantunya…
ada 1 karya dari peserta terdahulu yang saat ini sedang di bahas intens oleh team product kita untuk dijadikan salah satu layanan dari Indosat.
Tentunya hal tersebut melalui berbagai pertimbangan teknis dan non teknis (termasuk administrasinya)

——————

 Q : Apakah seorang peserta boleh mengirimkan (submit) lebih dari satu ide/aplikasi?

A : Seorang peserta boleh mengirimkan karyanya lebih dari 1… (tidak ada pembatasan)

——————

 Q : Apakah satu ide/aplikasi bisa dikirim (submit) oleh lebih dari satu orang? maksud saya ialah satu tim yang terdiri dari beberapa orang.

A : Dalam 1 karya, boleh saja terdiri dari beberapa orang didalamnya, namun
jika karyanya maju ke grand final, maka hanya 1 orang saja yang maju atau melalui proses penjurian

——————

 Q : Apakah produk / ide nya harus benar-benar orisinil, dalam artian
belum pernah dikemukakan oleh siapa-pun di Indonesia/dunia, baik itu artikel
maupun produknya?

A : Definisi orisinil disini memang sedikit bias, karena bisa saja para dewan juri menilai ini orisinil, namun sebenarnya sudah pernah ada… makanya Insya Allah, kami memilih juri yang benar2 expert di bidangnya,
seperti:
Prof. Soehono, Onno Purbo, AW Subarkah, Mas Moko – Ericsson, Nokia, dan
Indosat sendiri.  Harapannya, karya yang terpilih adalah karya orisinil atau merupakan pembaruan dari karya yang pernah ada sebelumnya…

——————

mengenai kompetisi iwic 2007 sendiri, selengkapnya bisa dibaca di https://antonrifco.wordpress.com/2007/08/08/indosat-wireless-innovation-contest-2007/

Gimana? Apakah menjawab pertanyaan kalian?

Jadi ikutan kan? Ayo submit aja, put your name on the history !

Dan…., kalo menang di-open source kan doooong…… ! 🙂

Indosat Wireless Innovation Contest 2007

Teman – teman coder, udah tau belom mengenai satu lomba yang diselenggarain ama Indosat, yang kabarnya udah menjadi ajang rutin tahunan sejak 2005, Indosat Wireless Innovation Contest

————-

Tema dan Kategori IWIC 2007 kali ini mengambil tema ‘Inovasi Wireless Bagi Perkembangan Industri & Masyarakat’ yang mencakup 2 kategori

IDEA GENERATOR

bagi siswa SMP dan SMU.

Difokuskan pada inovasi teknologi wireless sebagai suatu ide yang berpotensi menjadi value creator baru bagi industri dan masyarakat. Karya dari kategori idea generator ini berupa konsep tertulis atau karya tulis

Pemenang I, mendapatkan tabungan pendidikan sebesar Rp. 10jt, medali, HP 3G
Pemenang II, mendapatkan tabungan pendidikan sebesar Rp. 7.5jt, medali, HP 3G
Pemenang III mendapatkan tabungan pendidikan sebesar Rp. 5 jt, medali, HP 3G

PRODUCT ORIENTED

bagi mahasiswa dan umum.

Ditujukan bagi peserta dari kalangan mahasiswa dan masyarakat umum yang difokuskan pada inovasi teknologi wireless sebagai suatu terapan yang memiliki nilai manfaat bagi industri dan masyarakat. Karya dari kategori ini berupa karya tulis disertai prototype hasil implementasi ide yang diusulkan.

Pemenang I, mendapatkan tabungan pendidikan sebesar Rp. 25juta, medali, HP 3G
Pemenang II, mendapatkan tabungan pendidikan sebesar Rp. 20juta, medali, HP 3G
Pemenang III mendapatkan tabungan pendidikan sebesar Rp. 15juta, medali, HP 3G

*) Masing-masing kategori terbagi dalam dua kriteria lagi yaitu software dan hardware.

Untuk kategori software, karya ditekankan pada ide dan atau aplikasi inovatif dari sebuah perangkat wireless yang belum pernah dibuat sebelumnya, unik, memiliki added value dan merupakan suatu terobosan baru serta memiliki nilai ekonomis

Sedangkan karya kategori hardware menekankan pada ide dan atau aplikasi inovatf
yang diterapkan dalam sebuah perangkat berbasis wireless baru ataupun yang sudah
ada sehingga memiliki nilai tam bah dan nilai ekonomis.

Kriteria Penilaian

Penilaian untuk keseluruhan kategori akan difokuskan pada unsur ’INOVASI’, dengan kriteria antara lain ide yang diusulkan merupakan ide orisinil yang belum pernah ada sebelumnya dan inovasi wireless yang dihasilkan memiliki nilai ekonomis sehingga bermanfaat bagi dunia industri terkait lainnya dari skala kecil hingga menengah.

Di samping itu, hasil karya harus aplikatif dan bermanfaat dalam kehidupan sehari-hari, dapat diwujudkan dalam prototype jika maju ke grand final untuk kategori product oriented dan konsep diserahkan dalam bentuk karya tulis A4 antara 6-8 lembar. Seluruh karya peserta akan dinilai oleh dewan juri yang terdiri dari praktisi inovasi dan new idea generator, vendor, akademisi/peneliti, wakil media massa, dan para profesional dari Indosat.

Kirim karya anda ke:
publicrelations@indosat.com
iwic2007@indosat.com
,

selambat-lambatnya tanggal 7 Oktober 2007.

Grand Final dan pengumuman pemenang dari kompetisi yang didukung oleh Nokia Siemens Network dan Ericsson ini akan dilaksanakan pada pertengahan Nopember 2007.

Untuk pemenang favorit akan dilakukan melalui pooling SMS antara tgl 2-19 Nopember 2007.

Detail artikel ini dapat anda lihat di
www.Indosat.com/iwic2007/

Pertanyaan seputar iwic2007 (my email), lihat di sini

——

SMS Reminder dari google Calendar

Pernah denger google Calendar kan?

Belum? parah lo… , kemana aja 🙂 ?

yaudah buka aja calendar.google.com

mantap nih calendar, serba online dan gratiss….tis…tis… (nah, gw demen ni yg kaya’ ginian :D)

di sini, kamu bisa buat jadwal apa aja (jadwal kuliah, jadwal tidur, jadwal makan, bahkan jadwal manggung di kali condet pun bisa , wakakakaka :-))

Ngebuat jadwal doang? Yah…. , kalo fiturnya cuma itu doang mah, yg desktop-desktop juga udah banyak

Gak lah. Dia bisa jadi reminder bung ! Bisa lewat email, dan yang paling keren bisa lewat sms.

Kamu bisa ngebuat suatu jadwal harian / mingguan / bulanan , atau event-event tertentu, dan kemudian mengeset supaya beberapa saat sebelum momen tersebut tiba, sebuah sms reminder akan dikirim ke nomor lo – lo pada.

Hanya saja untuk Indonesia, fitur sms reminder ini baru bisa untuk Indosat ama XL

Nah, caranya gini :

  • Buka calendar.google.com , silahkan login dulu sebelum masuk (atau register dulu kalo belom punya akun google)
  • Sebelum berkelana lebih jauh, atur terlebih dahulu setting kalender yang anda inginkan di Settings > General

setting calendar

  • Setelah puas melakukan setting, sekarang kamu udah bisa nambah – nambah event baru lewat menu di sebelah kiri : Create Event . Sebagai informasi, kamu juga bisa nambahin jadwal hari libur spesifik suatu negara, keagamaan (diantaranya : Islam, Kristen, Yahudi), atau bahkan bisa import dari calendar format MS Outlook CSV di menu Settings > Calendars.

add calendar

  • Setelah kalender-mu terisi, sekarang kamu bisa mengatur bagaimana google mengirim reminder ke kamu, bisa lewat email, sms, atau tidak ada reminder. Nah, kalo mau ada sms reminder, pengaturannya dilakukan di Settings > Mobile Setup . Di sini kamu akan ditanyakan negara (country), sama nomor telepon kamu (ingat, saat tulisan ini rilis, baru bisa untuk Indosat ama XL). Setelah diisi, kamu bakal dikirim kode verifikasi dari google ke nomor yang kamu masukin.
  • Kalo kamu udah nerima nomor verifikasi ini (cepet kok, pengalaman saya dalam waktu 5 detik sms verifikasi sudah diterima), masukin kode itu ke form Verification Code. Jangan lupa tekan tombol Save jika selesai melakukan pengaturan.

mobile setup

  • Sampai saat ini, fitur sms reminder kamu udah aktif.
  • Kamu bisa mengatur bagaimana suatu event dikirimkan remindernya, pada saat membuat event di Create Event, atau ketika mengeditnya

SELAMAT MENCOBA !!!