Category Archives: Computer Technology

ASUS PQ321Q UltraHD Monitor Review: Living with a 31.5-inch 4K Desktop Display

Many consider me to be a 4K hater. The past few trade shows I’ve attended have been pushing it on consumers to replace their TVs, but I see less value in it. When it comes to a computer display, it is a different game. Unlike a 50” TV, we sit close to our monitors, even if they are 30” in size. We also have no worries about a lack of native content, since everything is rendered on the fly and native. There are no issues with the lack of HDMI 2.0, as DisplayPort 1.2 can drive a 3840×2160 screen at 60 Hz.

When it comes to 4K on the desktop, my main question is: how much difference will I see? ASUS is one of the first with a HiDPI display in the PQ321Q. While not truly 4K, it is a 3840×2160 LCD display that can accept an Ultra High Definition (UHD) signal over HDMI and DisplayPort. It also clocks in at a wallet-stretching $3,500 right now. The question is, are we seeing the future with displays here, or are we seeing a niche product?

What does 4K/UHD/HiDPI bring to the desktop? We’ve seen it for a few years now in smartphones and tablets, making their smaller screens more usable for reading and general work. My initial thought is more desktop space, as that is what it has meant before. With a 32” monitor and a pixel density this high, running it without any DPI scaling leads to a desktop where reading text is a huge pain. Instead I believe most users will opt for DPI scaling so elements are larger and easier to read. Now you have something similar to the Retina screen on the iPhone: No more desktop space compared to a 2560×1440 monitor, but one that is razor sharp and easier to look at.

To get to this pixel density, ASUS has relied upon a panel from Sharp that uses IGZO technology. IGZO (Indium gallium zinc oxide) is a material that replaces amorphous silicon for the active layer of an LCD screen. The main benefit is higher electron mobility that allows for faster reacting, smaller pixels. We have seen non-IGZO panels in smartphones with higher pixel densities, but we don’t have any other current desktop LCDs that offer a higher pixel density than this ASUS display. IGZO also allows for a wide viewing angle.

Four Techniques Local Businesses Should Use for Search Engine Optimization with WordPress

Hands down, a WordPress website is one of the best investments that can be made in a local company’s online lead generation efforts. Admittedly, it can also be one of the biggest investments. My Local Leads, a Maine based marketing firm, works on design and development as well as continued maintenance of affordable WordPress websites for local businesses across the US. There are undoubtedly some decisions that go into the initial planning and development stages that can greatly impact marketing effectiveness of the site. Then, there are things that require continued and near constant observation and work. These few techniques are important to helping make a WordPress website part of a successful local search marketing campaign.

Choosing the right domain name can be pivotal in helping increase a websites reach, especially in the early stages. It was popular to stuff a domain with keywords, but recent search engine algorithm updates have lessened the value of such a practice. Branding is important for the domain name. It needs to be simple enough for people to remember. If a keyword fits naturally, sure it can and should be added. If it ends up making it too weird, too long, or too hard to remember, it is most likely not worth it.

It is also important to remember to turn on WordPress’s built in SEO tools when putting up a site for a local business. There is a setting under privacy of a WordPress site that will automatically hide the site from search engines, and this certainly is not what anyone attempting to build a site for search engine optimization wants to have set. At the same time, the WordPress website should have the permalinks set to be friendly URLs, which will help with the site ranking.

There are important add-ons that any WordPress website should have including sitemap and SEO tools. The meta titles and descriptions can be easily added with warnings and suggestions through using a tool like Yoast. The sitemap is a factor in overall page ranking and can be done automatically through a plugin whenever new pages or posts are added.

Another factor that business owners will want to keep an eye on with their WordPress site is the actual functionality. The site should load quickly, have no dead links, and have clean code. Ugly and broken code can harm the rankings as well as user experience. Slow sites or sites that go down frequently can also be detrimental to both customer experience and search engine rankings.

Integrating C++ with QML

Introduction

Qt Quick’s QML language makes it easy to do many things, especially fancy animated user interfaces. However, some things either can’t be done or are not suitable for implementing in QML, such as:

  1. Getting access to functionality outside of the QML/JavaScript environment.
  2. Implementing performance critical functions where native code is desired for efficiency.
  3. Large and/or complex non-declarative code that would be tedious to implement in JavaScript.

As we’ll see, Qt makes it quite easy to expose C++ code to QML. In this blog post I will show an example of doing this with a small but functional application.

