It’s a Good Day to Be a C# Developer

great_time_csharp_header

Recently at Connect(), Microsoft made a slew of new announcements. First, the public availability of Visual Studio 2017 Release Candidate. This just isn't a new version of the signature developer tool, it also includes the latest bits for C# 7.0. Second, Google announced they were joining the .NET Foundation. This means that Google, technically a competitor of Microsoft, wants to be actively involved in the evolution of .NET (and indirectly C#). Third, the first public release of Visual Studio for Mac. As a native environment, Visual Studio for Mac will provide the same world class tooling support for Xamarin applications, using C# and F#.

We could go on, but there is a common thread that runs between many of these announcements. As a developer, choosing C# as a part of your technology stack is an excellent decision! But what if you are not a C# developer already? How does C# compare to other popular languages such as JavaScript, Java, Python, etc?

Xamarin Forms and Google Mobile Ads for iOS: update

In my previous post I explaind how to add on your application advertising. In those days Xamarin has removed from the Component Store the component called Google Mobile Ads for iOS.

Now you have to install another component called Firebase AdMob for iOS.

Firebase_admob_ios

After installed this component you can see in your Output window a similar info without see an advert in your app:

2016-11-18 11:28:14.853 WordBankEasy.iOS[11103:2250070] <Google> You must set the rootViewController property of <GADBannerView: 0x1034702c0; frame = (-10 0; 320 50); clipsToBounds = YES; layer = <CALayer: 0x174e39d40>> before loading a request.

To fix this issue you have to find before the right UIViewController. For that you can use the following code:

    UIViewController viewController = null;
    foreach (UIWindow rootView in UIApplication.SharedApplication.Windows) {
        if (rootView != null) {
            viewController = rootView.RootViewController;
        }
    }

    adView = new BannerView(size: AdSizeCons.Banner,
                            origin: new CGPoint(-10, 0))
    {
        AdUnitID = AdmobID,
        RootViewController = viewController
    };

Happy coding!

Xamarin Forms and Google Mobile Ads for iOS

If you have a new Xamarin Project and you want to add an advertising, the simple way it is to use Google Admob. This implementation is only for Android and iOS.

One of the first things people think about when developing for a new platform / using a new technology is monetization; and in my case the question is: how easy is it to integrate AdMob? For Xamarin Forms the answer would be: “It depends” – it depends on luck & on the complexity of what you want to achieve; but I will detail this as we move along.

The first thing you need to do is add the required components to your projects. For this walktrough I will be using Visual Studio but it should be relatively the same when using Xamarin Studio. Here, things go separate ways for each of the platforms:

  • for Android – add the Google Play Services component
  • for iOS – add the AdMob component
  • for Windows Phone – download the SDK from here and add it as a reference

By now, you Android project should no longer be building & you should be receiving a COMPILETODALVIK : UNEXPECTED TOP-LEVEL error. To fix that, go into your Droid project properties, select the Android Options tab and then under Advanced modify the value for the Java Max Heap Size to 1G. Your project should now build without any errors.

Next, inside your shared / PCL project add a new Content View and call it AdMobView. Remove the code generated inside it’s constructor & it should look like this:

public class AdMobView : ContentView
{
    public AdMobView() { }
}

Add this new view to your page. In XAML you can do it like this:

<controls:AdMobView WidthRequest="320" HeightRequest="50" />

Make sure NOTHING interferes with the control. By nothing I mean – overlapping controls, page padding, control margins / spacing, etc. If you have something overlapping the ad control, ads will not display & you won’t receive an error, so be careful.

Android

Add a new class called AdMobRenderer with the code below. Make sure to keep the ExportRenderer attribute above the namespace, otherwise the magic won’t happen.

using WordBankEasy.Droid.Renderers;
using WordBankEasy.Views.AdMob;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(AdMobView), typeof(AdMobRenderer))]

