Recent Articles

Open Source Mobile Content Delivery Platform II »

Previously I have written on Volantis and MyMobileWeb as a mobile content delivery platform.

If you are looking a PHP based CMS for mobile, then you can plug-ins then you can add to the existing CMS to make the content mobile compatible.

Wap-2-Go is a add-on module to PHPNuke.  It is a Mobile Content Management System (CMS) Portal and a simple ‘all in the box’ solution for webmasters wishing to provide dynamic content to mobile users. Fully customisable to your own design, or simply use pre-designed themes to style your mobile portal.

Wap-2-Go is a mobile website that can be accessible on mobile phones, PDAs and other mobile devices, generated ‘on-the-fly’ from your site content. Customisable User Preferences allow a bespoke fit to any device and allow disabling of images by users to reduce their bandwidth/traffic (useful if charged per Kb by their provider). The use of Themes also allow easy styling of your mobile portal.

Wap-2-Go is fully WML (WAP1.1) and xHTML (WAP2.0) compliant. WML is the standard mark-up language for mobile devices; whilst xHTML (WAP 2.0) allows more advanced styling – giving your site an even more impressive look.

For other CMS, e.g. Drupal, Joomla, or Typo3, have a read here

For Joomla, look at the PDA-Plugin

For Drupal, look at the Mobile Plugin

For WordPress, look at the following

Popularity: 2% [?]

Open Source Mobile Content Delivery Platform »

I have written about Volantis, which is a open source mobility server for mobile content delivery.

Other than Volantis, MyMobileWeb is another good open source mobile content delivery platform

MyMobileWeb is a low-cost, modular, open-standards-based, open source software platform that simplifies the development of top-quality mobile web applications and portals, providing an advanced content & application adaptation environment.

It includes different modules which cover all the basic requirements that a complete and integrated mobile web site must fulfill, hiding from applications all complexity related to dealing with multiple delivery contexts. MyMobileWeb uses Device Information Simple API to recognize and obtain the capabilities of devices. As a value-added feature, MyMobileWeb incorporates some experimental modules capable of exploiting semantics in a mobile environment, implementing the concept of ‘Semantic Mobile Web’.

A good reading on MyMobileWeb can be found at http://mobiforge.com/developing/story/mymobileweb-an-open-source-platform-developing-mobi-compliant-applications

Popularity: 2% [?]

Free ScreenShot Utility for Testing »

Bug Shooting is a free screenshot utility that was developed for software testers who use bug tracking systems including FogBugz, Gemini, Ontime, BugTracker.NET and Mantis Bug Tracker. Screenshots can also be sent to Skype or a default E-Mail application (e.g., Outlook).

Since screenshots are frequently used to show system bugs or to reproduce the steps for a failed test, it is often very helpful to highlight, notate and/or crop areas of the screenshot. With Bug Shooting this can be done in a matter of seconds.

image

Features

Capture screen
- Capture windows
- Capture screen area
- Delayed capture
- Support for multiple screen

- Edit screenshot
    – crop
    – resize
    – add geometric shapes
    – add arrows
    – add text
    – add images
    – rotate, flip
    – highlight area

- Print screenshot
- Save screenshot
- Open screenshot from file
- Combine screenshots

- Shortcuts are possible for a lof of functions

- Send screenshots to different bug tracker
    – FogBugz
    – Gemini
    – OnTime
    – BugTracker.NET
    – SharpForge
    – MantisBT
    – DoneDone
    – JIRA
    – SpiraTest
    – Elementool
- Send screenshots to
    – Skype
    – Default Email Client
    – Any application by using command line

- Multilingual
    – English
    – German
    – Russian

- Custom commands: open an URL by shortcut

- Screen magnifier

- Automatic update function

- Silent installation and uninstallation

Popularity: 2% [?]

Dia: Free Alternative to Visio »

Dia is roughly inspired by the commercial Windows program ‘Visio’, though more geared towards informal diagrams for casual use. It can be used to draw many different kinds of diagrams. It currently has special objects to help draw entity relationship diagrams, UML diagrams, flowcharts, network diagrams, and many other diagrams. It is also possible to add support for new shapes by writing simple XML files, using a subset of SVG to draw the shape.

It can load and save diagrams to a custom XML format (gzipped by default, to save space), can export diagrams to a number of formats, including EPS, SVG, XFIG, WMF and PNG, and can print diagrams (including ones that span multiple pages).