The example is written for Qt 5 and uses the Qt Quick Components so you will need at least Qt version 5.1.0 to run it.

Overview

To expose a C++ type having properties, methods, signals, and/or slots to the QML environment, the basic steps are:

  1. Define a new class derived from QObject.
  2. Put the Q_OBJECT macro in the class declaration to support signals and slots and other services of the Qt meta-object system.
  3. Declare any properties using the Q_PROPERTY macro.
  4. Call qmlRegisterType() in your C++ main program to register the type with the Qt Quick engine.

For all the details I refer you to the Qt documentation section Exposing Attributes of C++ Types to QML and the Writing QML Extensions with C++ tutorial.

Ssh Key Generator

For our code example, we want a small application that will generate ssh public/private key pairs using a GUI. It will present the user with controls for the appropriate options and then run the program ssh-keygen to generate the key pair.

I implemented the user interface using the new Qt Quick Controls since it was intended as a desktop application with a desktop look and feel. I initially developed the UX entirely by running the qmlscene program directly on the QML source.

The UI prompts the user for the key type, the file name of the private key to generate and an optional pass phrase, which needs to be confirmed.

The C++ Class

Now that have the UI, we will want to implement the back end functionality. You can’t invoke an external program directly from QML so we have to write it in C++ (which is the whole point of this example application).

First, we define a class that encapsulates the key generation functionality. It will be exposed as a new class KeyGenerator in QML. This is done in the header file KeyGenerator.h below.

#ifndef KEYGENERATOR_H
#define KEYGENERATOR_H

#include <QObject>
#include <QString>
#include <QStringList>

// Simple QML object to generate SSH key pairs by calling ssh-keygen.

class KeyGenerator : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString type READ type WRITE setType NOTIFY typeChanged)
    Q_PROPERTY(QStringList types READ types NOTIFY typesChanged)
    Q_PROPERTY(QString filename READ filename WRITE setFilename NOTIFY filenameChanged)
    Q_PROPERTY(QString passphrase READ filename WRITE setPassphrase NOTIFY passphraseChanged)

public:
    KeyGenerator();
    ~KeyGenerator();

    QString type();
    void setType(const QString &t);

    QStringList types();

    QString filename();
    void setFilename(const QString &f);

    QString passphrase();
    void setPassphrase(const QString &p);

public slots:
    void generateKey();

signals:
    void typeChanged();
    void typesChanged();
    void filenameChanged();
    void passphraseChanged();
    void keyGenerated(bool success);

private:
    QString _type;
    QString _filename;
    QString _passphrase;
    QStringList _types;
};
#endif

Next, we need to derive our class from QObject. We declare any properties that we want and the associated methods. Notify methods become signals. In our case, we want to have properties for the selected key type, the list of all valid ssh key types, file name and pass phrase. I arbitrarily made the key type a string. It could have been an enumerated type but it would have made the example more complicated.

Incidentally, a new feature of the Q_PROPERTY macro in Qt 5.1.0 is the MEMBER argument. It allows specifying a class member variable that will be bound to a property without the need to implement the setter or getter functions. That feature was not used here.

We declare methods for the setters and getters and for signals. We also declare one slot called generateKey(). These will all be available to QML. If we wanted to export a regular method to QML, we could mark it with Q_INVOCABLE. In this case I decided to make generateKey() a slot since it might be useful in the future but it could have just as easily been an invocable method.

Finally, we declare any private member variables we will need.

C++ Implementation

Now let’s look at the implementation in KeyGenerator.cpp. Here is the source code:

#include <QFile>
#include <QProcess>
#include "KeyGenerator.h"

KeyGenerator::KeyGenerator()
    : _type("rsa"), _types{"dsa", "ecdsa", "rsa", "rsa1"}
{
}

KeyGenerator::~KeyGenerator()
{
}

QString KeyGenerator::type()
{
    return _type;
}

void KeyGenerator::setType(const QString &t)
{
    // Check for valid type.
    if (!_types.contains(t))
        return;

    if (t != _type) {
        _type = t;
        emit typeChanged();
    }
}

QStringList KeyGenerator::types()
{
    return _types;
}

QString KeyGenerator::filename()
{
    return _filename;
}

void KeyGenerator::setFilename(const QString &f)
{
    if (f != _filename) {
        _filename = f;
        emit filenameChanged();
    }
}

