Modularization for App Development


In programming, modularization is the practice of dividing functionality into separate, independent modules. Modularization in app development is an efficient way of organizing app components and enabling collaboration within development teams. A modular approach also helps make testing, debugging, and maintenance of the app easier and more straightforward.

MobileTogether offers some classic – and some unique – approaches to modularization.

App developer typing on a keyboard
Read more…
Tags: , , ,

Configuring MobileTogether Server to Work With Your Network


Configuring MobileTogether Server to work properly on your network will require some changes to be made. MobileTogether Server is designed to sit within your network’s DMZ, and enabling it to accept connections from clients both inside and outside your network will require your network administrator to open a collection of ports.

This video tutorial will walk you through the ports required to make MobileTogether function. It provides you with a baseline setup that will work inside most corporate networks. Please note, however, that every network is different and some configuration changes may be required. To support this, every port MobileTogether Server uses can be customized; all the ports listed in this tutorial are default and can be changed.

The image below outlines the network ports required by Altova LicenseServer to properly validate files.

Clients will need to be able to connect both internally and externally. We recommend using the default MobileTogether ports, and remapping them to 80 and 443 at each of your firewalls. This is discussed in greater detail in the video.


Finally, a set of ports will need to be opened for administrator purposes. These ports should be limited to your internal network only.

Using a Reverse Proxy Server

When setting up a MobileTogether Server for a public-facing app that will be accessed via URL in a web browser (in addition to from MobileTogether client apps), it may be helpful to hide the precise URL that is being used on the server to start the solution.

Solution URLs follow this convention: https://server.name/run?d=/public/SolutionName. You can customize the URL to hide the “run?d…” portion by deploying a reverse proxy server in front of the MobileTogether Server.

Tags: , , , ,

Mobile App Themes Improve User Satisfaction


Mobile app themes improve user satisfaction by letting each user customize the app appearance with personal preferences. One way to implement multiple themes in apps that report and visualize data is to offer users a choice of color palettes for charts and graphs. MobileTogether uses a combination of drag-and-drop UI design, the powerful Action Tree visual programming language for event handling, and standardized functional programming for data selection and processing. Developers use MobileTogether every day to create elegant cross-platform apps with rich charts and graphs in all popular formats.

The main chart configuration settings let mobile app developers choose any of four built-in color palettes or even define a custom color palette for charts and graphs as they design an app. Combined with dark mode and light mode display settings, that creates ten colorful possibilities for display customization. Rather than impose a design-time color choice, developers can leverage MobileTogether features to let users choose for themselves. Let’s look at an example.

Read more…
Tags: , , ,

Maintaining Low Code Apps


Low code software tools can speed mobile application development by freeing developers from routine coding tasks and encouraging focus on high level app requirements. However, some developers, project managers, and even entire enterprises remain wary of low code tools. These stakeholders are afraid testing and maintaining low-code apps will be more difficult and costly over time.

But not all low code or RMAD (Rapid Mobile App Development) tools are alike. A low code tool that is simply a user interface to a code generator and builds apps from a set of templates could be attractive to an inexperienced developer. When an issue arises, a highly skilled programmer might need to diagnose and modify the generated code for each mobile OS to create a solution.

MobileTogether is a cross-platform RMAD tool that works differently. MobileTogether uses a combination of drag-and-drop UI design, a powerful Action Tree visual language for event handling, and standardized functional programming for data selection and processing. MobileTogether includes a built-in Simulator window to instantly execute the app to test logic, view the UI as it will appear on a variety of iOS, Android, Windows, and other devices, and examine changes in workflow data during execution. MobileTogether also includes sophisticated automated testing features and a built-in debugger to test and debug apps with precision and examine app behavior directly in the design environment.

Let’s look at how some real-world app maintenance requirements are simplified in MobileTogether.

Read more…
Tags: , ,

Mobile App Development: Follow Up on a User Story


My friend Casey used the Solar Tool mobile app created with Altova MobileTogether to track rooftop solar production for a full year now and reports some surprising results. We first wrote about Casey’s user story in the spring, when she anticipated higher solar power production as hours of sunlight increased. Casey expected the billing cycle that included June 21, the summer solstice, to be her best generation month. Her actual results were very different and worth investigating.

Read more…
Tags: , , ,

MobileTogether Adds In-App Purchasing