It also has a Windows version available at http://dia-installer.de/index_en.html

Popularity: 1% [?]

Open Source Media Organiser »

Data Crow is the a media cataloger and media organiser.

  • Completely portable; you can even run it from a USB stick.
  • Highly customizable and feature rich.
  • Audio, software, book, movie and photo collection cataloger.
  • Retrieve information from services like Amazon.com and Imdb.com.
  • Optional web module; a web interface and an integrated web server.
    Import file information (mp3, divx, xvid, ..)
  • Loan registration.
    PDF and HTML reporting.
  • Create new modules to, for example, maintain your stamp collection.
  • Available translations: Italian, German, Dutch, English and French.

Popularity: 1% [?]

Open Source Java Web Browser Component »

JRex is a Java Browser Component with set of API’s for Embedding Mozilla GECKO within a Java Application.

Features

  • Embedded Java Browser based on Mozilla GECKO.
  • Event capturing like InputEvents (Mouse & keyboard), History, ContextMenu, ContentUrlListener, Observer, Progress, ToolTip.
  • Compatible with AWT and Swing.
  • Build in support for window and event management.
  • Easy to use, developer need not know much of Mozilla details. The effective line of code for simple use is not more than 3 lines.
  • Easy to use and easily extendable API’s.
  • Compatible with windows and *nix (Having GTK support).
  • Compatible with Mozilla Gecko 1.4 and above. Has been tested with Mozilla Gecko 1.4 and 1.6 and 1.7.7
  • Supports Tabbed and Java Internal Pane browser windows.
  • Support for Profile & preferences.
  • Support for Persist, Find & BroswerSetup (to enable/disable plug-in, image etc.) preferences.
  • Support for accessing DOM objects of rendered page.
  • JRex also implements DOM HTML2 for manipulating loaded HTML Document.
  • In built support for Java WebStart deployment.
  • In built support for LiveConnect which helps in communication between javascript and Java.
    • Can be used for communication between XUL and JVM in which JRex is running.

 

The Lobo Project aims to develop an extensible browser and RIA platform written completely in Java that not only supports HTML and Javascript, but also enables rendering of arbitrary Rich Internet Application (RIA) languages. The Lobo Project consists of the following efforts.

  • HTML Renderer & Parser Effort (Cobra)
    The Cobra effort aims to produce a pure Java HTML parser and rendering engine with support for CCS2 and Javascript.
  • Java Web Browser Effort (Lobo)
    Lobo is the web browser and RIA platform. It relies on Cobra to provide the HTML rendering capabilities of the browser. The Lobo effort itself aims to produce a general-purpose and extensible browser that can render content other than HTML.
  • JavaFX Integration and Other Efforts
    Lobo ships with an extension that can render JavaFX Script and Java source code, in much the same way HTML is supported.

Popularity: 2% [?]

Open Source Java Library for Capturing Web Site Screen »

Scrender is a java library that performs screen capturing of web sites. It is essentially captures the web site’s appearance as is is being rendered by operating system native browser. Scrender is built on top of SWT and is a part of the Dapper project.

Popularity: 1% [?]

.NET Distribute and Parallel Program Execution Engine »

Dryad is an infrastructure which allows a programmer to use the resources of a computer cluster or a data center for running data-parallel programs. A Dryad programmer can use thousands of machines, each of them with multiple processors or cores, without knowing anything about concurrent programming.

dryad-job

A Dryad programmer writes several sequential programs and connects them using one-way channels. The computation is structured as a directed graph: programs are graph vertices, while the channels are graph edges. A Dryad job is a graph generator which can synthesize any directed acyclic graph. These graphs can even change during execution, in response to important events in the computation.

Dryad is quite expressive. It completely subsumes other computation frameworks, such as Google’s map-reduce, or the relational algebra. Moreover, Dryad handles job creation and management, resource management, job monitoring and visualization, fault tolerance, re-execution, scheduling, and accounting.

Popularity: 1% [?]

Java: Open Source Image Process Library »

ImageJ is a public domain Java image processing program inspired by NIH Image for the Macintosh. It runs, either as an online applet or as a downloadable application, on any computer with a Java 1.4 or later virtual machine. Downloadable distributions are available for Windows, Mac OS, Mac OS X and Linux.

