Bahasa Pemrograman Terpopuler

oleh: Stephanus Eko Wahyudi, S.T. (Ubaya), MMM (Monash-Melbourne), dosen Jurusan Teknik Informatika Universitas Surabaya

Perkembangan dunia Information and Communication Technology  (ICT) atau dikenal di Indonesia dengan Teknologi Informasi dan Komunikasi  (TIK) tak pelak lagi membuat kesempatan berkarir dan mengembangkan potensi diri pada bidang ini begitu luasnya. Bisa dikata pada saat ini tidak seorangpun di dunia yang menguasai secara keseluruhan semua teknologi yang ada, dengan ketersediaan beragam perangkat keras (hardware) dan perangkat lunak (software).

Penggunaan perangkat keras dan lunak di tingkat pemerintahan, enterprise/corporate, maupun individu begitu bervariasinya. Baik dari sisi vendor, spesifikasi, operating system, maupun dari fitur yang ditawarkan. Berkembangnya teknologi mobile computing dengan berbagai perangkatnya juga nampak mendonimasi pasar ICT pada beberapa tahun terakhir. Persaingan antara vendor besar perangkat mobile mendorong perang mobile OS yang sekarang didominasi Apple IOS dan Android.

Bahasa Pemrograman apa yang seyogyanya dipelajari saat ini? Apakah bahasa pemrograman tersebut akan dibutuhkan di dunia kerja pada masa mendatang? Mungkin itu adalah serangkaian pertanyaan yang mungkin muncul di kepala pada saat akan memutuskan untuk mempelajari komputer, bahkan apabila akan masuk ke salah satu jurusan yang ada di perguruan tinggi. Tulisan ini akan mencoba untuk mengupas mengenai beberapa bahasa pemrograman yang saat ini sedang populer dan potensinya di masa depan.

Menurut Tiobe, salah satu lembaga riset yang telah beberapa tahun berupaya membuat peringkat bahasa pemrograman populer dunia yang diwujudkan dalam bentuk TIOBE Programming Community Index edisi March 2013, Java dan C masih menjadi bahasa pemrograman yang paling populer pada posisi 1 dan posisi 2. Berdasarkan lembaga riset yang sama, Objective-C melonjak beberapa peringkat ke posisi 3. Selaras dengan itu, Sourceforge sebagai salah satu situs online populer yang menjadi sumber berbagai software open source juga merilis The Language Popularity Index yang pada edisi April 2013 juga menempatkan ketiga bahasa pemrograman pada posisi 1-3. Daftar lain yang dikeluarkan PYPL dalam daftar PYPL PopularitY of Programming Language index masih menempatkan Java pada peringkat 1, sedangkan PHP pada yang pada pemeringkatan lain menampati posisi ke 4-10, pada peringkat ini menempati peringkat ke-2.

TIOBE Programming Community Index edisi March 2013

TIOBE Programming Community Index edisi March 2013

SourceForge The Language Popularity Index April 2013

SourceForge The Language Popularity Index April 2013

PYPL PopularitY of Programming Language index

PYPL PopularitY of Programming Language index

Berdasarkan lowongan pekerjaan, situs Statistic Brain mengumpulkan data dari berbagai situs iklan populer di dunia, dan menampilkan daftar programmer yang paling banyak dicari. Tidak mengherankan penempatan PHP dan SQL pada urutan pertama, sesuai dengan kebutuhan untuk pengembangan situs web yang sedemikian besarnya.

Statistic Brain

 

Dari berbagai data yang tersebut, dapat disimpulkan bahwa Java merupakan bahasa pemrograman yang paling populer saat ini. Aplikasi yang dikembangkan dengan Java yang bersifat cross platform – bisa dijalankan di berbagai OS – nampaknya masih menjadi solusi terhadap kemunculan berbagai OS di dunia, baik mobile maupun PC. Pemanfaatan Java untuk mengembangkan aplikasi berbasis Android juga menjadi salah satu yang memantapkan Java di posisi 1.

