Recherche avancée

Médias (91)

Autres articles (38)

  • Le plugin : Gestion de la mutualisation

    2 mars 2010, par

    Le plugin de Gestion de mutualisation permet de gérer les différents canaux de mediaspip depuis un site maître. Il a pour but de fournir une solution pure SPIP afin de remplacer cette ancienne solution.
    Installation basique
    On installe les fichiers de SPIP sur le serveur.
    On ajoute ensuite le plugin "mutualisation" à la racine du site comme décrit ici.
    On customise le fichier mes_options.php central comme on le souhaite. Voilà pour l’exemple celui de la plateforme mediaspip.net :
    < ?php (...)

  • Gestion de la ferme

    2 mars 2010, par

    La ferme est gérée dans son ensemble par des "super admins".
    Certains réglages peuvent être fais afin de réguler les besoins des différents canaux.
    Dans un premier temps il utilise le plugin "Gestion de mutualisation"

  • Gestion des droits de création et d’édition des objets

    8 février 2011, par

    Par défaut, beaucoup de fonctionnalités sont limitées aux administrateurs mais restent configurables indépendamment pour modifier leur statut minimal d’utilisation notamment : la rédaction de contenus sur le site modifiables dans la gestion des templates de formulaires ; l’ajout de notes aux articles ; l’ajout de légendes et d’annotations sur les images ;