namespace WordBankEasy.Droid.Renderers {
    public class AdMobRenderer : ViewRenderer<AdMobView, Android.Gms.Ads.AdView> {
        protected override void OnElementChanged(ElementChangedEventArgs<AdMobView> e) {
            base.OnElementChanged(e);

            if (Control == null) {
                var ad = new Android.Gms.Ads.AdView(Forms.Context);
                ad.AdSize = Android.Gms.Ads.AdSize.Banner;
                ad.AdUnitId = "ca-app-pub-4381168884554284/2250461656";

                var requestbuilder = new Android.Gms.Ads.AdRequest.Builder();
                ad.LoadAd(requestbuilder.Build());

                SetNativeControl(ad);
            }
        }
    }
}

Next, you need to modify your AndroidManifest.xml file to add the AdActivity & required permissions for displaying ads: ACCESS_NETWORK_STATE, INTERNET; just like in the example below (see also http://puresourcecode.com/dotnet/post/Android-required-permissions).

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-sdk android:minSdkVersion="15" />
    <application>
    <activity android:name="com.google.android.gms.ads.AdActivity" 
            android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:theme="@android:style/Theme.Translucent" />
    </application>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

That’s it. Your Android build should now display ads inside the AdMobView content view.

iOS

This, I haven’t got the chance to test yet as I don’t have a Mac around but people say it works, so I’ve added it for reference. Same as before, just add a new class called AdMobRenderer and copy-paste the code below but before you have to add a component.

In your iOS project click on “Components” (as in the picture)

Components

and click on “Get More Components…”. Then search admob and install it.

Google-Admob-Xamarin

using Xamarin.Forms;
using CoreGraphics;
using Xamarin.Forms.Platform.iOS;
using UIKit;
using WordBankEasy.Views.AdMob;
using WordBankEasy.iOS.Renderers;
using Google.MobileAds;

[assembly: ExportRenderer(typeof(AdMobView), typeof(AdMobRenderer))]
namespace WordBankEasy.iOS.Renderers {
    public class AdMobRenderer : ViewRenderer {
        const string AdmobID = "ca-app-pub-4381168884554284/5843056458";

        BannerView adView;
        bool viewOnScreen;

        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.View> e) {
            base.OnElementChanged(e);

            if (e.NewElement == null)
                return;

            if (e.OldElement == null) {
                adView = new BannerView(size: AdSizeCons.Banner, origin: new CGPoint(-10, 0)) {
                    AdUnitID = AdmobID,
                    RootViewController = UIApplication.SharedApplication.Windows[0].RootViewController
                };

                adView.AdReceived += (sender, args) => {
                    if (!viewOnScreen) this.AddSubview(adView);
                    viewOnScreen = true;
                };

                adView.LoadRequest(Request.GetDefaultRequest());
                base.SetNativeControl(adView);
            }
        }
    }
}

Here you can receive an strange error like:

Foundation.MonoTouchException: Objective-C exception thrown. Name: NSInvalidArgumentException Reason: -[AppDelegate window]: unrecognized selector sent to instance 0x7ffee9cdd4d0

Native stack trace:

0 CoreFoundation 0x000000010a12ed85 __exceptionPreprocess + 165

1 libobjc.A.dylib 0x000000010a5e3deb objc_exception_throw + 48

2 CoreFoundation 0x000000010a137d3d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205

3 CoreFoundation 0x000000010a07db17 forwarding + 487

4 CoreFoundation 0x000000010a07d8a8 _CF_forwarding_prep_0 + 120

5 WordBankEasyiOS 0x0000000100bc65e4 GADiTunesMetadataForFileAtPath + 4181

6 WordBankEasyiOS 0x0000000100c2d484 hasRequiredParams + 10260

7 WordBankEasyiOS 0x0000000100bc5f06 GADiTunesMetadataForFileAtPath + 2423

8 WordBankEasyiOS 0x0000000100bc1c35 GADCategories_NSURL_GADNSURLUtilities + 4438

9 WordBankEasyiOS 0x0000000100c00fde GADDispatchAsyncSafeMainQueue + 45

10 libobjc.A.dylib 0x000000010a5e4bff _class_initialize + 679

11 libobjc.A.dylib 0x000000010a5eacc5 lookUpImpOrForward + 176

12 libobjc.A.dylib 0x000000010a5f98bb objc_msgSend + 187