Bahasa lain yang tidak kalah populernya adalah C, yang bisa dikatakan sebagai salah satu bahasa pemrograman induk dari berbagai bahasa pemrograman lain. Sebagai bahasa pemrograman induk, sebagian besar bahasa pemrograman lain memiliki syntax yang serupa dengan bahasa ini. Oleh karena itu, banyak yang beranggapan, belajar bahasa pemrograman C merupakan kunci untuk mempelajari bahasa lain.

Perkembangan pemanfaatan iDevice yang dikeluarkan Apple dengan berbagai devicenya seperti iPod, iPhone, iPad, Mac, dan berbagai produk lainnya menjadi salah satu faktor pendorong kepopuleran Objective-C. Model distribusi apps- sebutan program untuk mobile device yang dipopulerkan Apple – melalui AppStore nampaknya menggiurkan banyak orang untuk meraih keuntungan dari penjualan Apps.

Bahasa pemrograman lain yang terlihat tidak terlalu mendominasi pada daftar peringkat bahasa pemrograman populer namun ternyata banyak dibutuhkan di dunia kerja adalah Bahasa PHP. Bahasa ini nampaknya merupakan bahasa wajib yang juga harus dipelajari, seiring dengan perkembangan dunia maya. Hampir seluruh web hosting di dunia support PHP dan MySQL, paduan serasi yang memungkinkan sebuah situs web untuk tampil dinamis.

 

Kesimpulan

Dari tulisan ini terlihat beberapa bahasa pemrograman yang paling populer yang harus dipelajari, yaitu: Java, C, Objective C, dan tentunya PHP. Tentunya bekal penguasaan bahasa pemrograman tersebut akan sangat dibutuhkan di dunia kerja masa kini sampai beberapa tahun ke depan.

Namun demikian, bukan berarti bahasa pemrograman lain tidak patut untuk dipelajari. Justru sebagaian orang berpendapat, dengan mempelajari bahasa pemrograman lain yang kurang populer, maka orang tersebut akan menjadi expertise yang langka, yang sangat diputuhkan pula di dunia industri yang spesifik. Jadi sebaiknya tidak menutup diri pula terhadap bahasa pemrograman lain.

Jurusan Teknik Informatika Universitas Surabaya sendiri selalu melakukan pengembangan kurikulumnya sesuai dengan perkembangan jaman. Apabila ingin mempelajari berbagai teknologi maupun bahasa pemrograman tersebut, mungkin jurusan ini merupakan salah satu tempat yang tepat.

 

Referensi:

http://www.tiobe.com/index.php/content/paperinfo/tpci/

http://lang-index.sourceforge.net/

https://sites.google.com/site/pydatalog/pypl/PyPL-PopularitY-of-Programming-Language

http://www.statisticbrain.com/computer-programming-language-statistics/

MySQL Backend

Description

MYSQL backend stores all data in a MySQL database server, which parameters are defined by configuration (see SMSD Configuration File for description of configuration options).

For tables description see SMSD Database Structure

This backend is based on SQL Service.

 

Configuration

Before running gammu-smsd you need to create necessary tables in the database, which is described bellow

The configuration file then can look like:

[smsd]
service = sql
driver = native_mysql
host = localhost

See also


SMSD Configuration File

Privileges

The user accessing the database does not need much privileges, the following privleges should be enough:

GRANT USAGE ON *.* TO 'smsd'@'localhost' IDENTIFIED BY 'password';

GRANT SELECT, INSERT, UPDATE, DELETE ON `smsd`.* TO 'smsd'@'localhost';

Note

For creating the SQL tables you need more privileges, especially for creating triggers, which are used for some functionality.

Creating tables

SQL script for creating tables in MySQL database:

-- phpMyAdmin SQL Dump
-- version 2.8.0.3
-- http://www.phpmyadmin.net
-- 
-- Host: localhost
-- Generation Time: Jun 10, 2006 at 11:08 PM
-- Server version: 5.0.18
-- PHP Version: 5.1.3
-- 
-- Database: `smsd`
-- 

-- --------------------------------------------------------

-- 
-- Table structure for table `daemons`
-- 