The latest release of MobileTogether introduces new tools for monetizing your apps and integrating them in new ways – making the platform even more flexible and useful for developers in firms of all types and sizes.

If you haven’t tried the MobileTogether framework for rapidly building enterprise apps and native apps for iOS, Android, Windows, and more, now is the time. Learn about all the new features below and try MobileTogether Designer for free.

Announcing new features in MobileTogether
Read more…
Tags: , , ,

Mobile App Development: A User Story


Ahh spring! Birds singing, flowers blooming, and the sun rises earlier and sets later. All that extra daylight gives solar power generation systems more hours to make electricity. As the summer solstice approaches, solar generation systems enter their most productive time of year.

Owners of rooftop solar systems can be passionate about tracking their productivity. The actor and comedian John Hodgman even moderated a disagreement over obsessive monitoring of solar production. My friend Kasey is also enthusiastic about solar power. Whenever I see Kasey, she reports her latest kilowatt-hours stats. Kasey’s home is in a warm, sunny climate where air conditioning is her biggest electricity demand. She installed solar panels on the roof of her house at the end of last June and her system raced to generate enough power during long summer days to offset her air conditioning.

After receiving the electric bill for August, Kasey called her solar installer to report success – her home’s electricity consumption for the month was zero. “I have to confess, I read my meters every single day to see how the system is doing,” Kasey told the installer.

“Everybody does it,” the installer replied. “Some users even tell me they check the meters three times a day!”

Kasey asked me if a mobile phone application built with MobileTogether might make a good reporting tool for her solar power system. “I could enter the meter readings into my phone,” she said. “I can do it every day when I take the dog out before breakfast.”

That’s how our mobile app development collaboration began. The result is the MobileTogether app we call Solar Power Tool.

Read more…
Tags: , , ,

Developing and Debugging User Functions in Mobile Apps


Recently I came across this note in a senior developer’s code review of a colleague’s work: “Slightly revised the user function to work correctly when languages other than English are used.” This was a surprising comment–the code is the code and it shouldn’t make a difference what language the developer or the end user speaks! A user function is simply an expression that may accept input parameters and returns a result.

Altova MobileTogether supports user functions in a cross-platform mobile development framework that combines drag-and-drop UI design and standardized functional programming for data selection and processing. Several MobileTogether demo applications are highly dependent on user functions and the MobileTogether Designer includes features that greatly assist creating and validating user functions.

Let’s take a look at user functions in mobile apps by examining one of these demo apps.

Read more…
Tags: , , ,

Create Mobile Apps that Automatically Support Dark Theme


Android and Apple mobile devices support a display option called Dark Theme, which you can think of as  almost a negative image of the normal screen display. In Dark Theme white is black, black is white, and color intensity in general is adjusted. Dark Theme reduces power requirements, which can extend runtime for a battery charge, and can be easier to view in low light.

Altova MobileTogether includes features to let developers create mobile apps that automatically support Dark Theme by detecting the user setting when the app is launched.

Let’s look at an example:

Read more…
Tags: , , ,

New Features for Refining Your App UI


The latest release of Altova’s rapid application development (RAD) framework introduces several new features that make it easier to customize and refine the UI of your app, with new features for styling controls, flexible options for users, and new logging tools.

Let’s take a look at what’s new in MobileTogether 7.2.

New in MobileTogether
Read more…
Tags: , , , , ,

Mobile App Debugging


MobileTogether is a tool for building highly complex, elegant, cross-platform solutions. Developers need mobile app debugging tools to troubleshoot during development and understand app behavior. The MobileTogether Designer offers full-featured debugging of app execution flow inside action trees and debugging of XPath/XQuery functions. These features are provided in two mobile app debugging views integrated into a single tool.

The Actions Debugger view allows developers to debug the Actions of a Control event or a Page event. This view is available when an Action that has been selected for debugging is encountered during processing. The XPath Debugger view opens the XPath/XQuery evaluator window for in-depth tracing and debugging of expressions.

Developers can set breakpoints at various locations and the app, then execute one step at a time, pausing in either view to allow examination of the complete execution environment.

Let’s see mobile app debugging in action:

Read more…
Tags: , , ,

Design Templates for Mobile Apps