Sur d’autres sites (2573)

  • Multivariate Testing vs A/B Testing (Quick-Start Guide)

    7 mars 2024, par Erin

    Traditional advertising (think Mad Men) was all about slogans, taglines and coming up with a one-liner that was meant to change the world.

    But that type of advertising was extremely challenging to test, so it was hard to know if it worked. Most of the time, nobody knew if they were being effective with their advertising.

    Enter modern marketing : the world of data-driven advertising.

    Thanks to the internet and web analytics tools like Matomo, you can quickly test almost anything and improve your site.

    The question is, should you do multivariate testing or A/B testing ?

    While both have their advantages, each has a specific use case.

    In this guide, we’ll break down the differences between multivariate and A/B testing, offer some pros and cons of each and show you some examples so you can decide which one is best for you.

    What is A/B testing ?

    A/B testing, or split testing, is testing an individual element in a medium against another version of the same element to see which produces better results.

    What is a/b testing?

    A/B tests are conducted by creating two different versions of a digital landmark : a website, landing page, email, or advertisement.

    The goal ? Figure out which version performs better.

    Let’s say, for example, you want to drive more sales on your core product page.

    You test two call-to-action buttons : “Buy Now” and “Add to Cart.”

    After running the test for two weeks, you see that “Buy Now” produced 1.2% conversions while “Add to Cart” produced 7.6%.

    In this scenario, you’ve found your winner : version B, “Add to Cart.”

    By conducting A/B tests regularly, you can optimise your site, increase engagement and convert more visitors into customers.

    Keep in mind that A/B testing isn’t perfect ; it doesn’t always produce a win.

    According to Noah Kagan, founder of AppSumo, only 1 out of 8 A/B tests his company conducts produces significant change.

    Advantages of A/B testing

    A/B testing is great when you need to get an accurate result fast on a specific element of your marketing efforts.

    Whether it’s a landing page or product page, you can get quick results without needing a lot of traffic.

    A/B testing is one of the most widely accepted and used testing methods for marketers and business owners.

    When you limit the number of tracked variables used in a test, you can quickly deliver reliable data, allowing you to iterate and pivot quickly if necessary.

    This is a great way to test your marketing methods, especially if you’re a newer business or you don’t have substantial traffic yet.

    Splitting up your traffic into a few segments (like with multivariate testing) will be very challenging to gain accurate results if you have lower daily traffic.

    One final advantage of A/B testing is that it’s a relatively easy way to introduce testing and optimising to a team, decision-maker, or stakeholder since it’s easy to implement. You can quickly demonstrate the value with a simple change and tangible evidence.

    Disadvantages of A/B testing

    So, what are the downsides to A/B testing ?

    Although A/B testing can get you quick results on small changes, it has limitations.

    A/B testing is all about measuring one element against another.

    This means you’re immediately limited in how many elements you can test. If you have to test out different variables, then A/B testing isn’t your best option since you’ll have to run test after test to get your result.

    If you need specific information on how different combinations of elements interact with one another on a web page, then multivariate is your best option.

    What is multivariate testing ?

    If you want to take your testing to the next level, you’ll want to try multivariate testing.

    Multivariate testing relies on the same foundational mechanism of A/B testing, but instead of matching up two elements against one another, it compares a higher number of variables at once.

    Multiple + variations = multivariate.

    Multivariate testing looks at how combinations of elements and variables interact.

    Like A/B testing, traffic to a page is split between different web page versions. Multivariate testing aims to measure each version’s effectiveness against the other versions.

    Ultimately, it’s about finding the winning combination.

    What Is Multivariate Testing?

    When to use multivariate testing

    The quick answer on when to use multivariate testing is if you have enough traffic.

    Just how much traffic, though ?

    While there’s no set number, you should aim to have 10,000 visitors per month or more, to ensure that each variant receives enough traffic to produce meaningful results within a reasonable time frame.

    Once you meet the traffic requirement, let’s talk about use cases.

    Let’s say you want to introduce a new email signup.

    But you want to create it from scratch and aren’t sure what will make your audience take action.

    So, you create a page with a signup form, a header, and an image.

    To run a multivariate test, you create two lengths of signup forms, four headlines, and two images.

    Next, you would create a test to split traffic between these sixteen combinations.

    Advantages of multivariate testing

    If you have enough traffic, multivariate testing can be an incredible way to speed up your A/B testing by testing dozens of combinations of your web page.

    This is handy when creating a new landing page and you want to determine if specific parts of your design are winners — which you can then use in future campaigns.

    Disadvantages of multivariate testing

    The main disadvantage of multivariate testing is that you need a lot of traffic to get started.

    If you try to do a multivariate analysis but you’re not getting much traffic, your results won’t be accurate (and it will take a long time to see accurate data).

    Additionally, multivariate tests are more complicated. They’re best suited for advanced marketers since more moving parts are at play.

    Key differences between multivariate and A/B testing

    Now that we’ve covered what A/B and multivariate tests are, let’s look at some key differences to help clarify which is best for you.

    Key differences between multivariate testing and A/B testing.

    1. Variation of combinations

    The major difference between A/B and multivariate testing is the number of combinations involved.

    With A/B testing, you only look at one element (no combinations). You simply take one part of your page (i.e., your headline copy) and make two versions.

    With multivariate testing, you’re looking at combinations of different elements (i.e., headline copy, form length, images).

    2. Number of pages to test

    The next difference lies in how many pages you will test.

    With an A/B test, you are splitting traffic on your website to two different pages : A and B.

    However, with multivariate testing, you will likely have 4-16 different test pages.

    This is because dozens of combinations can be created when you start testing a handful of elements at once.

    For example, if you want to test two headlines, two form buttons and two images on a signup form, then you have several combinations :

    • Headline A, Button A, Image A
    • Headline A, Button A, Image B
    • Headline A, Button B, Image A
    • Headline A, Button B, Image B
    • Headline B, Button A, Image A
    • Headline B, Button A, Image B
    • Headline B, Button B, Image A
    • Headline B, Button B, Image B

    In this scenario, you must create eight pages to send traffic to.

    3. Traffic requirements

    The next major difference between the two testing types is the traffic requirements.

    With A/B testing, you don’t need much traffic at all.

    Since you’re only testing two pages, you can split your traffic in half between the two types.

    However, if you plan on implementing a multivariate test, you will likely be splitting your traffic at least four or more ways.

    This means you need to have significantly more traffic coming in to get accurate data from your test. If you try to do this when your traffic is too low, you won’t have a large enough sample size.

    4. Time requirements

    Next up, just like traffic, there’s also a time requirement.

    A/B testing only tests two versions of a page against each other (while testing a single element). This means you’ll get accurate results faster than a multivariate test — usually within days.

    However, for a multivariate test, you might need to wait weeks. This is because you’re splitting your traffic by 4, 8, 12, or more web page variations. This could take months since you need a large enough sample size for accuracy.

    5. Big vs. small changes

    Another difference between A/B testing and multivariate testing is the magnitude of changes.

    With an A/B test, you’re looking at one element of a page, which means changing that element to the winning version isn’t a major overhaul of your design.

    But, with multivariate testing, you may find that the winning combination is drastically different than your control page, which could lead to a significant design change.

    6. Accuracy of results

    A/B tests are easier to decipher than multivariate testing since you only look at two versions of a single element on a page.

    You have a clear winner if one headline yields a 5% conversion rate and another yields a 1.2% conversion rate.

    But multivariate testing looks at so many combinations of a page that it can be a bit trickier to decipher what’s moving the needle.

    Pros and cons : Multivariate vs. A/B testing

    Before picking your testing method of choice, let’s look at some quick pros and cons.

    Pros and cons of multivariate vs. a/b testing.

    A/B testing pros and cons

    Here are the pros and cons of A/B testing :

    Pros

    • Get results quickly
    • Results are easier to interpret
    • Lower traffic requirement
    • Easy to get started

    Cons

    • You need to be hyper-focused on the right testing element
    • Requires performing test after test to optimise a web page

    Multivariate testing pros and cons

    Here are the pros and cons of multivariate testing :

    Pros

    • Handy when redesigning an entire web page
    • You can test multiple variables at once
    • Significant results (since traffic is higher)
    • Gather multiple data insights at once

    Cons

    • Requires substantial traffic
    • Harder to accurately decipher results
    • Not as easy to get started (more advanced)

    Use Matomo to start testing and improving your site

    A/B testing in Matomo analytics

    You need to optimise your website if you want to get more leads, land more conversions and grow your business.

    A/B testing and multivariate testing are proven testing methods you can lean on to improve your website and create a better user experience.

    You may prefer one testing method now over the other, and that’s okay.

    The main thing is you’re starting to test. The best marketers and analysts in the world find what works through testing and double down on their winning tactics.

    If you want to start improving your website with testing today, get started with Matomo for free.

    With Matomo, you can conduct A/B tests and multivariate tests easily, accurately, and ethically. Unlike other web analytics tools, Matomo prioritises privacy, providing
    100% accurate data without sampling, and eliminates the need for cookie consent
    banners (except in the UK and Germany).

    Try Matomo free for 21-days. No credit card required.

  • Resampling audio using libswresample, leaves small amount of noise after resampling

    20 juillet 2020, par Milo

    I'm trying to resample audio from 44Khz to 48Khz and I'm getting s small light noise after resampling. As if someone is gently ticking the mic. This happens both ways. From 48Khz to 44Khz and vice versa.

    &#xA;

    I've read that this can happen because swrContext still has some data left and that I shoudl flush the context before resampling next frame. And although this helps a little (less noticeable noise), it's still present.

    &#xA;

    I've tried using FFmpeg resample filter instead, but the output is just loud incoherent noise. I'm pretty sure that libswresample should not output any noise on resampling which means that I just don't know how to use it well and I'm missing some options.

    &#xA;

    This is the code for resampler.

    &#xA;

    int ResampleFrame(VideoState * videoState, AVFrame *decoded_audio_frame,     enum AVSampleFormat out_sample_fmt, uint8_t * out_buf)&#xA;{&#xA; int in_sample_rate = videoState->audio->ptrAudioCodecCtx_->sample_rate;&#xA; int out_sample_rate = SAMPLE_RATE;&#xA;&#xA;// get an instance of the AudioResamplingState struct, create if NULL&#xA;AudioResamplingState* arState = getAudioResampling(videoState->audio->ptrAudioCodecCtx_->channel_layout);&#xA;&#xA;if (!arState->swr_ctx)&#xA;{&#xA;    printf("swr_alloc error.\n");&#xA;    return -1;&#xA;}&#xA;&#xA;// get input audio channels&#xA;arState->in_channel_layout = (videoState->audio->ptrAudioCodecCtx_->channels ==&#xA;            av_get_channel_layout_nb_channels(videoState->audio->ptrAudioCodecCtx_->channel_layout)) ?&#xA;            videoState->audio->ptrAudioCodecCtx_->channel_layout :&#xA;            av_get_default_channel_layout(videoState->audio->ptrAudioCodecCtx_->channels);&#xA;&#xA;&#xA;// check input audio channels correctly retrieved&#xA;if (arState->in_channel_layout &lt;= 0)&#xA;{&#xA;    printf("in_channel_layout error.\n");&#xA;    return -1;&#xA;}&#xA;&#xA;&#xA;arState->out_channel_layout = AV_CH_LAYOUT_STEREO;&#xA;&#xA;// retrieve number of audio samples (per channel)&#xA;arState->in_nb_samples = decoded_audio_frame->nb_samples;&#xA;if (arState->in_nb_samples &lt;= 0)&#xA;{&#xA;    printf("in_nb_samples error.\n");&#xA;    return -1;&#xA;}&#xA;&#xA;// Set SwrContext parameters for resampling&#xA;av_opt_set_int(arState->swr_ctx, "in_channel_layout", arState->in_channel_layout, 0);&#xA;av_opt_set_int(arState->swr_ctx, "in_sample_rate", in_sample_rate, 0);&#xA;av_opt_set_sample_fmt(arState->swr_ctx, "in_sample_fmt", videoState->audio->ptrAudioCodecCtx_->sample_fmt, 0);&#xA;&#xA;&#xA;// Set SwrContext parameters for resampling&#xA;av_opt_set_int(arState->swr_ctx, "out_channel_layout", arState->out_channel_layout, 0);&#xA;av_opt_set_int(arState->swr_ctx, "out_sample_rate", out_sample_rate, 0);&#xA;av_opt_set_sample_fmt(arState->swr_ctx, "out_sample_fmt", out_sample_fmt, 0);&#xA;&#xA;&#xA;// initialize SWR context after user parameters have been set&#xA;int ret = swr_init(arState->swr_ctx);&#xA;if (ret &lt; 0)&#xA;   {&#xA;    printf("Failed to initialize the resampling context.\n");&#xA;    return -1;&#xA;   }&#xA;&#xA;&#xA; // retrieve output samples number taking into account the progressive delay&#xA;int64_t delay = swr_get_delay(arState->swr_ctx, videoState->audio->ptrAudioCodecCtx_->sample_rate) &#x2B; arState->in_nb_samples;&#xA;arState->out_nb_samples = av_rescale_rnd(delay, out_sample_rate, in_sample_rate, AV_ROUND_UP );&#xA;&#xA;// check output samples number was correctly rescaled&#xA;if (arState->out_nb_samples &lt;= 0)&#xA;{&#xA;    printf("av_rescale_rnd error\n");&#xA;    return -1;&#xA;}&#xA;&#xA;// get number of output audio channels&#xA;arState->out_nb_channels = av_get_channel_layout_nb_channels(arState->out_channel_layout);&#xA;&#xA;// allocate data pointers array for arState->resampled_data and fill data&#xA;// pointers and linesize accordingly&#xA;// check memory allocation for the resampled data was successful&#xA;ret = av_samples_alloc_array_and_samples(&amp;arState->resampled_data, &amp;arState->out_linesize, arState->out_nb_channels, arState->out_nb_samples, out_sample_fmt, 0);&#xA;if (ret &lt; 0)&#xA;   {&#xA;    printf("av_samples_alloc_array_and_samples() error: Could not allocate destination samples.\n");&#xA;    return -1;&#xA;   }&#xA;&#xA;&#xA;if (arState->swr_ctx)&#xA;   {&#xA;    // do the actual audio data resampling&#xA;    // check audio conversion was successful&#xA;    int ret_num_samples = swr_convert(arState->swr_ctx,arState->resampled_data,arState->out_nb_samples,(const uint8_t**)decoded_audio_frame->data, decoded_audio_frame->nb_samples);&#xA;    //int ret_num_samples = swr_convert_frame(arState->swr_ctx,arState->resampled_data,arState->out_nb_samples,(const uint8_t**)decoded_audio_frame->data, decoded_audio_frame->nb_samples);&#xA;&#xA;    if (ret_num_samples &lt; 0)&#xA;       {&#xA;        printf("swr_convert_error.\n");&#xA;        return -1;&#xA;       }&#xA;&#xA;&#xA;    // get the required buffer size for the given audio parameters&#xA;    // check audio buffer size&#xA;    arState->resampled_data_size = av_samples_get_buffer_size(&amp;arState->out_linesize,   arState->out_nb_channels,ret_num_samples,out_sample_fmt,1);&#xA;&#xA;    if (arState->resampled_data_size &lt; 0)&#xA;       {&#xA;        printf("av_samples_get_buffer_size error.\n");&#xA;        return -1;&#xA;       }&#xA;   } else {&#xA;           printf("swr_ctx null error.\n");&#xA;           return -1;&#xA;          }&#xA;&#xA;&#xA;&#xA;// copy the resampled data to the output buffer&#xA;memcpy(out_buf, arState->resampled_data[0], arState->resampled_data_size);&#xA;&#xA;&#xA;// flush the swr context&#xA;int delayed = swr_convert(arState->swr_ctx,arState->resampled_data,arState->out_nb_samples,NULL,0);&#xA;&#xA;&#xA;&#xA;if (arState->resampled_data)&#xA;   {&#xA;    av_freep(&amp;arState->resampled_data[0]);&#xA;   }&#xA;&#xA;av_freep(&amp;arState->resampled_data);&#xA;arState->resampled_data = NULL;&#xA;&#xA;int ret_data_size = arState->resampled_data_size;&#xA;&#xA;&#xA;&#xA;return ret_data_size;&#xA;}&#xA;

    &#xA;

    I also tries using the filter as shown here but my output is just noise.

    &#xA;

    This is my filter code

    &#xA;

    int  ResampleFrame(AVFrame *frame, uint8_t *out_buf)&#xA;{&#xA;   /* Push the decoded frame into the filtergraph */&#xA;    qint32 ret;&#xA;    ret = av_buffersrc_add_frame_flags(buffersrc_ctx1, frame, AV_BUFFERSRC_FLAG_KEEP_REF);&#xA;    if (ret &lt; 0) &#xA;       {&#xA;        printf("ResampleFrame: Error adding frame to buffer\n");&#xA;        // Delete input frame and return null&#xA;        av_frame_unref(frame);&#xA;        return 0;&#xA;    }&#xA;&#xA;&#xA;    //printf("resampling\n");&#xA;    AVFrame *resampled_frame = av_frame_alloc();&#xA;&#xA;&#xA;    /* Pull filtered frames from the filtergraph */&#xA;    ret = av_buffersink_get_frame(buffersink_ctx1, resampled_frame);&#xA;&#xA;    /* Set the timestamp on the resampled frame */&#xA;    resampled_frame->best_effort_timestamp = resampled_frame->pts;&#xA;&#xA;    if (ret &lt; 0) &#xA;       {&#xA;        av_frame_unref(frame);&#xA;        av_frame_unref(resampled_frame);&#xA;        return 0;&#xA;       }&#xA;&#xA;&#xA;    int buffer_size = av_samples_get_buffer_size(NULL,   2,resampled_frame->nb_samples,AV_SAMPLE_FMT_S16,1);&#xA;&#xA;    memcpy(out_buf,resampled_frame->data,buffer_size);&#xA;&#xA;    //av_frame_unref(frame);&#xA;    av_frame_unref(resampled_frame);&#xA;    return buffer_size;&#xA;}&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;QString filter_description1 = "aresample=48000,aformat=sample_fmts=s16:channel_layouts=stereo,asetnsamples=n=1024:p=0";&#xA;&#xA;int InitAudioFilter(AVStream *inputStream) &#xA;{&#xA;&#xA;    char args[512];&#xA;    int ret;&#xA;    const AVFilter *buffersrc = avfilter_get_by_name("abuffer");&#xA;    const AVFilter *buffersink = avfilter_get_by_name("abuffersink");&#xA;    AVFilterInOut *outputs = avfilter_inout_alloc();&#xA;    AVFilterInOut *inputs = avfilter_inout_alloc();&#xA;    filter_graph = avfilter_graph_alloc();&#xA;&#xA;&#xA;    const enum AVSampleFormat out_sample_fmts[] = {AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE};&#xA;    const int64_t out_channel_layouts[] = {AV_CH_LAYOUT_STEREO, -1};&#xA;    const int out_sample_rates[] = {48000, -1};&#xA;&#xA;    snprintf(args, sizeof(args), "time_base=%d/%d:sample_rate=%d:sample_fmt=%s:channel_layout=0x%" PRIx64,&#xA;                         inputStream->codec->time_base.num, inputStream->codec->time_base.den,&#xA;                         inputStream->codec->sample_rate,&#xA;                         av_get_sample_fmt_name(inputStream->codec->sample_fmt),&#xA;                         inputStream->codec->channel_layout);&#xA;&#xA;&#xA;    ret = avfilter_graph_create_filter(&amp;buffersrc_ctx1, buffersrc, "in", args, NULL, filter_graph);&#xA;&#xA;    if (ret &lt; 0) &#xA;       {&#xA;        printf("InitAudioFilter: Unable to create buffersrc\n");&#xA;        return -1;&#xA;       }&#xA;&#xA;    ret = avfilter_graph_create_filter(&amp;buffersink_ctx1, buffersink, "out", NULL, NULL, filter_graph);&#xA;&#xA;    if (ret &lt; 0) &#xA;       {&#xA;        printf("InitAudioFilter: Unable to create buffersink\n");&#xA;        return ret;&#xA;       }&#xA;&#xA;    // set opt SAMPLE FORMATS&#xA;    ret = av_opt_set_int_list(buffersink_ctx1, "sample_fmts", out_sample_fmts, -1, AV_OPT_SEARCH_CHILDREN);&#xA;&#xA;    if (ret &lt; 0) &#xA;       {&#xA;        printf("InitAudioFilter: Cannot set output sample format\n");&#xA;        return ret;&#xA;       }&#xA;&#xA;    // set opt CHANNEL LAYOUTS&#xA;    ret = av_opt_set_int_list(buffersink_ctx1, "channel_layouts", out_channel_layouts, -1, AV_OPT_SEARCH_CHILDREN);&#xA;&#xA;    if (ret &lt; 0) {&#xA;        printf("InitAudioFilter: Cannot set output channel layout\n");&#xA;        return ret;&#xA;    }&#xA;&#xA;    // set opt OUT SAMPLE RATES&#xA;    ret = av_opt_set_int_list(buffersink_ctx1, "sample_rates", out_sample_rates, -1, AV_OPT_SEARCH_CHILDREN);&#xA;&#xA;    if (ret &lt; 0) &#xA;       {&#xA;        printf("InitAudioFilter: Cannot set output sample rate\n");&#xA;        return ret;&#xA;       }&#xA;&#xA;    /* Endpoints for the filter graph. */&#xA;    outputs -> name = av_strdup("in");&#xA;    outputs -> filter_ctx = buffersrc_ctx1;&#xA;    outputs -> pad_idx = 0;&#xA;    outputs -> next = NULL;&#xA;&#xA;    /* Endpoints for the filter graph. */&#xA;    inputs -> name = av_strdup("out");&#xA;    inputs -> filter_ctx = buffersink_ctx1;&#xA;    inputs -> pad_idx = 0;&#xA;    inputs -> next = NULL;&#xA;&#xA;&#xA;    if ((ret = avfilter_graph_parse_ptr(filter_graph, filter_description1.toStdString().c_str(), &amp;inputs, &amp;outputs, NULL)) &lt; 0) &#xA;       {&#xA;        printf("InitAudioFilter: Could not add the filter to graph\n");&#xA;       }&#xA;&#xA;&#xA;    if ((ret = avfilter_graph_config(filter_graph, NULL)) &lt; 0) &#xA;       {&#xA;        printf("InitAudioFilter: Could not configure the graph\n");&#xA;       }&#xA;&#xA;    /* Print summary of the sink buffer&#xA;     * Note: args buffer is reused to store channel layout string */&#xA;    AVFilterLink *outlink = buffersink_ctx1->inputs[0];&#xA;    av_get_channel_layout_string(args, sizeof(args), -1, outlink->channel_layout);&#xA;&#xA;    QString str = args;&#xA;    printf("Output: srate:%dHz fmt:%s chlayout: %s\n", (int) outlink->sample_rate, &#xA;                                                      av_get_sample_fmt_name((AVSampleFormat) outlink->format),&#xA;                                                      str.toStdString().c_str());&#xA;&#xA;&#xA;    filterGraphInitialized_ = true; &#xA;}&#xA;

    &#xA;

    And since I don't have much experience with filters or audio for that matter, I'm also probably missing something here. But Can't figure out what.

    &#xA;

    Thanks

    &#xA;

  • Nexus One

    19 mars 2010, par Mans — Uncategorized

    I have had a Nexus One for about a week (thanks Google), and naturally I have an opinion or two about it.

    Hardware

    With the front side dominated by a touch-screen and a lone, round button, the Nexus One appearance is similar to that of most contemporary smartphones. The reverse sports a 5 megapixel camera with LED flash, a Google logo, and a smaller HTC logo. Power button, volume control, and headphone and micro-USB sockets are found along the edges. It is with appreciation I note the lack of a front-facing camera ; the silly idea of video calls is finally put to rest.

    Powering up the phone (I’m beginning to question the applicability of that word), I am immediately enamoured with the display. At 800×480 pixels, the AMOLED display is crystal-clear and easily viewable even in bright light. In a darker environment, the display automatically dims. The display does have one quirk in that the subpixel pattern doesn’t actually have a full RGB triplet for each pixel. The close-up photo below shows the pattern seen when displaying a solid white colour.

    Nexus One display close-up

    The result of this is that fine vertical lines, particularly red or blue ones, look a bit jagged. Most of the time this is not much of a problem, and I find it an acceptable compromise for the higher effective resolution it provides.

    Basic interaction

    The Android system is by now familiar, and the Nexus offers no surprises in basic usage. All the usual applications come pre-installed : browser, email, calendar, contacts, maps, and even voice calls. Many of the applications integrate with a Google account, which is nice. Calendar entries, map placemarks, etc. are automatically shared between desktop and mobile. Gone is the need for the bug-ridden custom synchronisation software with which mobile phones of the past were plagued.

    Launching applications is mostly speedy, and recently used apps are kept loaded as long as memory needs allow. Although this garbage-collection-style of application management, where you are never quite sure whether an app is still running, takes a few moments of acclimatisation, it works reasonably well in day to day use. Most of the applications are well-behaved and save their data before terminating.

    Email

    Two email applications are included out of the box : one generic and one Gmail-only. As I do not use Gmail, I cannot comment on this application. The generic email client supports IMAP, but is rather limited in functionality. Fortunately, a much-enhanced version, K-9, is available for download. The main feature I find lacking here is threaded message view.

    The features, or lack thereof, in the email applications is not, however, of huge importance, as composing email, or any longer piece of text, is something one rather avoids on a system like this. The on-screen keyboard, while falling among the better of its kind, is still slow to use. Lack of tactile feedback means accidentally tapping the wrong key is easily done, and entering numbers or punctuation is an outright chore.

    Browser

    Whatever the Nexus lacks in email abilities, it makes up for with the browser. Surfing the web on a phone has never been this pleasant. Page rendering is quick, and zooming is fast and simple. Even pages not designed for mobile viewing are easy to read with smart reformatting almost entirely eliminating the sideways scrolling which hampered many a mobile browser of old.

    Calls and messaging

    Being a phone, the Nexus One is obviously able to make and receive calls, and it does so with ease. Entering a number or locating a stored contact are both straight-forward operations. During a call, audio is clear and of adequate loudness, although I have yet to use the phone in really noisy surroundings.

    The other traditional task of a mobile phone, messaging, is also well-supported. There isn’t really much to say about this.

    Multimedia

    Having a bit of an interest in most things multimedia, I obviously tested the capabilities of the Nexus by throwing some assorted samples at it, revealing ample space for improvement. With video limited to H.264 and MPEG4, and the only supported audio codecs being AAC, MP3, Vorbis, and AMR, there are many files which will not play.

    To make matters worse, only selected combinations of audio and video will play together. Several video files I tested played without sound, yet when presented with the very same audio data alone, it was correctly decoded. As for container formats, it appears restricted to MP4/MOV, and Ogg (for Vorbis). AVI files are recognised as media files, but I was unable to find an AVI file which would play.

    With a device clearly capable of so much more, the poor multimedia support is nothing short of embarrassing.

    The Market

    Much of the hype surrounding Android revolves around the Market, Google’s virtual marketplace for app authors to sell or give away their creations. The thousands of available applications are broadly categorised, and a search function is available.

    The categorised lists are divided into free and paid sections, while search results, disappointingly, are not. To aid the decision, ratings and comments are displayed alongside the summary and screenshots of each application. Overall, the process of finding and installing an application is mostly painless. While it could certainly be improved, it could also have been much worse.

    The applications themselves are, as hinted above, beyond numerous. Sadly, quality does not quite match up to quantity. The vast majority of the apps are pointless, though occasionally mildly amusing, gimmicks of no practical value. The really good ones, and they do exist, are very hard to find unless one knows precisely what to look for.

    Battery

    Packing great performance into a pocket-size device comes with a price in battery life. The battery in the Nexus lasts considerably shorter time than that in my older, less feature-packed Nokia phone. To some extent this is probably a result of me actually using it a lot more, yet the end result is the same : more frequent recharging. I should probably get used to the idea of recharging the phone every other night.

    Verdict

    The Nexus One is a capable hardware platform running an OS with plenty of potential. The applications are still somewhat lacking (or very hard to find), although the basic features work reasonably well. Hopefully future Android updates will see more and better core applications integrated, and I imagine that over time, I will find third-party apps to solve my problems in a way I like. I am not putting this phone on the shelf just yet.