13 WordBankEasyiOS 0x0000000100bbe0ff GADCategories_DFPBannerView_CustomRenderedAd + 18074

14 WordBankEasyiOS 0x0000000100bbe382 GADCategories_DFPBannerView_CustomRenderedAd + 18717

15 WordBankEasyiOS 0x0000000100bbe527 GADCategories_DFPBannerView_CustomRenderedAd + 19138

16 ??? 0x000000011d368a0e 0x0 + 4785080846

17 ??? 0x000000011d36843b 0x0 + 4785079355

18 ??? 0x000000011d364d88 0x0 + 4785065352

19 ??? 0x000000011c51bbd6 0x0 + 4770085846

20 ??? 0x000000011c51b138 0x0 + 4770083128

21 ??? 0x000000011c51b138 0x0 + 4770083128

22 ??? 0x000000011c51b138 0x0 + 4770083128

Don't worry! I received the same error and I spend a lot of time to understand and fix it. There is a workaround that seems working fine.

In your iOS project, open AppDelegate.cs and add this code:

/// <summary>
/// Gets the window.
/// </summary>
/// <returns>UIWindow.</returns>
[Export("window")]
public UIWindow GetWindow() {
   return UIApplication.SharedApplication.Windows[0];
}

A complete example of this class is:

using System;
using System.Collections.Generic;
using System.Linq;

using Foundation;
using ImageCircle.Forms.Plugin.iOS;
using UIKit;

namespace WordBankEasy.iOS {
    // The UIApplicationDelegate for the application. This class is responsible for launching the 
    // User Interface of the application, as well as listening (and optionally responding) to 
    // application events from iOS.
    [Register("AppDelegate")]
    public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate {
        //
        // This method is invoked when the application has loaded and is ready to run. In this 
        // method you should instantiate the window, load the UI into it and then make the window
        // visible.
        //
        // You have 17 seconds to return from this method, or iOS will terminate your application.
        //
        public override bool FinishedLaunching(UIApplication app, NSDictionary options) {
            global::Xamarin.Forms.Forms.Init();

            ImageCircleRenderer.Init();

            LoadApplication(new App());

            return base.FinishedLaunching(app, options);
        }

        /// <summary>
        /// Gets the window.
        /// </summary>
        /// <returns>UIWindow.</returns>
        [Export("window")]
        public UIWindow GetWindow() {
            return UIApplication.SharedApplication.Windows[0];
        }
    }
}

After that you can start you app and see you advertising without problem. For now :)

Happy coding!

Davos: Smart machines set to transform society

FT-Davos-Microsoft

Artificial intelligence will spur economic growth and create new wealth. Machines that “think” like humans will help solve huge problems, from curing cancer to climate change. Yet millions of human workers will need to retrain, as robots make their existing jobs redundant.

These are the contrasting messages provided by the world’s leading technologists during the World Economic Forum in Davos this week, as political and business leaders ponder how best to respond to the rise of smart machines.

Sebastian Thrun, the inventor of Google’s self-driving cars and an honorary professor at Delft University of Technology, told the Financial Times that “almost every established industry is not moving fast enough” to adapt their businesses to this change.

He suggested self-driving cars would make millions of taxi drivers redundant and planes running solely on autopilot would remove the need for thousands of human pilots.

One of the central themes of this year’s conference is the “Fourth Industrial Revolution,” referring to how technological breakthroughs are expected to transform industries across the world. Delegates argued that advances in robotics and artificial intelligence will have the transformative effect that steam power, electricity and ubiquitous computing achieved in previous centuries.

“[Artificially-intelligent machines] can look at a brainscan better than most radiologists, but they can also weld better than any human,” said Illah Nourbakhsh, a professor of robotics at Carnegie Mellon University, the institution which has a partnership with Uber to build driverless cars. “It’s affecting white-collar and blue-collar jobs. Nobody is inherently safe.”

But Mr Thrun was optimistic that redundant roles will quickly be replaced.

“With the advent of new technologies, we’ve always created new jobs,” he said. “I don’t know what these jobs will be, but I’m confident we will find them”