In an earlier post we wrote about using software design templates for mobile apps to facilitate design reuse and make it easy to build efficient, flexible options for various app requirements. We described an example of a Control Template designed to present multiple levels of hierarchical data based on user selection at runtime.

Our example was built using MobileTogether, Altova’s RMAD (Rapid Mobile App Development) tool to help developers build cross-platform apps that deliver dynamic, sophisticated app performance that delights end users.

You can also build Control Templates for cross-platform mobile apps by combining multiple controls into a larger unit, like a complex sub-assembly built from individual parts. This creates design templates for mobile apps that can easily be dropped in anywhere, speeding development and ensuring consistency.

Read more…
Tags: , , ,

MobileTogether Adds a Full-Featured Debugger


MobileTogether is an easy to use, low-code app development framework that allows you to create sophisticated apps for all platforms from a single app design. Because MobileTogether is capable of building highly complex, elegant solutions, developers need the ability to troubleshoot during development to understand and debug app behavior.

In its latest release MobileTogether introduces a brand new, enterprise-grade debugger alongside other new features for defining controls, actions, and UI refinements.

New for low code app development
Read more…
Tags: , , ,

Programming Techniques for Mobile Development


MobileTogether is an easy to use, low-code app development framework that lets you create sophisticated apps for all platforms from a single design.

Low-code doesn’t mean no code. A database specialist might start with a few SQL queries and use the MobileTogether drag and drop interface to create an app with elegant tables and graphs to report up-to-the-minute enterprise data, while experienced developers often use familiar programming techniques in mobile development to build highly complex, elegant MobileTogether solutions.

Developers define user functions, parameters, variables, loops, or a complex data structure when that’s the right tool for the job. MobileTogether makes it fast and easy to control all the features in the device – camera, microphone, GPS, SMS, handwriting capture, and more. MobileTogether helps you achieve your vision fast and build really cool mobile apps with charisma enough to go viral.

MobileTogether is about getting the work done efficiently, not limiting how you do it. Let’s check out a couple examples of programming techniques in MobileTogether apps.

Read more…
Tags: , , ,

Build Custom Maps in Mobile Apps


In an earlier post we described how to integrate maps into cross-platform mobile apps with each end-user device’s native map application. Our example app generated a map with pins locating major airports in the United States. Illustrations showed maps generated by the same app on an Android phone, an iPhone, and Windows desktop.

What if a list of locations to be mapped is not known in advance, but generated based on user activity at run-time? MobileTogether, the low-code cross-platform mobile development tool from Altova, also empowers developers to build custom maps in mobile apps on the fly based on a list of geolocations generated at run time.

Read more…
Tags: , , , ,

Integrate Maps into Mobile Apps


Developers can create highly-customized location-based apps by leveraging geolocation functionality in mobile devices. Now MobileTogether, the cross-platform, low-code mobile development tool from Altova, supports deep integration of maps into applications for all popular mobile platforms.

Developers can integrate maps into mobile apps, add dedicated markers, and define custom actions based on user clicks on the map. For instance, an enterprise might want an app to include a map of all branch office locations, then display the current inventory when an office is clicked.

In a previous post we described a mobile app designed to let users check the status of major US airports by selecting an airport code from a combo box. An alternate technique would be to replace the 47 combo-box entries with pins on a map.

Let’s look at this example.

Read more…
Tags: , , , ,

Web Service Error Handling in Mobile Apps


Mobile phones bring a world of information to our fingertips, but functionality of even the best-designed mobile apps can be impacted by Web service errors that occur when communicating with external servers. Intermittent cell phone service in remote locations can also degrade app performance when looking up data.

MobileTogether, the low-code, cross-platform mobile app development tool from Altova, includes features that let developers gracefully handle Web service errors in mobile apps to avoid burdening end-users with unexpected app interruptions or cryptic error messages.

In an earlier post we explained HTTP error handling in a MapForce data mapping. Now we’ll look at the same Web service in a mobile app and describe error handling in MobileTogether.

Read more…
Tags: , ,

Automatic Link Detection for Mobile Apps


Integration between a mobile app and the vast information resources of world wide web makes the user experience more convenient and responsive, especially when targeted web content may be frequently updated.

The latest release of MobileTogether, Altova’s low-code, cross-platform mobile development framework, includes support for automatic link detection of URLs and email addresses in labels. Clicking or tapping the link opens the targeted website page in a browser window or as a new draft message in the device’s email app in a new window without quitting the mobile app. No further special coding required by the developer.