CREATE TABLE `daemons` (
  `Start` text NOT NULL,
  `Info` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- 
-- Dumping data for table `daemons`
-- 

-- --------------------------------------------------------

-- 
-- Table structure for table `gammu`
-- 

CREATE TABLE `gammu` (
  `Version` integer NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- 
-- Dumping data for table `gammu`
-- 

INSERT INTO `gammu` (`Version`) VALUES (13);

-- --------------------------------------------------------

-- 
-- Table structure for table `inbox`
-- 

CREATE TABLE `inbox` (
  `UpdatedInDB` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `ReceivingDateTime` timestamp NOT NULL default '0000-00-00 00:00:00',
  `Text` text NOT NULL,
  `SenderNumber` varchar(20) NOT NULL default '',
  `Coding` enum('Default_No_Compression','Unicode_No_Compression','8bit','Default_Compression','Unicode_Compression') NOT NULL default 'Default_No_Compression',
  `UDH` text NOT NULL,
  `SMSCNumber` varchar(20) NOT NULL default '',
  `Class` integer NOT NULL default '-1',
  `TextDecoded` text NOT NULL default '',
  `ID` integer unsigned NOT NULL auto_increment,
  `RecipientID` text NOT NULL,
  `Processed` enum('false','true') NOT NULL default 'false',
  PRIMARY KEY `ID` (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

-- 
-- Dumping data for table `inbox`
-- 

-- --------------------------------------------------------

-- 
-- Table structure for table `outbox`
-- 

CREATE TABLE `outbox` (
  `UpdatedInDB` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `InsertIntoDB` timestamp NOT NULL default '0000-00-00 00:00:00',
  `SendingDateTime` timestamp NOT NULL default '0000-00-00 00:00:00',
  `SendBefore` time NOT NULL DEFAULT '23:59:59',
  `SendAfter` time NOT NULL DEFAULT '00:00:00',
  `Text` text,
  `DestinationNumber` varchar(20) NOT NULL default '',
  `Coding` enum('Default_No_Compression','Unicode_No_Compression','8bit','Default_Compression','Unicode_Compression') NOT NULL default 'Default_No_Compression',
  `UDH` text,
  `Class` integer default '-1',
  `TextDecoded` text NOT NULL default '',
  `ID` integer unsigned NOT NULL auto_increment,
  `MultiPart` enum('false','true') default 'false',
  `RelativeValidity` integer default '-1',
  `SenderID` varchar(255),
  `SendingTimeOut` timestamp NULL default '0000-00-00 00:00:00',
  `DeliveryReport` enum('default','yes','no') default 'default',
  `CreatorID` text NOT NULL,
  PRIMARY KEY `ID` (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE INDEX outbox_date ON outbox(SendingDateTime, SendingTimeOut);
CREATE INDEX outbox_sender ON outbox(SenderID);

-- 
-- Dumping data for table `outbox`
-- 

-- --------------------------------------------------------

-- 
-- Table structure for table `outbox_multipart`
-- 

CREATE TABLE `outbox_multipart` (
  `Text` text,
  `Coding` enum('Default_No_Compression','Unicode_No_Compression','8bit','Default_Compression','Unicode_Compression') NOT NULL default 'Default_No_Compression',
  `UDH` text,
  `Class` integer default '-1',
  `TextDecoded` text default NULL,
  `ID` integer unsigned NOT NULL default '0',
  `SequencePosition` integer NOT NULL default '1',
  PRIMARY KEY (`ID`, `SequencePosition`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- 
-- Dumping data for table `outbox_multipart`
-- 

-- --------------------------------------------------------

-- 
-- Table structure for table `pbk`
-- 

CREATE TABLE `pbk` (
  `ID` integer NOT NULL auto_increment,
  `GroupID` integer NOT NULL default '-1',
  `Name` text NOT NULL,
  `Number` text NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- 
-- Dumping data for table `pbk`
-- 

-- --------------------------------------------------------

-- 
-- Table structure for table `pbk_groups`
-- 

CREATE TABLE `pbk_groups` (
  `Name` text NOT NULL,
  `ID` integer NOT NULL auto_increment,
  PRIMARY KEY `ID` (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

-- 
-- Dumping data for table `pbk_groups`
-- 

-- --------------------------------------------------------

-- 
-- Table structure for table `phones`
-- 

CREATE TABLE `phones` (
  `ID` text NOT NULL,
  `UpdatedInDB` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `InsertIntoDB` timestamp NOT NULL default '0000-00-00 00:00:00',
  `TimeOut` timestamp NOT NULL default '0000-00-00 00:00:00',
  `Send` enum('yes','no') NOT NULL default 'no',
  `Receive` enum('yes','no') NOT NULL default 'no',
  `IMEI` varchar(35) NOT NULL,
  `Client` text NOT NULL,
  `Battery` integer NOT NULL DEFAULT -1,
  `Signal` integer NOT NULL DEFAULT -1,
  `Sent` int NOT NULL DEFAULT 0,
  `Received` int NOT NULL DEFAULT 0,
  PRIMARY KEY (`IMEI`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- 
-- Dumping data for table `phones`
-- 

-- --------------------------------------------------------

-- 
-- Table structure for table `sentitems`
-- 

CREATE TABLE `sentitems` (
  `UpdatedInDB` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `InsertIntoDB` timestamp NOT NULL default '0000-00-00 00:00:00',
  `SendingDateTime` timestamp NOT NULL default '0000-00-00 00:00:00',
  `DeliveryDateTime` timestamp NULL,
  `Text` text NOT NULL,
  `DestinationNumber` varchar(20) NOT NULL default '',
  `Coding` enum('Default_No_Compression','Unicode_No_Compression','8bit','Default_Compression','Unicode_Compression') NOT NULL default 'Default_No_Compression',
  `UDH` text NOT NULL,
  `SMSCNumber` varchar(20) NOT NULL default '',
  `Class` integer NOT NULL default '-1',
  `TextDecoded` text NOT NULL default '',
  `ID` integer unsigned NOT NULL default '0',
  `SenderID` varchar(255) NOT NULL,
  `SequencePosition` integer NOT NULL default '1',
  `Status` enum('SendingOK','SendingOKNoReport','SendingError','DeliveryOK','DeliveryFailed','DeliveryPending','DeliveryUnknown','Error') NOT NULL default 'SendingOK',
  `StatusError` integer NOT NULL default '-1',
  `TPMR` integer NOT NULL default '-1',
  `RelativeValidity` integer NOT NULL default '-1',
  `CreatorID` text NOT NULL,
  PRIMARY KEY (`ID`, `SequencePosition`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE INDEX sentitems_date ON sentitems(DeliveryDateTime);
CREATE INDEX sentitems_tpmr ON sentitems(TPMR);
CREATE INDEX sentitems_dest ON sentitems(DestinationNumber);
CREATE INDEX sentitems_sender ON sentitems(SenderID);

-- 
-- Dumping data for table `sentitems`
-- 

-- 
-- Triggers for setting default timestamps
-- 

DELIMITER //

CREATE TRIGGER inbox_timestamp BEFORE INSERT ON inbox
FOR EACH ROW
BEGIN
    IF NEW.ReceivingDateTime = '0000-00-00 00:00:00' THEN
        SET NEW.ReceivingDateTime = CURRENT_TIMESTAMP();
    END IF;
END;//

CREATE TRIGGER outbox_timestamp BEFORE INSERT ON outbox
FOR EACH ROW
BEGIN
    IF NEW.InsertIntoDB = '0000-00-00 00:00:00' THEN
        SET NEW.InsertIntoDB = CURRENT_TIMESTAMP();
    END IF;
    IF NEW.SendingDateTime = '0000-00-00 00:00:00' THEN
        SET NEW.SendingDateTime = CURRENT_TIMESTAMP();
    END IF;
    IF NEW.SendingTimeOut = '0000-00-00 00:00:00' THEN
        SET NEW.SendingTimeOut = CURRENT_TIMESTAMP();
    END IF;
END;//

CREATE TRIGGER phones_timestamp BEFORE INSERT ON phones
FOR EACH ROW
BEGIN
    IF NEW.InsertIntoDB = '0000-00-00 00:00:00' THEN
        SET NEW.InsertIntoDB = CURRENT_TIMESTAMP();
    END IF;
    IF NEW.TimeOut = '0000-00-00 00:00:00' THEN
        SET NEW.TimeOut = CURRENT_TIMESTAMP();
    END IF;
END;//

CREATE TRIGGER sentitems_timestamp BEFORE INSERT ON sentitems
FOR EACH ROW
BEGIN
    IF NEW.InsertIntoDB = '0000-00-00 00:00:00' THEN
        SET NEW.InsertIntoDB = CURRENT_TIMESTAMP();
    END IF;
    IF NEW.SendingDateTime = '0000-00-00 00:00:00' THEN
        SET NEW.SendingDateTime = CURRENT_TIMESTAMP();
    END IF;
END;//

DELIMITER ;

Note

You can find the script in docs/sql/mysql.sql as well.

MeekroDB – simple PHP MySql Library

MeekroDB adalah sebuah library PHP MySQL yang dapat anda gunakan untuk mempersingkat/memperpendek jumlah baris statement PHP dalam melakukan query ke MySql, selain itu MeekroDB juga dapat mencegah SQL injection pada site anda.

Contohnya jika kita melakukan query mysql dengan hanya menggunakan php saja, lalu melakukan pengecekan error dan lalu ingin mengambil record pertama, maka biasanya susunan kodenya seperti dibawah ini :

$result = $mysqli->query(“SELECT * FROM accounts WHERE username=’” . $mysqli->real_escape_string($username) . “‘ AND rank=” . intval($rank));
if ($result->error) die(“Error occurred: ” . $result->error);
$user = $result->fetch_assoc();

Ternyata diperlukan 3 baris kode php, sementara itu anda harus meng-escape string, juga menggunakan fungtion intval untuk menarik nilai integer dari variabel $rank. Semakin banyak query anda maka ketiga baris kode itu juga akan semakin sering ditulis kembali. Jika kita menggunakan MeekroDB, maka ketiga baris kode diatas dapat disederhanakan menjadi hanya satu baris seperti berikut ini :

$user = DB::queryOneRow(“SELECT * FROM accounts WHERE username=%s AND rank=%i”, $username, $rank);

Berikut ini akan saya tuliskan beberapa contoh penggunaan MeekroDB dan perbandingannya jika menggunakan PHP biasa.

  • select

Jika menggunakan PHP saja maka anda harus selalu meng-escape variabel jika tidak ingin terkena SQL injection, seperti contoh ini :

$mysqli->query(“SELECT * FROM login WHERE username=’” . $mysqli->real_escape_string($username) . “‘ AND password=’” . $mysqli->real_escape_string($password) . “‘”);

Jika anda menggunakan MeekroDB, maka anda tidak perlu peduli dengan proses escape variabel, dan baris kode diatsa dapat diubah menjadi berikut ini :
DB::query(“SELECT * FROM login WHERE username=%s AND password=%s”, $username, $password);
  • insert /  update
Jika menggunakan PHP biasa maka anda harus memasangkan sendiri nama field dengan value-nya pada saat insert, juga anda harus meng-escape value-nya sebelum query dijalankan, seperti contoh berikut ini :
$mysqli->query(“INSERT INTO mytable (`name`, `rank`, `location`, `age`, `intelligence`) VALUES (‘” . $mysqli->real_escape_string($name) . “‘,’” . $mysqli->real_escape_string($rank) . “‘,’” . $mysqli->real_escape_string($location) . “‘,” . intval($age) . “,’” . $mysqli->real_escape_string($intelligence) . “‘)”);
Jika menggunakan MeekroDB maka baris kode diatas dapat dipersingkat menjadi :
      DB::insert('mytable', array(
        'name' => $name,
        'rank' => $rank,
        'location' => $location,
        'age' => $age,
        'intelligence' => $intelligence
      ));