It can display, edit, analyze, process, save and print 8-bit, 16-bit and 32-bit images. It can read many image formats including TIFF, GIF, JPEG, BMP, DICOM, FITS and "raw". It supports "stacks", a series of images that share a single window. It is multithreaded, so time-consuming operations such as image file reading can be performed in parallel with other operations.

It can calculate area and pixel value statistics of user-defined selections. It can measure distances and angles. It can create density histograms and line profile plots. It supports standard image processing functions such as contrast manipulation, sharpening, smoothing, edge detection and median filtering.

It does geometric transformations such as scaling, rotation and flips. Image can be zoomed up to 32:1 and down to 1:32. All analysis and processing functions are available at any magnification factor. The program supports any number of windows (images) simultaneously, limited only by available memory.

Spatial calibration is available to provide real world dimensional measurements in units such as millimeters. Density or gray scale calibration is also available.

ImageJ was designed with an open architecture that provides extensibility via Java plugins. Custom acquisition, analysis and processing plugins can be developed using ImageJ’s built in editor and Java compiler. User-written plugins make it possible to solve almost any image processing or analysis problem.

Popularity: 2% [?]

Open Source SMS Application Testing Tool for SMPP »

SMPPSim simulates an SMSC (Short Message Service Centre) which has an SMPP interface which can be used by software applications for sending and receiving SMS text messages. It is free of charge, open source and used by thousands of users all over the world.

SMPPSim is a testing utility which mimics the behaviour of an SMPP based SMSC. SMPP stands for Short Message Peer to Peer Protocol. SMSCs (Short Message Service Centres) from Logica Aldiscon support this protocol, as a means of allowing external (to the GSM network) applications to submit and receive SMS messages to / from the SMSC. Some other SMSC vendors also support SMPP.

If you are intending to implement support for SMS text messaging using the SMPP protocol in your application, you will need some way of testing your application. Ultimately of course, you should aim to use a real SMSC for testing before going live. Hopefully the network operator you are working with can supply a test SMSC for this purpose. In some cases however, two factors make SMPPSim a useful tool for the initial stages of testing:

  1. It can take months to acquire a connection to a GSM network
  2. Some network operators run stringent acceptance tests before they will allow your application to interact with the production SMSCs. It can take weeks to complete these tests, even if things go well.

So, it pays to have some independent means of doing your initial testing. Firstly so that your project is not completely dependent on acquiring a network connection in order to be able to progress, and secondly so that your code is as good as you can get it before entering the formal acceptance testing phase with the network operator.

Popularity: 2% [?]

Open Source Timesheet Management Software »

eHour is an open source web based time tracking tool for companies and organizations who need accurate information on how much time is spend on projects by their people.

eHour makes the amount of time your people spend on projects visible and available as simple and user friendly as possible.

Features

  • create multiple projects per customer, assign multiple users to the same project
  • have different start and end dates and hourly rates per user for each project assignment
  • create default projects to which all users should be assigned (days off, sick leave, etc.) so you can keep track of those hours as well
  • extensive turnover & hours reports on all customers, projects, users, departments or a selection of them
  • configurable localization and currency. eHour is available in English, Dutch, French, Italian, German (partial) and Polish (partial).
  • separation of user, reporting and administration role.
  • excel export of all your reports
  • web based user interface, no software needs to be installed on desktop machines

user_report_thumb

Popularity: 2% [?]

Java: Detect and Use System Proxy »

Here is a Java class that you use to detect and use the system proxy, or direct connection is available to the Internet.