Satya Nadella, chief executive of Microsoft, said: “This challenge of displacement is a real one, [but] I feel the right emphasis is on skills, rather than worrying too much about the jobs [which] will be lost. We will have to spend the money to educate our people, not just children but also people mid-career so they can find new jobs.”

How to Track Downloads & Outbound Links in Google Analytics

Since Google Analytics does not track file downloads, email, telephone or other outbound link clicks automatically, we saw an opportunity to provide this code to the community.

Dynamically Track Downloads & Other External Links

For those who have a lot of links and would like to dynamically detect clicks on links to file downloads, we have provided updated code below.  As before, this code requires the jQuery JavaScript library to be set before the code.

We have updated the code to make it more manageable and easier to extend.  In addition, we are using the jQuery on() method for attaching the click event handler to links.  Since we are using the on() method you will need to use jQuery v1.7+.  If you are using an earlier version of jQuery the .live() method can be used instead.

The primary benefit of using the on() method is performance.  Instead of looping through all ‘a’ elements on a page after the page loads (takes processing power on pages with lots of links), we instead listen for any clicks on the ‘a’ elements and invoke our custom JavaScript on the fly.

Again, feel free to customize this code to suite your needs.  It can be placed in its own .js file and should be placed in the <head> of your pages.  This script automates the following:

  • Tracks file downloads as events for the following extensions: .zip, .exe, dmg, .pdf, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .mp3, .txt, rar, wma, mov, avi, wmv, flv, wav (again feel free to modify the list)
  • Tracks outbound clicks as events if the href value contains http:// or https:// and the domain value doesn’t match the current domain
  • Tracks mailto email clicks
  • Tracks Tel telephone clicks