User interacting with app

Let’s see how it works.

Read more…
Tags: , , , ,

Enabling Let’s Encrypt in MobileTogether


MobileTogether Server, the backend hub for apps built in MobileTogether Designer, now supports the ability obtain SSL certificates using Let’s Encrypt. Let’s Encrypt is a free service aimed at encrypting all HTTP traffic on the web. This feature is supported in MobileTogether Server starting with version 5.1 and adds to the ability to upload your own certificate.


The video tutorial above walks you through configuring MobileTogether Server to utilize SSL encryption when communicating with MobileTogether clients. It covers the use of both Let’s Encrypt and certificates generated using a trusted certificate authority.

SSL certificates generated using a trusted certificate authority can be uploaded directly to MobileTogether Server. This configuration can provide several advantages to system administrators. These types of certificates are typically good for a much longer period of time, requiring fewer maintenance windows. In addition, you can keep your MobileTogether Server completely isolated from the outside world as this method does not require any external ports to be opened. The process to obtain these certificates can be much more complex and expensive. Verification typically requires you to provide information to the issuer and wait for a response which can delay your implementation.

Let’s Encrypt integration was added in MobileTogether 5.1. Let’s Encrypt is a certificate authority whose goal is to provide encryption to the entire Internet. Certificates generated are free of charge. Unlike other methods of generation, though, Let’s Encrypt certificates are only good for 90 days. MobileTogether Server is capable of automatically renewing these certificates every 60 days, but requires a scheduled server reboot each time this action occurs. Lastly, Let’s Encrypt requires your server to be accessible from the outside world; they will need to communicate with MobileTogether Server on port 80 to verify your server’s identity.

The ability to encrypt communication between client and server is becoming ubiquitous. MobileTogether allows you to easily secure all communication to your mobile clients using SSL encryption and new support for Let’s Encrypt greatly reduces the set up complexity.

Tags: , , , ,

Simplified Security Options & More in MobileTogether 5.1


The latest release of MobileTogether, Altova’s low-code, cross platform mobile app development framework, offers a simplified method for requesting and implementing SSL certificates by utilizing Let’s Encrypt integration. Now, developers can secure communications between the backend server and user devices quickly, seamlessly, and for free.

Other updates include support for the latest versions of Android and multiple new options for flexible app development. Let’s take a look.

What's new in MobileTogether, Altova's low-code app development framework
Read more…
Tags: , , ,

How Low-Code Can Solve the Developer Shortage


The shortage of software developers in recent years is hardly news – and it’s not getting any better. A recent study arrived at a stunning revelation: software developers are now more valuable to companies than money.

Let’s take a look at some of the factors contributing to the problem – as well as how the emergence of low code tools is helping to solve it in a few surprising ways.

Read more…
Tags: , , , ,

Configuring MobileTogether Server & LicenseServer


Part of the Altova MobileTogether framework, MobileTogetherServer is the back-end hub that powers your native apps for Android, iOS, Windows, and the web.  The server provides high performance data processing, comprehensive caching, instant deployment of apps, and more.

Every developer looking to install MobileTogether Server will also need to obtain a copy of Altova LicenseServer. LicenseServer is a free product that simplifies license management for all Altova products, including MobileTogether Server. Licenses are managed via an easy-to-use web-based administrator console.

The video tutorial below will walk developers through the steps needed to install both MobileTogether Server and LicenseServer. It covers obtaining and running the installer followed by a basic configuration that will have you deploying enterprise apps in under an hour. This video is the first part in a short series that will eventually discuss SSL Certificate deployment, network configuration, and deploying apps to each of the app stores.

If you’re new to MobileTogether and would like to learn more about developing mobile apps, please head over to the MobileTogether Demos page where we have a collection of video tutorials.

Tags: , , , ,

Design and Refine your Apps with MobileTogether 5.0


In its latest release, the MobileTogether app development framework adds several new features for building native mobile apps and enterprise solutions, including a totally rewritten web client, numerous new UI design options, powerful new Actions and functions, and much more.

Whether it’s refining the look and feel of your app’s UI or designing sophisticated app behavior, MobileTogether 5.0 adds numerous tools that make it easy.

Let’s take a look.

New in MobileTogether 5.0

Read more…