Basically, it uses java.net.useSystemProxies property which is available starting JDK 5.

   1: package com.cdp.proxy.plugins;
   2:  
   3:  
   4: import java.net.InetSocketAddress;
   5: import java.net.Proxy;
   6: import java.net.ProxySelector;
   7: import java.net.SocketAddress;
   8: import java.util.List;
   9:  
  10: /**
  11:  * Detecting and selecting a proxy
  12:  *
  13:  */
  14: public class ProxyDetector {
  15:  
  16:     private static final String PROXY_PROPERTY = "java.net.useSystemProxies";
  17:     private final List<Proxy> proxies;
  18:     private final Proxy proxyToUse;
  19:  
  20:     /**
  21:      * No instances
  22:      */
  23:     private ProxyDetector() {
  24:         this.proxies = initProxies();
  25:         this.proxyToUse = determineProxy();
  26:     }
  27:  
  28:     /**
  29:      * ProxyDetectorHolder is loaded on the first execution of ProxyDetector.getInstance()
  30:      * or the first access to ProxyDetectorHolder.INSTANCE, not before.
  31:      */
  32:     private static class ProxyDetectorHolder {
  33:         private static final ProxyDetector INSTANCE = new ProxyDetector();
  34:     }
  35:  
  36:     /**
  37:      * @return the instance
  38:      */
  39:     public static ProxyDetector getInstance() {
  40:         return ProxyDetectorHolder.INSTANCE;
  41:     }
  42:  
  43:     /**
  44:      * Find the proxy, use the property <code>java.net.useSystemProxies</code> to force
  45:      * the usage of the system proxy. The value of this setting is restored afterwards.
  46:      *
  47:      * @return a list of found proxies
  48:      */
  49:     private List<Proxy> initProxies() {
  50:         final String valuePropertyBefore = System.getProperty(PROXY_PROPERTY);
  51:         try {
  52:             System.setProperty(PROXY_PROPERTY, "true");
  53:             return ProxySelector.getDefault().select(new java.net.URI("http://www.google.com"));
  54:         } catch (Exception e) {
  55:             // As ProxyDetector is the initial code being executed in main,
  56:             // we cannot afford any failure. This will make our entire JStock
  57:             // application crash.
  58:             // throw new RuntimeException(e);
  59:             System.out.println(e.getMessage());
  60:         } finally {
  61:             if (valuePropertyBefore != null) {
  62:                 System.setProperty(PROXY_PROPERTY, valuePropertyBefore);
  63:             }
  64:         }
  65:         return java.util.Collections.EMPTY_LIST;
  66:     }
  67:  
  68:     /**
  69:      * Is there a direct connection available? If I return <tt>true</tt> it is not
  70:      * necessary to detect a proxy address.
  71:      *
  72:      * @return <tt>true</tt> if the is a direct connection to the internet
  73:      */
  74:     public boolean directConnectionAvailable() {
  75:         for (Proxy proxy : this.proxies) {
  76:             if (Proxy.NO_PROXY.equals(proxy)) {
  77:                 return true;
  78:             }
  79:         }
  80:         return false;
  81:     }
  82:  
  83:     /**
  84:      * @return did we detect a proxy?
  85:      */
  86:     public boolean proxyDetected() {
  87:         return this.proxyToUse != null;
  88:     }
  89:  
  90:     /**
  91:      * I will determine the right proxy, there might be several proxies
  92:      * available, but some might not support the HTTP protocol.
  93:      *
  94:      * @return a proxy which can be used to access the given url, <tt>null</tt>
  95:      * if there is no proxy which supports HTTP.
  96:      */
  97:     private Proxy determineProxy() {
  98:         if (!directConnectionAvailable()) {
  99:             for (Proxy proxy : this.proxies) {
 100:                 if (proxy.type().equals(Proxy.Type.HTTP)) {
 101:                     return proxy;
 102:                 }
 103:             }
 104:         }
 105:         return null;
 106:     }
 107:  
 108:     /**
 109:      * @return a String representing the hostname of the proxy, <tt>null</tt> if there is no proxy
 110:      */
 111:     public String getHostname() {
 112:         if (this.proxyToUse != null) {
 113:             final SocketAddress socketAddress = this.proxyToUse.address();
 114:             if (socketAddress instanceof InetSocketAddress) {
 115:                 InetSocketAddress address = (InetSocketAddress) socketAddress;
 116:                 return address.getHostName();
 117:             }
 118:         }
 119:         return null;
 120:     }
 121:  
 122:     /**
 123:      * @return the port of the proxy, <tt>-1</tt> if there is no proxy
 124:      */
 125:     public int getPort() {
 126:         if (this.proxyToUse != null) {
 127:             final SocketAddress socketAddress = this.proxyToUse.address();
 128:             if (socketAddress instanceof InetSocketAddress) {
 129:                 InetSocketAddress address = (InetSocketAddress) socketAddress;
 130:                 return address.getPort();
 131:             }
 132:         }
 133:         return -1;
 134:     }
 135: }

Popularity: 2% [?]

JavaHelp System »