QString KeyGenerator::passphrase()
{
    return _passphrase;
}

void KeyGenerator::setPassphrase(const QString &p)
{
    if (p != _passphrase) {
        _passphrase = p;
        emit passphraseChanged();
    }
}

void KeyGenerator::generateKey()
{
    // Sanity check on arguments
    if (_type.isEmpty() or _filename.isEmpty() or
        (_passphrase.length() > 0 and _passphrase.length() < 5)) {
        emit keyGenerated(false);
        return;
    }

    // Remove key file if it already exists
    if (QFile::exists(_filename)) {
        QFile::remove(_filename);
    }

    // Execute ssh-keygen -t type -N passphrase -f keyfileq
    QProcess *proc = new QProcess;
    QString prog = "ssh-keygen";
    QStringList args{"-t", _type, "-N", _passphrase, "-f", _filename};
    proc->start(prog, args);
    proc->waitForFinished();
    emit keyGenerated(proc->exitCode() == 0);
    delete proc;
}

The constructor initializes some of the member variables. For fun, I used the new initializer list feature of C++11 to initialize the _types member variable which is of type QStringList. The destructor does nothing, at least for now, but is there for completeness and future expansion.

Getter functions like type() simply return the appropriate private member variable. Setters set the appropriate variables, taking care to check that the new value is different from the old one and if so, emitting the appropriate signal. As always, please note that signals are created by the Meta Object Compiler and do not need to be implemented, only emitted at the appropriate times.

The only non-trivial method is the slot generateKey(). It does some checking of arguments and then creates a QProcess to run the external ssh-keygen program. For simplicity and because it typically executes quickly, I do this synchronously and block on it to complete. When done, we emit a signal that has a boolean argument that indicates the key was generated and whether it succeeded or not.

QML Code

Now let’s look at the QML code in main.qml:

// SSH key generator UI

import QtQuick 2.1
import QtQuick.Controls 1.0
import QtQuick.Layouts 1.0
import QtQuick.Dialogs 1.0
import com.ics.demo 1.0

ApplicationWindow {
    title: qsTr("SSH Key Generator")

    statusBar: StatusBar {
    RowLayout {
        Label {
            id: status
            }
        }
    }

    width: 369
    height: 166

    ColumnLayout {
        x: 10
        y: 10

        // Key type
        RowLayout {
            Label {
                text: qsTr("Key type:")
            }
            ComboBox {
                id: combobox
                Layout.fillWidth: true
                model: keygen.types
                currentIndex: 2
            }
        }

        // Filename
        RowLayout {
            Label {
                text: qsTr("Filename:")
            }
            TextField {
                id: filename
                implicitWidth: 200
                onTextChanged: updateStatusBar()
            }
            Button {
                text: qsTr("&Browse...")
                onClicked: filedialog.visible = true
            }
        }

        // Passphrase
        RowLayout {
            Label {
                text: qsTr("Pass phrase:")
            }
            TextField {
                id: passphrase
                Layout.fillWidth: true
                echoMode: TextInput.Password
                onTextChanged: updateStatusBar()
            }

        }

        // Confirm Passphrase
        RowLayout {
            Label {
                text: qsTr("Confirm pass phrase:")
            }
            TextField {
                id: confirm
                Layout.fillWidth: true
                echoMode: TextInput.Password
                onTextChanged: updateStatusBar()
            }
        }

        // Buttons: Generate, Quit
        RowLayout {
            Button {
                id: generate
                text: qsTr("&Generate")
                onClicked: keygen.generateKey()
            }
            Button {
                text: qsTr("&Quit")
                onClicked: Qt.quit()
            }
        }

    }

    FileDialog {
        id: filedialog
        title: qsTr("Select a file")
        selectMultiple: false
        selectFolder: false
        nameFilters: 
        selectedNameFilter: "All files (*)"
        onAccepted: {
            filename.text = fileUrl.toString().replace("file://", "")
        }
    }

    KeyGenerator {
        id: keygen
        filename: filename.text
        passphrase: passphrase.text
        type: combobox.currentText
        onKeyGenerated: {
            if (success) {
                status.text = qsTr('<font color="green">Key generation succeeded.</font>')
            } else {
                status.text = qsTr('<font color="red">Key generation failed</font>')
            }
        }
    }

    function updateStatusBar() {
        if (passphrase.text != confirm.text) {
            status.text = qsTr('<font color="red">Pass phrase does not match.</font>')
            generate.enabled = false
        } else if (passphrase.text.length > 0 && passphrase.text.length < 5) {
            status.text = qsTr('<font color="red">Pass phrase too short.</font>')
            generate.enabled = false
        } else if (filename.text == "") {
            status.text = qsTr('<font color="red">Enter a filename.</font>')
            generate.enabled = false
        } else {
            status.text = ""
            generate.enabled = true
        }
    }

    Component.onCompleted: updateStatusBar()
}

