sobota, 10 marca 2012

Czarny koń z Redmond

System Windows do 2015 r. zdobędzie 20% rynku smartfonów i ponad 10% tabletów -- prognozują analitycy z firm Gartner i IDC. Czarnym koniem w branży ma być nowa platforma Microsoftu. Windows 8 zmieni oblicze branży IT powiedział ,,Rz'' pan z MSC.

System MS w ciągu roku znajdzie się w pierwszej trójce[...] dodaje w rozmowie z ,,Rz'' pan z firmy sprzedającej oprogramowanie antywirusowe (czyli produkt komplementarny).

Dziś zaś w Rzeczpospolitej (,,Rz'') felieton też na ten temat. Równie merytoryczny i kończący się bezsensownym (z punktu widzenia teorii ekonomicznych i stanu faktycznego) apelem: Wypada kibicować Microsoftowi, bo choć ciąży na nim odium monopolisty na rynku oprogramowania dla komputerów osobistych, to jednak daje on szansę na przełamanie dominacji Google'a i Apple'a na rynku oprogramowania dla smartfonów i tabletów.

Zapewne dalszego tego typu dzieła w druku...

Wygląda to wszystko na teksty ordynarnie sponsorowane przez MSC (aka MałoMiękkiego). Będzie świetnie zapewniają ludzie z MSC albo firmy zależne (sprzedawca antywirusów). A będzie tak jak z Bingiem -- gównianą wyszukiwarką, którą MSC usiłował dogonić Google'a, tyle że jedyną strategią był marketing jaka to ona jest wyjątkowa.

BTW: Decydujący (bo jedyny) argument Windows 8 będzie wyglądał tak samo na PC i smartfonie więc użytkownicy zapewne chętniej....itd. No na pewno: rower, samochód i samolot powinien być obsługiwany identycznie. Taki dajmy na to kpt. Wrona z pewnością wolałby baranią kierownicę a'la Eddy Merckx albo odwrotnie Cancellara o niczym nie marzy tylko o autopilocie i wolancie.

No dobra pośmialiśmy się a teraz czemu kibicowanie MSC jest bezsensowne?

Tak jak wyżej wspomniano można to wiarygodnie objaśnić na gruncie elementarnych teorii ekonomicznych. Przyjrzyjmy się poniższemu diagramowi:

Commodity stack
Komodyzacja IT a strategia rynkowa wybranych producentów oprogramowania

Upraszczając w branży IT można zarabiać na sprzedaży sprzętu, oprogramowania infrastrukturalnego, oprogramowania middleware, aplikacji oraz usług. Google sprzedaje tylko usługi, resztę traktuje jako półprodukt, którego koszt winien być możliwie najniższy (warstwa utowarowiona na wykresie). MSC praktycznie nie sprzedaje usług: 100% przychodów firmy to sprzedaż systemu operacyjnego i oprogramowania biurowego. Samo kibicowanie nic nie da jeżeli życie delikwenta zależy od tego ile sprzeda kopii czegoś co tak w ogóle jest warte zero (linux/android).

Tu są szersze wyjaśnienia, ale w języku. O tym samym pisze Nicholas G. Carr w artykule IT Doesn't Matter. Jest to dużo bardziej znany tekst, bo opublikowany w Harvard Business Review, ale jednocześnie dzięki temu niedostępny bezpłatnie (można oczywiście zaleźć via Google, ale to będzie illegal kopia).

środa, 7 marca 2012

Import KML files to GoogleMaps

The nuisance of GoogleMaps is that it does not know GPX and only KML/GeoRSS files can be uploaded. Fortunately it is easy to convert GPX to KML with gpsbabel:


gpsbabel -i gpx -f file.gpx -x simplify,count=333 -o kml -F file.kml

If there are several files they have to be convert one-by-one and then upload to Google. It would be more comfortable to merge them first and upload it in one go rather than uploading each individually.

As I could not find how to merge serveral GPX files into one using gpsbabel (merge option in gpsbabel puts all track points from all tracks into a single track and sorts them by time stamp. Points with identical time stamps will be dropped) I worked out the following simple Perl script:


#!/usr/bin/perl
#
# Combine GPX files into one
# usage: gpxmerge file1 file2 file3 ....
#
use XML::DOM;
binmode(STDOUT, ":utf8");

my $parser = new XML::DOM::Parser;

for my $file2parse (@ARGV) {
my $doc = $parser->parsefile ($file2parse);

for my $w ( $doc->getElementsByTagName ("wpt") ) { $waypoints .= $w->toString() . "\n"; }
for my $r ( $doc->getElementsByTagName ("rte") ) { $routes .= $r->toString() . "\n"; }
for my $t ( $doc->getElementsByTagName ("trk") ) { $tracks .= $t->toString() . "\n"; }
}

print "<?xml version='1.0' encoding='UTF-8' ?>
<gpx version='1.1' creator='GPXmerger'
xmlns='http://www.topografix.com/GPX/1/1'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:schemaLocation='http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd'>\n
<author>tomasz przechlewski </author>
<email>tprzechlewski[at]acm.org</email>
<url>http://pinkaccordions.homelinux.org/Geo/gpx/</url>";

print "$waypoints\n$routes\n$tracks\n";

print "</gpx>\n";

The resulting file structure is as follows: first all waypoints, then all routes and finally all tracks. This is perfectly legal GPX file.

Now I convert GPX to KML using gpsbabel:


gpsbabel -i gpx -f file.gpx -x simplify,count=333 -o kml -F file.kml

Since gpsbabel generates pretty verbose KML files I simplify them using XSLT stylesheet (perhaps this step is superfluous):