Tags: , , , ,

Implementing Basic Filtering in Your App


There are numerous ways to implement searching and filtering within mobile apps.  MobileTogether Designer allows developers to perform filtering on either your mobile app or on the server via a SQL query.  Knowledge of each of these methods, along with the use cases for them, is an essential tool every mobile developer should possess.

This video tutorial continues to build out the books database project that has been constructed in previous tutorials.  It will cover the steps needed to implement basic filtering in your mobile app.  Additionally, it also introduces developers to the usage of user defined XQuery functions which provide a method to centralize application logic.

 

 

If you’re new to MobileTogether Designer, please take a moment to view the MobileTogether Demos page where we have provided links to additional video tutorials and demo apps.

Tags: , , , ,

Images, Icons, and Tool Buttons in Mobile Apps


We have written previously about Integrating APIs and Mobile Apps to create a rich and entertaining user experience. Since publishing our previous post, we continued to enhance the GPS demo app with additional API support to get current weather conditions and scheduled events nearby.

One challenge with offering all this functionality on a small mobile screen is to provide users with a clear, consistent, and easy to use navigation scheme across all views in the app.

Applying icon images as tool buttons in mobile apps can create a stylish and graceful navigation menu, especially if the icons are chosen based on recognizable and commonly-agreed conventions. For instance, an arrow pointing left often indicates go back, and a floppy disk icon frequently represents save data, even when the ultimate destination might not be a new file nor a disk.

In this post we will describe how to use image icons to build cross-platform navigation menus with tool buttons in mobile apps using MobileTogether.

Read more…

Tags: , , ,

Integrating APIs and Mobile Apps


Busy mobile users on the go prefer apps that are convenient and efficient. MobileTogether provides developers with features to seamlessly integrate APIs and mobile apps to combine mobile device functionality with up-to-date information from external sources. This empowers developers to create custom cross-platform native apps that provide a rich and entertaining end-user experience.

Public APIs are a great source of external data to enhance almost any custom mobile app. Developers can combine information from multiple APIs to provide users with better information, faster, in an elegant, integrated package.

APIs are available for almost any kind of information your mobile app may need, from flight tracking to commodity or stock prices to tropical storm tracking.

In this post we’ll look at a GPS app that starts with mobile device geolocation functionality to answer the basic question, “Where am I?” then interfaces with APIs from Google and MapQuest to add a wealth of additional information. We’ll integrate a spatially-aware search engine to locate nearby points of interest as near as a quarter mile radius, all the way to pin-pointing the user’s location in a satellite photograph with a wide-angle view of an entire continent or more.

Read more…

Tags: , ,

Early Software Testing Validates Design


“Test early and often,” is a strategy from agile software engineering that has evolved to become a mandate for software developers in every field. Early software testing is especially important for developers working on cross-platform apps, who must support mobile devices with varying physical characteristics and operating system functionalities.

MobileTogether includes features to incorporate early software testing into the development process without time-consuming compile, deploy, and debug cycles for each mobile platform. The Altova Web site describes the MobileTogether Simulator early software testing feature, and we have blogged about the ability to record and re-run specific sets of actions in test cases.

This post describes Trial Run on Client. It’s built into the MobileTogether Designer to let developers instantly examine app designs and validate logic and functionality across any supported mobile device or platform – Android, iOS, and Windows Desktop or Windows Phone.

Read more…

Tags: , , ,

Steps and Tips to Migrate a Windows MobileTogether Server to Linux


The MobileTogether app development framework includes MobileTogether Server, the back-end hub that powers your mobile and desktop apps.  Available for Windows, Linux, and Mac OS, MobileTogether Server acts as a gateway between end-users and back-end data sources such as databases.

Migrating an existing Windows MobileTogether Server to an Ubuntu box is easy when no database connections are required.  But, if you have database connections, MobileTogether Designer can do all the heavy lifting for you.

As an IT administrator who works with physical and virtual hardware as well as desktop and server software, it has made life easier to create many scripts to help manage repetitive tasks.  Though I’m more of a ‘citizen developer’ with no formal developer training, using MobileTogether Designer to migrate a server with database connections was fast and easy.   Below is a look at how I was able to save my company the cost of a Windows server license by moving solutions to an Ubuntu platform.

computer room

Read more…

Tags: , , ,