The preceding code is a little long, however, much of the work is laying out the GUI components. The code should be straightforward to follow.

Note that we import com.ics.demo version 1.0. We’ll see where this module name comes from shortly. This makes a new QML type KeyGeneratoravailable and so we declare one. We have access to it’s C++ properties as QML properties, can call it’s methods and act on signals like we do withonKeyGenerated.

A more complete program should probably do a little more error checking and report meaningful error messages if key generation fails (we could easily add a new method or property for this). The UI layout could also be improved to make it properly resizable.

Our main program is essentially a wrapper like qmlscene. All we need to do to register our type with the QML engine is to call:

    qmlRegisterType<KeyGenerator>("com.ics.demo", 1, 0, "KeyGenerator");

This makes the C++ type KeyGenerator available as the QML type KeyGenerator in the module com.ics.demo version 1.0 when it is imported.

Typically, to run QML code from an executable, in the main program you would create a QGuiApplication and a QQuickView. Currently, to use the Qt Quick Components there is some additional work needed if the top level element is an ApplicationWindow or Window. You can look at the source code to see how I implemented this. I basically stripped down the code from qmlscene to the minimum of what was needed for this example.

Here is the full listing for the main program, main.cpp:

#include <QApplication>
#include <QObject>
#include <QQmlComponent>
#include <QQmlEngine>
#include <QQuickWindow>
#include <QSurfaceFormat>
#include "KeyGenerator.h"

// Main wrapper program.
// Special handling is needed when using Qt Quick Controls for the top window.
// The code here is based on what qmlscene does.

int main(int argc, char ** argv)
{
    QApplication app(argc, argv);

    // Register our component type with QML.
    qmlRegisterType<KeyGenerator>("com.ics.demo", 1, 0, "KeyGenerator");

    int rc = 0;

    QQmlEngine engine;
    QQmlComponent *component = new QQmlComponent(&engine);

    QObject::connect(&engine, SIGNAL(quit()), QCoreApplication::instance(), SLOT(quit()));

    component->loadUrl(QUrl("main.qml"));

    if (!component->isReady() ) {
        qWarning("%s", qPrintable(component->errorString()));
        return -1;
    }

    QObject *topLevel = component->create();
    QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel);

    QSurfaceFormat surfaceFormat = window->requestedFormat();
    window->setFormat(surfaceFormat);
    window->show();

    rc = app.exec();

    delete component;
    return rc;
}

In case it is not obvious, when using a module written in C++ with QML you cannot use the qmlscene program to execute your QML code because the C++ code for the module will not be linked in. If you try to do this you will get an error message that the module is not installed.

DockView: Choose Window Applications Jump at Dock

Dock is part desktop OS X that characterizes Apple’s flagship computer operating system. Dock functions such as running apilkasi shortcuts or files and move from one application to another. To move from window to another window in an application, the user must use the OS X Exposé. But, what if asiknya application icon in the Dock to have features such as Windows 7, which the user can select a window which opens directly without having to rely on Exposé.

For those of you who want those features, can wear DockView apps in the App Store.

Like I mentioned earlier, DockView able to provide thumbnail windows of an application by placing the cursor over the application that has many windows.

DockView also supports thumbnail windows through the App Swithcer. Suitable for you who frequently use the App Swithcer to move the window. Still clumsy with App Swithcer? Just look at the previous tips, about maximizing the use of the App Swithcer.

Label the price is free, but it actually has a Dock View in app purchase to eliminate loading thumbnail window sometimes appears for a few seconds.

Additional Dock DockView a supplement that must be considered to accelerate access to switch between windows.

Multifunctional HP Officejet 150 Mobile

Multifunction Devices with Batteries

Via Officejet 150 Mobile, HP (Hewlett-Packard) brings superior features the use of lithium-ion batteries. Even the battery usage on this multifunction device is the first in the world. By using the battery, you can run this device is not currently available grid (PLN). This battery is claimed to last for up to five hundred print document sheet.