The JavaHelp system is an online help system that developers can use to add online help to their Java platform applications. The JavaHelp system is both a JCP specification (JSR 97) and a reference implementation of that specification. The JavaHelp system open source project includes the source to the reference implementation.

The JavaHelp system provides developers and authors with a standard, fully featured, easy to use system for presenting online information to Java application users. The JavaHelp system is a Java Platform, Standard Edition ("Java SE") optional package.

The JavaHelp system consists of a fully featured, extensible specification and API, and a reference implementation of that specification and API that is written entirely in the Java programming language. The JavaHelp system reference implementation, based on the Java Foundation Classes (JFC, also known as Swing), provides a standard interface that enables both application developers and authors to add online help to their applications.

The specification and API enable developers to customize and extend the help system to fit the style and requirements of their applications.

The JavaHelp system has been designed to work especially well in a variety of network environments. The JavaHelp system is platform independent and works in all browsers that support the Java platform.

The JavaHelp system enables Java developers to provide online help for:

  • Applications (both applet and standalone)
  • JavaBeans components
  • Applets in HTML pages
  • Server-based Java applications

Popularity: 2% [?]

Java: Socket over HTTP Tunneling »

SOHT (Socket over HTTP Tunneling) allows you to tunnel socket connections through an HTTP proxy. Restrictive firewalls often prohibit all outgoing trafic except for HTTP. This application allows you to tunnel socket connections over the HTTP protocol. This application consists of a server that serves as a proxy and a client which tunnels a socket connection over an HTTP connection to the server. The current server is written in Java, and there are clients in Java and .NET.

Popularity: 2% [?]

Open Source FreeBSD for Firewall and Router »

pfSense is a free, open source customized distribution of FreeBSD tailored for use as a firewall and router. In addition to being a powerful, flexible firewalling and routing platform, it includes a long list of related features and a package system allowing further expandability without adding bloat and potential security vulnerabilities to the base distribution. pfSense is a popular project with more than 1 million downloads since its inception, and proven in countless installations ranging from small home networks protecting a PC and an Xbox to large corporations, universities and other organizations protecting thousands of network devices.

Popularity: 2% [?]

Java Desktop Search Engine using Lucene, Lingpipe »

Mustru is a desktop search engine written in Java using Lucene, Lingpipe, and the Berkeley DB . Create an index from a set of directories on your local filesystem and use the Web based interface to query the index. Submit questions in natural language or boolean queries using keywords.

image

Popularity: 2% [?]

Java EXE Wrapper »

Launch4j

Launch4j is a cross-platform tool for wrapping Java applications distributed as jars in lightweight Windows native executables. The executable can be configured to search for a certain JRE version or use a bundled one, and it’s possible to set runtime options, like the initial/max heap size. The wrapper also provides better user experience through an application icon, a native pre-JRE splash screen, a custom process name, and a Java download page in case the appropriate JRE cannot be found.

Features

  • Launch4j wraps jars in Windows native executables and allows to run them like a regular Windows program. It’s possible to wrap applications on Windows, Linux, Mac OS X and Solaris!
  • Also creates launchers for jars and class files without wrapping.
  • Supports executable jars and dynamic classpath resolution using environment variables and wildcards.
  • Doesn’t extract the jar from the executable.
  • Custom application icon with multiple resolutions and color depths.
  • Native pre-JRE splash screen in BMP format shown until the Java application starts.
  • Process name as the executable filename to easily identify your application, initial priority and single aplication instance features.
  • Works with a bundled JRE or searches for newest Sun or IBM JRE / JDK in given version range.
  • Opens Java download page if an appropriate Java version cannot be found or a support website in case of an error.
  • Supports GUI and console apps.
  • Supports Vista manifests and XP visual style manifests.
  • Passes command line arguments, also supports constant arguments.
  • Allows to set the initial/max heap size also dynamically in percent of free memory.
  • JVM options: set system properties, tweak the garbage collection…
  • Runtime JVM options from an .l4j.ini file.
  • Runtime command line switches to change the compiled options.
  • Access to environment variables, the registry and executable file path through system properties.
  • Set environment variables.
  • Option to change current directory to the executable location.
  • The JRE’s bin directory is appended to the Path environment variable.
  • Custom version information shown by Windows Explorer.
  • GUI and command line interface.
  • Build integration through an Ant task and a Maven Plugin.
  • Lightweight: 26 KB!
  • It’s free and may be used for commercial purposes.
  • Includes a sample application and Ant script that automates the build process from Java sources to native executable.
  • The wrapped program works on all Windows platforms (98/Me/NT/2K/XP/Vista), Launch4j works on NT/2K/XP/Vista, Linux, Mac OS X (build on 10.4) and Sparc Solaris 8-10.