Mobile App Calendar Integration with MobileTogether


MobileTogether gives developers holistic access to the rich feature sets of mobile devices for cross-platform deployment of native apps for Android, iOS (iPhone, iPad), Windows 8 & 10, Windows Phone 10, and HTML5  browsers for other users. MobileTogether apps created from a single design can seamlessly access mobile device camera, messaging, GPS, audio, email features, and even feature mobile app calendar integration.

Since MobileTogether uses a combination of visual drag-and-drop UI design and easy-to-understand functional programming for data selection, it’s easy for any programmer or web developer to build highly sophisticated apps to read and write calendar events for all platforms. For instance, a mobile scheduling app for a large, distributed user base could help everyone easily sync their calendars.

e-reader

Read more…

Tags: , ,

Efficient MobileTogether Services on Backend Servers for Mobile Apps


MobileTogether Server Advanced Edition services on backend servers for mobile apps execute independently of any app running on a mobile device, based on a variety of triggers. MobileTogether services can provide background functionality to mobile apps or perform automated standalone actions without requiring any end user to interact with a mobile app. For instance, a MobileTogether service could generate a report and email it to the server administrator at a specified time. Or, a service could query a database based on some external criteria and perform an action such as sending a notification or an email.

A MobileTogether Server service is a set of MobileTogether Designer actions deployed to the server as a specialized solution file.

Read more…

Tags: , , ,

How to Make a Pop-up Window in an App


During mobile app development there’s often a quick action the developer wishes to let the user to complete or a message that can be delivered on top of the current app view – otherwise known as a pop-up window. These are useful for letting the end user complete a process or view a message payload without interrupting his or her progress in the app.

MobileTogether makes it easy to configure pop-up windows of any size. Let’s take a look at how it works.

User interacting with app

Read more…

Tags: , ,

Mark Your Calendar for this MobileTogether Release


The newest version of Altova’s cross-platform framework for mobile app development includes comprehensive calendar integration for building apps with scheduling functionality. You’ll also find support for building and triggering services, easy to configure pop-up windows, and much more.

Whether you’re building enterprise apps or native apps for the major platforms, this release has the tools you need to add even more great functionality — without increasing development time.

Let’s take a look at what’s new.

Read more…

Tags: , , , , ,

How To Build Your First App


MobileTogether Designer provides a powerful drag and drop interface that allows for incredibly quick cross platform app development. To help developers get started I have produced this video tutorial, which covers the interface and the steps needed to build your first app.

By the end of the video developers should be able to navigate the Designer’s interface and create a basic app that takes user input and performs an action with it at the press of a button. This is the first in a series of tutorials aimed at familiarizing developers with the ins and outs of app development in MobileTogether.

 

Tags: , , , ,

Push Notifications Headline Latest MobileTogether Release


The latest release of MobileTogether, Altova’s framework for cross platform mobile app development, adds easy-to-use tools for defining push notifications, the ability to embed apps inside web applications, and more.

Let’s take a look at these new features, which only add to the long list of functionality available for building today’s sophisticated, data-centric mobile apps.

MobileTogether 4.0 Adds Push Notifications

Read more…

Tags: , , , , ,

Text-to-Speech for Mobile Apps


Altova MobileTogether supports text-to-speech functionality for cross-platform mobile apps, empowering developers to add speech and build a rich multi-media user experience.

Speech can be fully integrated with text anywhere it appears in an app. For instance, an app like the Parcel Delivery MobileTogether example can be enhanced by speaking the next delivery address aloud – especially if the driver is in traffic! Or, text in message boxes of other information blocks can also be spoken by the mobile device.

We created a simple demo to experiment with the functionality of text-to-speech for mobile apps then added text-to-speech features to the Parcel Delivery app.

Text-to-speech for mobile apps

Read more…

Tags: , ,

Show Off Your Collections with MyCollections 2


The MyCollections app from Altova has become a popular tool for Android, iPhone, iPad, and Windows users to catalog and keep track of their collections of books, watches, recipes, vacation destinations – you name it.

It’s easy to share portions of or entire collections with your friends who have the MyCollections app, and now you can even publish your carefully curated creations to the web – and then share them via email or on your social media accounts.

Publishing collections is just one of the new features in MyCollections 2 – let’s check out the full list of improvements.

MyCollections App

Read more…

Tags: , , , ,