xsltproc -o simplified.kml kml2kml.xsl file.kml

and the stylesheet looks like:



<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:kml="http://www.opengis.net/kml/2.2" >

<xsl:output method="xml" indent='yes' />

<xsl:template match="/">

<!-- ;; http://www.jonmiles.co.uk/2007/07/using-xpaths-text-function/ ;; -->

<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2">
<Document>


<Folder>
<name>Waypoints</name>

<xsl:for-each select="//kml:Folder[kml:name/text()='Waypoints']/kml:Placemark//kml:Point">
<Placemark>
<!-- <name><xsl:value-of select='../kml:name'/></name> --><!-- niepotrzebne -->
<Point>
<coordinates>
<xsl:value-of select="kml:coordinates"/>
</coordinates>
</Point>
</Placemark>
</xsl:for-each>

</Folder>


<Folder>
<name>Tracks</name>

<xsl:for-each select="//kml:Placemark//kml:LineString">

<Placemark>
<name>Path</name>

<LineString>
<tessellate>1</tessellate>
<coordinates>

<xsl:value-of select="kml:coordinates"/>

</coordinates>
</LineString>
</Placemark>

</xsl:for-each>

</Folder>

</Document>
</kml>

</xsl:template>
</xsl:stylesheet>

Now KML file is ready to be imported to Google maps via Maps → My Places → Create map.

The result of example conversion can be be found here.

Konfigurowanie TeXlive

Pliki systemu TeXLive są umieszczone nie w jednym a w kilku katalogach. Listę tych katalogów otrzymamy wykonując polecenie:

kpsewhich -expand-var '$TEXMF'

Mówiąc bardziej precyzyjnie: $TEXMFMAIN to katalog główny (korzeń główny instalacji), którego zawartość nie powinna być modyfikowana w inny sposób niż poprzez tlmgr; $TEXMFLOCAL -- tu można instalować coś prywatnego, co będzie dostępne dla wszystkich użytkowników systemu (system-wide); $TEXMFHOME -- prywatne pliki użytkownika.

kpsewhich --expand-var '$TEXMFMAIN' # korzeń główny = to co dała fabryka
kpsewhich --expand-var '$TEXMFLOCAL' # korzeń lokalnych zmian dla całej instalacji 
kpsewhich --expand-var '$TEXMFHOME' # lokalne nastawy użytkownika

Kolejność wyszukiwania plików jest taka, że najpierw jest przeszukiwane drzewo katalogów o korzeniu $TEXMFHOME a potem $TEXMFLOCAL a na końcu $TEXMFMAIN.

System TeX konfiguruje się edytując plik texmf.cnf. Plik ten można odszukać w następujący sposób:

kpsewhich texmf.cnf

/usr/local/texlive/2011/texmf.cnf

Po zainstalowaniu czegokolwiek w $TEXMFHOME należy wykonać texhash $HOME/texmf.
Po modyfikacji zawartości $TEXMFLOCAL też
należy wykonać texhash (jako root).


wtorek, 6 marca 2012

Simple application of fontspec package

The document body font is Times New Roman-like. Sans serif font is Helvetica-like. Both regular and condensed variant of sans serif is used. With fontspec package it can be obtained with:


\RequirePackage{ifxetex} %%
\ifxetex %% xetex
\RequirePackage{fontspec}
\usepackage{polyglossia} \setdefaultlanguage{polish}
\setmainfont{TeX Gyre Termes}
\setsansfont{TeX Gyre Heros}
\defaultfontfeatures{Mapping=tex-text}
\newfontfamily\PM@SansCondensed{TeX Gyre Heros Cn} %%
\usepackage{xunicode,xltxtra}
\else %% conventional TeX
\RequirePackage{tgtermes,txfonts,qtxmath} %% txfonts
\def\PM@SansCondensed{\fontfamily{qhvc}}
\fi

With the help of \ifxetex command from ifxetex package the code above works when compiled both with xetex as well as conventional pdflatex.

The example below illustrates how \PM@SectionFont can be used to switch to condensed variant of sans serif:


\renewcommand{\section}{\@startsection{section}{1}{\z@}%
{-3.5ex \@plus -1ex \@minus -.2ex}%
{2.3ex \@plus.2ex}%
{\reset@font
\PM@SectionFont
\raggedright}}

Finally, a few words how to configure system (a Linux one, BTW strictly speaking MS Windows is not a system) to work with OpenType fonts.

Providing the TeX Gyre fonts package is installed (with tlmgr in case of TeXLive for example) all .otf files are located in ~/2011/texmf-dist/fonts/opentype/public/tex-gyre (where ~ denotes the root of TeXlive distribution).

To add all TeX Gyre fonts to system resources it suffice to create /etc/fonts/local.conf with the following content:


<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<!-- /etc/fonts/local.conf file for local customizations -->
<fontconfig>
<!-- Font directory list -->

<dir>/usr/local/texlive/2011/texmf-dist/fonts/opentype/public/tex-gyre</dir>

</fontconfig>

Or similar, if root of TeXlive distribution is not /usr/local/.

Now run as root


fc-cache

Check if everything is OK:


fc-list | grep -i Heros

Information on TeX Gyre Heros should be displayed on screen:


TeX Gyre Heros Cn:style=Bold
TeX Gyre Heros Cn:style=Bold Italic
TeX Gyre Heros:style=Regular
TeX Gyre Heros Cn:style=Regular
TeX Gyre Heros:style=Bold Italic
TeX Gyre Heros:style=Italic
TeX Gyre Heros Cn:style=Italic
TeX Gyre Heros:style=Bold