JSmooth

JSmooth is a Java Executable Wrapper. It creates native Windows launchers (standard .exe) for your java applications. It makes java deployment much smoother and user-friendly, as it is able to find any installed Java VM by itself.

When no VM is available, the wrapper can automatically download and install a suitable JVM, or simply display a message or redirect the user to a web site.

JSmooth provides a variety of wrappers for your java application, each of them having their own behaviour.

GCJ

GCJ is a portable, optimizing, ahead-of-time compiler for the Java Programming Language. It can compile Java source code to Java bytecode (class files) or directly to native machine code, and Java bytecode to native machine code.

Compiled applications are linked with the GCJ runtime, libgcj, which provides the core class libraries, a garbage collector, and a bytecode interpreter. libgcj can dynamically load and interpret class files, resulting in mixed compiled/interpreted applications. It has been merged with GNU Classpath and supports most of the 1.4 libraries plus some 1.5 additions.

GCJ can also be configured as a cross-compiler, suitable for embedded systems programming.

Popularity: 2% [?]

MessagingToolkit – SMS Library Community Edition »

I just released the community edition of MessagingToolkit

messagingtoolkit is a .NET C# messaging library that can be used to send and receive messages using any ETSI 07.05 compliant GSM modem or phone handset connected to the PC serial port through serial cable, infrared or bluetooth.

Some of the features of the library

  • Send SMS
  • Read incoming SMS
  • Send WAP Push message
  • Send vCalendar, vCard
  • Send Flash SMS
  • Send OTA bitmap, ringtone, custom Smart SMS
  • Send and receive 7 bit ANSI, 8 bit-ANSI, or 16-bit Unicode messages
  • Read and set various information on the phones. E.g. SMSC, battery level, network parameters
  • Read and delete messages from the phones
  • Dial, answer and hang up call
  • Detect incoming call
  • Built-in multiple gateways suport, which means you can use more than 1 GSM modems at one time, and the messages are routed and load balanced among all the gateways
  • Basic routing and load balancing (round robin) are built-in, and you can define your own routing and load balancing rules by overriding the default class
  • Ability to define group of destination numbers so that messages can be sent in bulk easily
  • Ability to detect gateway disconnection and route message to active gateway

Popularity: 3% [?]

Build SMS Gateway with Open Source Software »

Kannel which is an open source SMS and WAP gateway is something that you must look at.

If you want to support MMS, Mbuni provides an MMS module for Kannel.

SMSLib is a Java library which allows you to send/receive SMS messages via a compatible GSM modem or GSM phone. SMSLib also supports some bulk sms operators (for outbound messaging only). It is open source under Apache License.

playSMS is a flexible Web-based Mobile Portal System that it can be made to fit to various services such as an SMS gateway, personal messaging systems, corporate and group communication tools

It supports

Gnokii (http://www.gnokii.org/) is another open source solution written in C which is initially for Nokia phones.

There is also a free but not open source library from http://www.scampers.org/steve/sms/ which is also written in C#.

You can also use Microsoft SMS Sender (http://www.microsoft.com/globaldev/outreach/dnloads/smsSender.mspx) to send SMS.

Popularity: 5% [?]

Open Source Mobile Ad Server »

Adhere Mobile Advertising Platform is a suite of software products that serve the needs of the mobile advertising community. At the core of the platform is the free open-source Adhere Ad Server. The platform also includes the Adhere User Profiles Server which is key to Adhere’s ad targeting capabilities. Finally, the platform includes sample applications and engines to manipulate the various mobile media and to utilize them effectively as advertising channels.

The current release of Adhere includes sample SMS advertising applications (a Weather Forecast Service and a Currency Exchange Rates Service). The next release will introduce an SMS Tagging and Forwarding Engine (STAFe) and a Mobile Web Ad Serving and Tracking Engine (WASATe). Further releases will add support for other mobile advertising channels including MMS, audio, and video content.

Popularity: 3% [?]