u9-435-hp150Meski your physical form, HP still includes a variety of connectivity for easy printing of various devices. You can print directly from the camera using Pictbridge connection, also can print from a memory card slot thanks to the existence of SD and MMC. Any USB port makes HP Officejet 150 Mobile can be used to access and print the content of external media such as flash disks and hard disks. Memory card and flash drive can also be used to store the scanned file. While in the case of the scan function, its use must install the software first included in the package.

In addition, the device also supports printing directly from the smartphone. Unfortunately, given only limited support for Windows Phone and Blackberry platforms. While the operating system is quite popular smartphones such as Android and iOS are not supported. All of which functioned through the touch screen-based fee that is responsive. “Shortage” is in another physical form that are made as short as possible: not supplied buffer to hold the paper. As a result, you will be a little bothered by the scattered papers.

Although the print speed is quite normal, to say the performance is not too slow. Copy and scan process is done using sheet-fed technology. This technology will scan the pages of the paper. When finished scanned per sheet of paper, the results can be printed directly pindaiannya. When PCplus count, nicks exact same time even though the documents are processed differently.

With the innovations presented by HP, you can carry around a print device like a laptop. Thanks to the support of such batteries, as well as direct printing capabilities are fairly a lot, this device is more practical and flexible. If there is a problem with the price (U.S. $ 399), HP Officejet 150 Mobile suitable to accompany you to print anywhere.

Prepare Middle Acer Tablet screen Resolution WQHD With Tegra 4 CPU?

After a long time no hear, Acer reportedly serious secretly working on a new tablet model featuring support for NVIDIA Tegra 4 processor and high resolution screen.

Based on reports published by Notebook Italia on benchmark results for the latest Acer tablet with the model number of this TA272HUL reportedly has the support of NVIDIA Tegra 4 1.8GHz processor. Not only that, the new Acer tablet based on the Android 4.2.2 will also be equipped with a high screen resolution support WQHD (2560 × 1440 pixels) and 2GB of RAM.

The use of quad-core processor ARM Cortex-A15 will supposedly make the most of existing devices may have reliability and high-performance fast. Yes, that’s the least that has been disclosed in a relevant benchmark results support the processor models in Nenamark and Passmark recently.

And regardless of whether or not the existence of these rumors, unfortunately still unknown specific info from related parties so far.

HP Envy Rove: Tablet-PC 20-inch with Intel Haswell

Are you ready to welcome the era of jumbo-sized tablet PC? After Asus Transformer comes with AIO, now turn to HP HP Envy Rove is ready to market, its latest tablet PC that can also act as an AIO PC that was introduced in May 2013 ago.
HP Envy HP Envy Rove rove 1: 20 inch Tablet PC With Intel Haswell tablet pc news pc desktop computer
HP Envy Rove: Tablet PC 20 inch with Intel Haswell
Rove HP Envy 20-inch size is quite large compared to most of the tablet PC on the market today. If you think to ask her mobility, you should be thinking twice about doing it. Because, in addition to having the extra large screen is also fairly heavy weight is about 5.4 kg. Similar to the average weight of a multimedia laptop.

Touch screen IPS panel which has been put on comes with a resolution of 1600 × 900 pixels. To conjure into an AIO-PC, the back of the HP Envy Rove has been equipped with a set of legs as well as the wireless keyboard and mouse that comes in the sales package.
Running the Windows 8 operating system, HP Envy Rove performance processors rely fourth-generation Intel Core i3 (Intel Haswell) with 4GB of RAM support. And considering the HP Envy Rove can converted into an AIO PC, the capacity of storage space also comes with hybrid models that combine performance with 8GB SSD and HDD are very roomy 1TB capacity. This combination will be used to speed up Windows boot process.
To connect with other devices available a variety of connectivity options such as WiFi, Bluetooth, Ethernet port, SD memory card slot, USB port 2.0,3 USB 3.0 ports and has received support Intel WiDi (Wireless Display) which can be useful to share the screen.
HP Envy Rove has now come to the American market with a price of around U.S. $ 980. And while there has been no word on whether this jumbo tablet PC will be available in Indonesia.

Cbeyond Chooses Crafter Software to Create A Higher Quality Customer Web Experience, Boosting Engagement