<script type="text/javascript">
if (typeof jQuery != 'undefined') {
  jQuery(document).ready(function($) {
    var filetypes = /\.(zip|exe|dmg|pdf|doc.*|xls.*|ppt.*|mp3|txt|rar|wma|mov|avi|wmv|flv|wav)$/i;
    var baseHref = '';
    if (jQuery('base').attr('href') != undefined) baseHref = jQuery('base').attr('href');

    jQuery('a').on('click', function(event) {
      var el = jQuery(this);
      var track = true;
      var href = (typeof(el.attr('href')) != 'undefined' ) ? el.attr('href') :"";
      var isThisDomain = href.match(document.domain.split('.').reverse()[1] + '.' + document.domain.split('.').reverse()[0]);
      if (!href.match(/^javascript:/i)) {
    	var elEv = []; elEv.value=0, elEv.non_i=false;
        if (href.match(/^mailto\:/i)) {
          elEv.category = "email";
          elEv.action = "click";
          elEv.label = href.replace(/^mailto\:/i, '');
          elEv.loc = href;
        }
        else if (href.match(filetypes)) {
          var extension = (/[.]/.exec(href)) ? /[^.]+$/.exec(href) : undefined;
          elEv.category = "download";
          elEv.action = "click-" + extension[0];
          elEv.label = href.replace(/ /g,"-");
          elEv.loc = baseHref + href;
        }
        else if (href.match(/^https?\:/i) && !isThisDomain) {
          elEv.category = "external";
          elEv.action = "click";
          elEv.label = href.replace(/^https?\:\/\//i, '');
          elEv.non_i = true;
          elEv.loc = href;
        }
        else if (href.match(/^tel\:/i)) {
          elEv.category = "telephone";
          elEv.action = "click";
          elEv.label = href.replace(/^tel\:/i, '');
          elEv.loc = href;
        }
        else track = false;

       	if (track) {
          _gaq.push(['_trackEvent', elEv.category.toLowerCase(), elEv.action.toLowerCase(), elEv.label.toLowerCase(), elEv.value, elEv.non_i]);
          if ( el.attr('target') == undefined || el.attr('target').toLowerCase() != '_blank') {
            setTimeout(function() { location.href = elEv.loc; }, 400);
            return false;
	  }
	}
      }
    });
  });
}
</script>

The script sets download, email and tel link clicks as interaction events while the external site clicks are non-interaction which can be adjusted if desired.

As before, the script will detect if the link is opening in a new window or not and automatically uses setTimeout() for 400ms if you are not. This is to allow time for the hit request to process before taking the user to the new page.

Inline Download & Other External Links Tracking

If you’d rather not use the above method to place a single javascript file on your site and automate the tracking for all link elements, you can use the manual inline approach by tagging each link element individually.  The inline approach can be time consuming and is not scalable.

The original syntax for adding the code inline remains the same.

New window/tab
For links that open a new window or tab (such as using target=”_blank” for example) you will want to use the code below:

<a onclick="_gaq.push(['_trackEvent','Download','PDF','Description']);" 
   href="my-file.pdf" target="_blank">
   Download my file
</a>

In current window
For links that open within the same window, replacing the current page, you will want to use the code below:

<a onclick="var that=this;_gaq.push(['_trackEvent','Download','PDF',this.href]);
   setTimeout(function(){location.href=that.href;},400);
   return false;" 
   href="my-file.pdf">
   Download my file
</a>

These type of links require a slight delay to allow time for the hit request to process before taking the user to the new page.

Detailed Download & External Link Reports

After all of your hard work you will have event tracking reports with neatly organized data around file downloads, external link, email link, and telephone link clicks.  From these reports you can gauge the usage and usefulness of your file downloads and various links.

events_report1

 

By diving into the download category and selecting event label as the primary dimension you are able to see a report on all of the individual files downloaded from your site.

events_downloads

 

Lastly, since events are associated with the page they were fired on, you are able to apply a secondary dimension of page to find out which page contained the download or external link click that occurred.

Apple creates 'Move to iOS' app to pull Android users away from Google

Cook Connects

The iPhone 6 has been more successful than previous versions of the smartphone at drawing Android users away from Google’s mobile platform, and Apple wants to capitalize on that with a new app that makes it easier for them to make the switch.

The switching process will also suggest that they install free apps from their Android device that are also available on Apple’s App Store, so switchers can quickly get back on their feet with their favorite apps like Facebook and Twitter. Paid apps that they have on Android with iOS versions available will be added to a user’s wish list in the iOS App Store.

According to Apple, the whole process will be handled “securely” so that a user’s personal information doesn’t get exposed. It’s not clear exactly how the process works yet, and how aggressive Apple will be when it comes to migrating users away from Google’s services. For example, it’s possible that the process will move all of the contacts a user has stored with Google over to iCloud—Apple hasn’t said one way or another.

Once the process is done, the Android app will helpfully prompt users to recycle their Android phone, just to keep them from going back to Google’s mobile platform unless they buy a new phone.

The app wasn’t announced on stage Monday morning during Apple’s Worldwide Developers Conference keynote, but it appeared on the promotional page the company created to show off its new mobile operating system ahead of its launch later this year.

Apple CEO Tim Cook told analysts during the company’s January financial results conference call that the current iPhone lineup “experienced the highest Android switcher rate in any of the last three launches in any of the three previous years.” This app should help accelerate that trend by making it even easier for people to switch over.

Amazon sfida Google con la pubblicità su eBook e Kindle



Una delle caratteristiche di Amazon è certamente, sin dalle sue origini, la ricerca costante del cambiamento, ma soprattutto della customer experience perfetta. Negli ultimi anni, l’azienda di Jeff Bezos strizza anche l’occhio al mondo dell’ advertising.

Con Amazon Media Group, il network interno espressamente dedicato alla pubblicità online ed avviato da quasi una decade, l’azienda di Seattle ambisce a fornire servizi innovativi dedicati alle grandi aziende alla ricerca di engagement e visibilità per il proprio brand. Già negli anni precedenti, l’azienda di Bezos ha testato nuove strategie pubblicitarie, avvalendosi delle proprie piattaforme online e dei propri device mobile. In particolare, nel 2011 Amazon ha adattato la logica del product placement ai suoi dispositivi di lettura: acquistando un “Kindle with Special Offers” ad un prezzo ribassato (di circa 25$), l’utente, infatti, consentiva alla visualizzazione di brevi annunci sponsorizzati tra i propri contenuti digitali.

Recentemente, però, Amazon sembra decisa a conquistare una fetta di mercato più ampia nell’advertising online, mettendosi in gioco con competitors d’eccellenza, come Google. Obiettivo? La risposta è nella quintessenza di Amazon: un’esperienza migliore e più efficiente per il consumatore digitale.

Tra le aziende che, in collaborazione con Amazon Media Group, sono alla ricerca di campagne di promozione digitale innovativa, si propone Land Rover. La casa automobilistica inglese ha testato l’efficacia di un “ebook brandizzato” realizzato e distribuito sulla piattaforma Kindle. Il riscontro dei lettori è stato positivo, così come ha dichiarato con soddisfazione Seth Dallaire, Vice Presidente di Amazon Media Group. L’engagement degli utenti è stato stimolato grazie alla modalità di promozione, l’ebook infatti “non è stato promosso in qualità di prodotto pubblicitario, piuttosto come contenuto”. L’esperienza di un ebook sponsorizzato, insomma, sembra aver ribadito la supremazia del contenuto anche nelle strategie pubblicitarie online. Ancora una volta, content is king!

In Giappone, invece, la crescita nel mondo adv di Amazon sembra essere dettata dall’ “ebook brochure”. La recente campagna realizzata per la promozione dei nuovi modelli della casa automobilistica Nissan, infatti, ha dimostrato quanto questo nuovo strumento digitale – già ampiamente consolidato nel mercato giapponese – possa diventare indispensabile per tutte le case automobilistiche (e non solo). La collaborazione tra Amazon e l’azienda giapponese mira a comprendere quanto strumenti digitali, come l’ebook formato brochure, possano potenzialmente fornire un riscontro, ad esempio, sul numero di visitatori delle concessionarie auto o sui dati di vendita di nuovi veicoli. Amazon riflette, inoltre, sulla possibilità di esportare l’utilizzo di questo nuovo formato anche in mercati stranieri.

Amazon Media Group, insomma, sembra decisa ad incrementare la propria rete di aziende partner, offrendo visibilità su tablet, ereader e sulle proprie pagine web, volgendo lo sguardo ad un nuovo modo di raccontare il brand, promuoverlo e renderlo riconoscibile.

Apple sides with Microsoft in closely watched patent dispute with Google

Apple sides with Microsoft in closely watched patent dispute with Google

Lawyers for Microsoft and Google will appear Wednesday morning at the 9th Circuit Court of Appeals in San Francisco in a long-running dispute over patents that were originally owned by cell phone maker Motorola Mobility.

The case involved the implementation of wireless and video standards in products including Microsoft's Xbox 360.

But this is no ordinary patent showdown. Other tech companies are watching the case closely for its potential to set a precedent for negotiations over “standard-essential patents” or “SEPs” — technologies required to implement industry standards.

The case has already created some unusual alliances. Apple (PDF) and T-Mobile (PDF) are among the companies siding with Microsoft in the case, while Nokia (PDF) and Qualcomm (PDF) are seeking to overturn a lower court’s ruling that found in Microsoft’s favor.

After a 2013 trial in Seattle, Microsoft won a $14.5 million jury verdict against Motorola based on a finding that Motorola breached its obligation to offer its standard-essential patents for video and wireless technologies on fair, reasonable and non-discriminatory terms, known in legal circles as “RAND” or “FRAND.”

The case is notable in part because U.S. District Judge James Robart in Seattle took the unusual step of setting a process for establishing royalties for standard essential patents.

Based on his process, Robart ruled in April 2013 that the Microsoft owed less than $1.8 million a year for its use of Motorola’s patented video and wireless technologies in Windows, Xbox and other products. Motorola had originally sought a rate amounting to more than $4 billion a year, plus $20 billion in back payments.

In its brief leading up to this week’s appeals court hearing, Apple said that the judge made the correct decision — preventing owners of standard essential patents from “holding up” other companies that want to implement standards.

“By focusing on the FRAND commitment’s bedrock concern — confining SEP holders to the value of their technology, as distinguished from the value conferred by inclusion in the standard — Judge Robart properly held Motorola to its agreement,” wrote Apple’s lawyers. “Courts must continue to apply this principle to eliminate hold-up in all forms.”

However, Qualcomm argued in its brief that Robart overreached and came up with a process that did not adequately compensate Motorola for its patents. The chip maker said “the manifest errors” in the decision “will cause incalculable damage to innovation incentives and standards going forward” if it becomes a precedent.

Google, which acquired Motorola before selling the cell phone company to Lenovo, remains the owner of the patents in dispute in the case.

Digital Wars

Digital WarsE' il 1998 e il mondo digitale sta prendendo forma. In questo panorama in evoluzione si affermano tre aziende: Apple, Google e Microsoft.

Erano aziende profondamente diverse tra loro e le attendeva una serie di aspre battaglie per il controllo del mercato: la tecnologia di ricerca, i lettori musicali portatili, gli smartphone e i tablet.

Non potevano sapere quale sarebbe stata la prossima guerra: ma era un conflitto che avrebbe trasformato il mondo. Per sempre.

Dalla fine degli anni Novanta fino alla morte di Steve Jobs, Digital Wars ripercorre ciascuna di queste battaglie e analizza le diverse culture aziendali dei tre colossi, decretando chi di loro ha trionfato su ciascun fronte.

La posta in gioco è altissima, perché al vincitore spetta non solo una ricchezza smisurata, ma anche la possibilità di dominare un'area del panorama digitale, scalzare i rivali e plasmare il nostro futuro.

Installare le Google Apps sul tuo Kindle Fire senza privilegi di root

Il Kindle Fire ha come sistema operativo una versione customizzata di Amazon di Android. Proprio perché c'è Android è possibile installare tutte le applicazioni scaricabili da Google Play. Per poter installare l'applicazione Google Play è necessario ottenere i rpivilegi di root sul Kindle Fire. Tuttavia per installare delle apps non è necessario. Ecco come fare.

1. Abilita Unknown Sources

Per prima cosa è necessario abilitare l'installazione di applicazioni non provenienti dall'App Store di Amazon. Per fare questo è necessario andare dal menu principale su Device e quindi abilitare l'opzione "Allow Installation of Applications" premendo il pulsante On.

Menu Device Kindle Fire


2. Scarica ed installa il file GoogleServicesFramework.apk

Puoi scaricarlo da qui GoogleServicesFramework.apk (2,14 mb)

3. Riavvia il tuo Kindle Fire

4. Scarica ed installa Google Books

Per esempio se vuoi scaricare l'applicazione di Google per leggere libri (se il Kindle non ti è sufficiente) oppure cercare attraverso Google stesso l'applicazione che ti interessa scaricare.

5. Aggiungi il tuo account Google

Apri l'applicazione. Spostati sul menu Accounts e quindi seleziona l'opzione "Add Account" ed inserisci i tuoi dati. Puoi anche definire se vuoi ricevere aggiornamenti tramite popup o notifiche sull'account Google.

6. Installa Gmail e configurare la sincronizzazione

Puoi scaricare Gmail.apk ed installarlo. Dopo l'installazione puoi aprire l'applicativo e non troverai alcun account configurato. Clicca sul menu e quindi seleziona Account. Troverei l'account inserito in precedenza e quindi clicca su di esso per iniziare la sincronizzazione. In automatico verrà sincornizzato il tuo account ogni volta che aprirai l'applicazione Gmail.

7. Installa tutte le applicazioni che vuoi

Questa procedure la puoi eseguire tutte le volte che è necessario per l'installazione di altre applicazioni Google.

Attenzione: l'installazione dell'applicazione dell'Android Market richiede i privilegi di root. Questo metodo non è valido per l'installazione di tale applicativo. Con i privilegi di root comunque è possibile copiare il file vending.apk nella cartella /system/app e quindi riavviare.

Advertsing

125X125_06

Planet Xamarin

Planet Xamarin

Calendar

<<  July 2017  >>
MonTueWedThuFriSatSun
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

View posts in large calendar

Month List