Crafter Software Corp., a leading provider of software solutions for the creation of rich and engaging websites, mobile applications and multi-channel digital experiences, today announced thatCbeyond (CBEY) has chosen Crafter’s Web content and experience management solutions. Cbeyond replaced its existingWeb content management system with Crafter as part of a website rebranding effort to provide a far more dynamic, engaging Web experience flexible enough to integrate with various internal content systems. Since re-launching the Cbeyond site using Crafter, the website has generated 18 percent more leads and website traffic has increased nine percent.

“Crafter’s modular components and architecture integrated easily with our user login platform and customer management system. We now have the flexibility to create an engaging Web presence, are no longer boxed in to one type of look and can quickly tailor the site to our ongoing needs,” said Tom Ouellette, senior director, Marketing Communications at Cbeyond. “Best of all, Crafter’s user-friendly content authoring tools provide our website visitors with fresh content that best describes our cloud computing solutions.”

Cbeyond deployed Crafter Engine, a high-performance content delivery system, as a foundation for its new website. Crafter Engine is built from the ground up to easily tap into various data sources from social media, ERPs, CRMs, marketing campaign systems and others to create a dynamic Web experience that is specifically targeted to an individual user.

Cbeyond also rolled out Crafter Studio, a Web content authoring and publishing solution, to its marketing team. The product offers user-friendly features for marketers and content editors to enable easier and faster publishing across all channels, without any involvement from development or IT.

“We see accelerating demand for our software as today’s Web continues to evolve from a static publishing environment to a business-critical productivity and engagement platform,” said Mike Vertal, CEO of Crafter Software. “Cbeyond can now turn on a dime and quickly adapt to results from A/B split testing and other analytics data. We are thrilled to see their significant early return in terms of website traffic and Web-based leads.”

About Crafter Software

Crafter Software (Reston, Va.) enables the creation of rich and engaging websites, mobile applications, and multi-channel digital experiences. The company’s software solutions are based on the award-winning Crafter CMS open source project, which was built from the ground up as a modern platform for creating more relevant web experiences through targeted delivery of personalized content. Serving as the lynchpin between enterprise systems and end users, Crafter’s solutions enable marketing, sales and support teams to author and manage content while harvesting analytics and data-driven insights to deliver engaging experiences across all digital channels—the web, mobile, social, and more. For more information, visit craftersoftware.com and craftercms.org.

Chat apps ‘Nimbuzz Messenger’

Chat on Instant Messenger Applications Through One Application

Nimbuz is a place for you who have an account on a popular instant messenger applications. So by using Nimbuzz, you can chat on Yahoo Messenger account, Facebook Chat, or Google talk, through one application that is Nimbuzz.

d6-435-nimbuzzMetode it uses diverse, can through desktop applications that must be installed first, or can be directly through the browser by logging in using an account on the official website through Webchat feature. To check if the connection is using Nimbuzz goes well, provided a useful bot to respond to the chat that you do.

Nimbuzz also has the facility to call abroad at a cheaper cost than using regular telephone rates. You do this by purchasing credits through Nimbuzz! Out with the subscription fee is offered. Similarly, the video chat facility if you have a webcam or a camera that supports it. Share files such as audio, image, or video are also possible as most similar applications.

Nimbuzz Messenger comes complete various platforms, ranging from PC desktop to mobile. For the mobile platform is available on Android based operating systems, iOS, Blackberry, Windows Phone, Symbian and Java. Nimbuzz also features a comprehensive list of some brands of mobile phones that support this application. And users can perform a cross-platform chat so that you more easily in touch with relatives in cyberspace.

Adobe completes $600M purchase of Neolane

Calif. (AP) — Adobe Systems Inc. said Tuesday that it has closed on a $600 million purchase of Neolane, a French company that provides technology for marketing campaigns.

Adobe, which makes Photoshop and other creative software and is shifting its business to a subscription model, said that Neolane would bolster its digital-marketing services.

The San Jose, Calif., company already has digital marketing services, including analytics and targeting. Neolane’s technology, meanwhile, helps companies manage marketing campaigns on the Internet, email, social media and mobile devices, as well as through call centers and direct mail. It has more than 400 customers around the world, many of whom also used Adobe services.

When it announced its plans for the deal last month, Adobe said buying Neolane would not significantly affect its results this year. The company couldn’t estimate the effect of the acquisition on future earnings.

Adobe’s stock closed Monday at $48.28, up 28 percent this year.