<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Online Revenue</title>
	<atom:link href="http://revenue.tm/feed/" rel="self" type="application/rss+xml" />
	<link>http://revenue.tm</link>
	<description>Tuottavat verkkopalvelut</description>
	<lastBuildDate>Wed, 15 Feb 2012 13:07:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Angry Birds -heijastinsivusto</title>
		<link>http://revenue.tm/blog/angry-birds-heijastinsivusto/</link>
		<comments>http://revenue.tm/blog/angry-birds-heijastinsivusto/#comments</comments>
		<pubDate>Wed, 15 Feb 2012 12:37:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uutiset]]></category>

		<guid isPermaLink="false">http://revenue.tm/?p=415</guid>
		<description><![CDATA[Toteutimme maailman tunnetuimmalle heijastinvalmistajalle, Coreplast Laitila Oy:lle, heijastinsivuston yhteistyössä Rovion kanssa. Sivuston avulla Coreplast tavoittelee erityisesti uusia ulkomaalaisia tukkureita ja jälleenmyyjiä, mutta myös kuluttajille on oma osionsa. Coreplast on tunnettu erityisesti huippulaadukkaista Coreflect- ja Talmu-heijastimista. Lue lisää osoitteessa www.retailreflector.com. Sivustolle &#8230;15.02.2012 <a href="http://revenue.tm/blog/angry-birds-heijastinsivusto/" class="more">Lue lisää</a>]]></description>
			<content:encoded><![CDATA[<p>Toteutimme maailman tunnetuimmalle heijastinvalmistajalle, Coreplast Laitila Oy:lle, heijastinsivuston yhteistyössä Rovion kanssa.</p>
<p>Sivuston avulla Coreplast tavoittelee erityisesti uusia ulkomaalaisia tukkureita ja jälleenmyyjiä, mutta myös kuluttajille on oma osionsa.</p>
<p>Coreplast on tunnettu erityisesti huippulaadukkaista Coreflect- ja Talmu-heijastimista. Lue lisää osoitteessa <a title="Retail Reflector" href="http://www.retailreflector.com" target="_blank">www.retailreflector.com</a>.</p>
<p><span id="more-415"></span>Sivustolle tullaan tuottamaan vielä Angry Birds -heijastinanimaatio, verkkokauppa, sekä käännökset venäjäksi ja ruotsiksi.</p>
<p>Suomessa Rovion kanssa yhteistyötä ovat tehneet aikaisemmin Finnair ja Fazer, joten pääsimme hyvään seuraan.</p>
<h2 style="text-align: left;" align="center">Angry Birds –heijastimista turvaa jalankulkijoille</h2>
<p>Angry Birds heijastimet loistavat katukuvassa ensi syksynä. Heijastinvalmistaja Coreplast Laitila Oy ja Rovio Entertainment Oy solmivat lisenssisopimuksen, joka yhdistää kaksi tunnettua suomalaista innovaatiota. Vihaiset linnut välähtelevät syyspimeässä turvaten jalankulkijat ja varsinkin koulunsa vasta aloittaneet keltanokat.  Yhteistyön tavoitteena on nostaa tietoisuutta heijastimista jalankulun liikenneturvallisuuden parantajina. vähittäiskaupan ja Euroopan jälleenmyyjien kiinnostusta heijastimista. Suomessa tuotteita jakelee mm Tammer-Tukku Oy ja Toy-Pap Oy.</p>
<p>”Rovio haluaa ilahduttaa ja turvata faninsa nykyaikaisilla, viihdyttävillä Angry Birds -heijastimilla. Angry Birds -heijastimet ovat paitsi hauskan näköisiä, myös äärimmäisen tehokkaita. Ne suojelevat fanejaan Angry Birdseille luontaisella suojeluinnokkuudella.  Valitsemme lisenssituotevalmistajamme korkeilla laatukriteereillä”, kertoo Rovion lisenssi ja tuotemyynnistä vastaava Harri Koponen.</p>
<p>”Olemme tyytyväisiä yhteistyöstä ja tuotteista jotka avaavat uusia ovia Euroopan vähittäismarkkinoilla. Heijastin on vielä suhteellisen tuntematon turvallisuustuote Pohjoismaiden ulkopuolella, joten yhteistyö huippusuositun Angry Birds -brandin kanssa takaa kiinnostuksen jälleenmyyjien parissa. Tilauksia on jo tullut, vaikka tuotetta ei ole julkistettu”, sanoo Mikko Koivisto, Coreplast Laitila Oy:n toimitusjohtaja.</p>
<p><strong>Yhteistyön kautta heijastin tutuksi</strong></p>
<p>Euroopassa heijastimien vaikutus liikenneturvallisuuteen ei ole selviö.  Angry Birds -brändättyjen heijastimien avulla tavoite on kiinnittää kuluttajan huomio uuteen turvallisuustuotteeseen. Myymälässä lattiatelineen yhteydessä pyörii havainnollistava video siitä, kuinka tuote toimii pimeällä. <strong></strong></p>
<p>Coreplast tukee Maailman Terveysjärjestön (WHO) globaalia Decade of Action for Road safety 2011-2020 –kampanjaa, joka vetoaa kaikkien maiden hallituksiin liikenneonnettomuuksien vähentämiseksi. Suomessa heijastin yleistyi 1970-luvulla ja tämä näkyy jalankulkijaonnettomuuksien määrän laskuna.</p>
<p>Lisätietoja:<br />
Mikko Koivisto, toimitusjohtaja, Coreplast Laitila Oy, +358 50 5301714, <a href="mailto:mikko.koivisto@coreplast.fi">mikko.koivisto@coreplast.fi</a>, www,coreplast.fi,<br />
Rovio Entertainment Oy,  <a href="mailto:media@rovio.com">media@rovio.com</a></p>
<p><strong>Coreplast Laitila Oy</strong> on maailman johtavia muoviteollisuuden sopimusvalmistajia. Visuaalisia ja mittatarkkoja muovituoteratkaisuja tehdään mm. sähkö-, elektroniikka-, kodinkone-, ympäristö- ja huonekaluteollisuudelle. Lisäksi valmistamme turvallisia COREFLECT heijastimia.  Tuotannostamme yli 40 % päätyy vientiin eri maanosiin, kaikkiaan 35 maahan. Vuonna 2010 liikevaihtomme oli 13 milj. euroa ja henkilökuntamme määrä noin 80.</p>
<p><strong>Rovio Entertainment  Oy</strong> on viihde- ja mediayhtiö maailmalla menestyneen Angry Birds -brändin takana. Vuonna 2009 Rovio julkaisi Angry Birds -pelin ja sen hahmoista tuli maailmanlaajuinen ilmiö. Angry Birds -pelit ovat nauttineet kasvavasta suosiosta kaikkialla maailmassa, ja ilmiö on laajentunut yhä uusille liiketoiminta-alueille. Rovio laajentaa toimintaansa animaatioiden, oheistuotteiden, julkaisu- ja kustannustoiminnan, sekä erilaisten palvelujen saralla. Rovion pääkonttori sijaitsee Espoossa.<a title="Rovio" href="http://www.rovio.com/" target="_blank"> www.rovio.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://revenue.tm/blog/angry-birds-heijastinsivusto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Hash table -haavoittuvuus</title>
		<link>http://revenue.tm/blog/php-hash-table-haavoittuvuus/</link>
		<comments>http://revenue.tm/blog/php-hash-table-haavoittuvuus/#comments</comments>
		<pubDate>Thu, 29 Dec 2011 15:19:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tekniikka]]></category>

		<guid isPermaLink="false">http://revenue.tm/?p=360</guid>
		<description><![CDATA[Lukuisista eri kielistä on löydetty hajautustauluhaavoittuvuus. Haavoittuvuuden avulla nettipalvelimen voi kaataa jopa yksittäisen koneen avulla. Haavoittuvuus perustuu siihen, että esim. PHP:n moottori käsittelee lähetetyn pyynnön hajautustaulujen avulla. Verkkopalvelut toimivat näiden pyyntöjen avulla. Esimerkiksi kun haet meidän sivustolta jotain, ilmestyy osoiteriville ?s=XXXX&#38;lang=fi, &#8230;29.12.2011 <a href="http://revenue.tm/blog/php-hash-table-haavoittuvuus/" class="more">Lue lisää</a>]]></description>
			<content:encoded><![CDATA[<p>Lukuisista eri kielistä on löydetty hajautustauluhaavoittuvuus. Haavoittuvuuden avulla nettipalvelimen voi kaataa jopa yksittäisen koneen avulla.</p>
<p>Haavoittuvuus perustuu siihen, että esim. PHP:n moottori käsittelee lähetetyn pyynnön hajautustaulujen avulla. Verkkopalvelut toimivat näiden pyyntöjen avulla. Esimerkiksi kun haet meidän sivustolta jotain, ilmestyy osoiteriville ?s=XXXX&amp;lang=fi, jossa &#8220;s&#8221; on avain ja &#8220;XXXX&#8221; arvo. Koodissa sitten katsotaan, että löytyykö &#8220;s&#8221;-avainta ja jos löytyy niin tehdään haku sen arvolla (&#8220;XXXX&#8221;).</p>
<p><span id="more-360"></span></p>
<p>Kun lähetetyt avaimet ovat ei-numeerisena, antaa PHP 5 avaimille osoitteen hajautustaulusta DJBX33A-funktion avulla. Funktio voi antaa saman osoitteen eri avaimille. Saman tuloksen saa esimerkiksi tt ja uU. Mitä useampi avain on samassa osoitteessa, sitä kauemmin kestää prosessointi. Tauluun syöttö vie resursseja n^2, jossa n on samassa osoitteessa olevien avainten määrä.</p>
<p>Kun saman hash-arvon omaavia avaimia syötetään tuhansia, kestää prosessoinnissa jopa minuutteja. Yhdessä kyselyssä näitä pareja voi olla äärettömästi POST-pyynnössä, ellei palvelinohjelmistossa ole toisin määritelty. Kun pyyntöjä tehdään lukuisia palvelimelle samaan aikaan, käyttää palvelin niihin kaikki tehonsa, eikä pysty enää tarjoilemaan sivuja.</p>
<p>Näitä kyselyitä voi tehdä myös JavaScriptin avulla. Eli mikäli suosittuun verkkopalveluun pääsee tietoturva-aukon kautta syöttämään hyökkäyskoodia, ajaa jokainen palvelun käyttäjä automaattisesti kyseisen koodin, joka on kohdistettu kaatamaan haluttu palvelin.</p>
<p>Voit varmistaa oman palvelimesi turvallisuuden esimerkiksi <a href="https://github.com/koto/blog-kotowicz-net-examples/tree/master/hashcollision">https://github.com/koto/blog-kotowicz-net-examples/tree/master/hashcollision</a> -osoitteesta löytyvien skriptejen avulla. Tuotantopalvelinten kanssa kannattaa yllättäen olla varovainen tätä testaillessa.</p>
<h3>Suojautuminen</h3>
<p><strong><a href="http://www.hardened-php.net/suhosin/" target="_blank">Suhosin</a></strong>: En nää mitään syytä jättää Suhosinia asentamatta, meidän palvelimilla se on ollut aina. Suhosin suojaa lukuisilta haavoittuvuuksilta, myös tältä. Suhosin rajaa automaattisesti pyynnön muuttujien määrät (oletuksena tuhanteen).</p>
<p><strong>post_max_size</strong>: Kuinka monen tavun kyselyt palvelin hyväksyy. Mikäli sivusto ei vastaanota tiedostoja tai muuta suurta dataa, kannattaa tämä asettaa mahdollisimman pieneksi.</p>
<p><strong>max_input_time</strong>: Kuinka kauan PHP saa prosessoida lähetettyä dataa.</p>
<p><strong>max_input_vars</strong>: Kuinka monta avain-arvo-paria PHP sallii lähetettävän. (PHP versiot 5.3.9 ja eteenpäin)</p>
<p><strong><a title="ModSecurity" href="http://www.modsecurity.org/projects/modsecurity/apache/" target="_blank">ModSecurity</a>: </strong>Hyvä ylipäätänsä olla käytössä. Noudata varovaisuutta, ettei ohjelmisto estä myös normaaleja pyyntöjä, kuten HTML/Word-syötteitä.</p>
<h3>Raportti</h3>
<p><a href="http://events.ccc.de/congress/2011/Fahrplan/attachments/2007_28C3_Effective_DoS_on_web_application_platforms.pdf">http://events.ccc.de/congress/2011/Fahrplan/attachments/2007_28C3_Effective_DoS_on_web_application_platforms.pdf</a></p>
]]></content:encoded>
			<wfw:commentRss>http://revenue.tm/blog/php-hash-table-haavoittuvuus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apostrophen kääntäminen helpommaksi</title>
		<link>http://revenue.tm/blog/apostrophen-kaantaminen-helpommaksi/</link>
		<comments>http://revenue.tm/blog/apostrophen-kaantaminen-helpommaksi/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 15:02:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tekniikka]]></category>

		<guid isPermaLink="false">http://revnew.sivuviesti.fi/?p=333</guid>
		<description><![CDATA[Apostrophe on mainio CMS, joka on rakennettu Symfonyn päälle. Se on kuitenkin vasta lapsen kengissä ja sitä kehitetään pääasiassa P&#8217;unk Avenuen johdolla heidän tarpeisiin. Tästä syystä esimerkiksi erilaiset kieliominaisuudet ja useamman kielen tuki on tullut hitaasti järjestelmään, vaikka allekirjoittanut on aktiivisesti patchejä submittaillutkin. Usean sivun &#8230;20.12.2011 <a href="http://revenue.tm/blog/apostrophen-kaantaminen-helpommaksi/" class="more">Lue lisää</a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://apostrophenow.org/" target="_blank">Apostrophe</a> on mainio CMS, joka on rakennettu <a href="http://www.symfony-project.org/" target="_blank">Symfonyn</a> päälle. Se on kuitenkin vasta lapsen kengissä ja sitä kehitetään pääasiassa <a href="http://punkave.com/" target="_blank">P&#8217;unk Avenuen</a> johdolla heidän tarpeisiin. Tästä syystä esimerkiksi erilaiset kieliominaisuudet ja useamman kielen tuki on tullut hitaasti järjestelmään, vaikka allekirjoittanut on aktiivisesti patchejä submittaillutkin.</p>
<p>Usean sivun kääntäminen on hankalaa, mikäli kääntäjät eivät pääse aloittamaan aina oletuskielen versiosta, eli esimerkiksi englannista. Tämä ei ole tällä hetkellä enää Apostrophessa mahdollista, koska uusien ominaisuuksien ja parantelujen myötä meidänkin oletuskielimuokkaukset lakkasivat toimimasta.</p>
<p><span id="more-333"></span></p>
<p>Tätä ongelmaa varten teimme napin, jota klikkaamalla sivuun kopioituu kaikki oletuskielen elementit. Nappia klikkaamalla kääntäjän on mahdollista kääntää oletussisältö halutulle kielelle yksi elementti kerrallaan. Ohessa tarvittava koodi:</p>
<pre>public static function copyPage($pid, $lang, $author_id)
{
	$q = Doctrine_Query::create()-&gt;from('aArea a')
	-&gt;where('a.page_id = ? AND culture = "en"', $pid)
	-&gt;execute();

	foreach($q as $r) {

			// Check that the old record doesn't exists
		$oldExists = Doctrine_Query::create()-&gt;from('aArea a')
		-&gt;where('a.page_id = ? AND culture = ? AND name = ?',
			array($pid, $lang, $r-&gt;getName()))
		-&gt;count();

			// If record is found skip to next element
		if($oldExists &gt; 0) {
			continue;
		}

			// Insert new aArea and aAreaVersion
		$aArea = new aArea();
		$aArea-&gt;page_id = $pid;
		$aArea-&gt;name = $r-&gt;getName();
		$aArea-&gt;culture = $lang;
		$aArea-&gt;latest_version = 1;
		$aArea-&gt;save();

		$aav = new aAreaVersion();
		$aav-&gt;area_id = $aArea-&gt;getId();
		$aav-&gt;version = 1;
		$aav-&gt;author_id = $author_id;
		$aav-&gt;diff = '';
		$aav-&gt;save();

			// Insert aSlot &amp; aAreaVersionSlot
		$asq = Doctrine_Query::create()-&gt;from('aAreaVersionSlot avs')
		-&gt;leftJoin('avs.AreaVersion av')
		-&gt;leftJoin('avs.Slot as')
		-&gt;where('av.area_id = ?', $r-&gt;getId())
		-&gt;having('av.version &gt;= ALL(SELECT version FROM a_area_version WHERE area_id = ?)', $r-&gt;getId())
		-&gt;execute();

		foreach($asq as $asqr) {
			$os = $asqr-&gt;getSlot();

			$slot = new aSlot();
			$slot-&gt;type = $os-&gt;getType();
			$slot-&gt;variant = $os-&gt;getVariant();
			$slot-&gt;value = $os-&gt;getValue();
			$slot-&gt;save();

			$avs = new aAreaVersionSlot();
			$avs-&gt;slot_id = $slot-&gt;getId();
			$avs-&gt;area_version_id = $aav-&gt;getId();
			$avs-&gt;permid = $asqr-&gt;getPermId();
			$avs-&gt;rank = $asqr-&gt;getRank();
			$avs-&gt;save();

		}
	}
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://revenue.tm/blog/apostrophen-kaantaminen-helpommaksi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony-saitin suojaus salasanalla</title>
		<link>http://revenue.tm/blog/symfony-saitin-suojaus-salasanalla/</link>
		<comments>http://revenue.tm/blog/symfony-saitin-suojaus-salasanalla/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 15:01:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tekniikka]]></category>

		<guid isPermaLink="false">http://revnew.sivuviesti.fi/?p=331</guid>
		<description><![CDATA[Mikäli käytät sfGuard- JA basic http authentication yhdistelmää esimerkiksi kehityssivustolla, jää Chrome ikuiseen looppiin kysymään salasanoja authentication-popupissa. Tähän on erittäin yksinkertainen syy. sfGuardin login-sivu palauttaa 401-statuksen, mikäli Symfonyyn ei olla kirjauduttu. Selain tulkitsee sen niin, ettei sivustolle olla kirjauduttu vielä &#8230;20.12.2011 <a href="http://revenue.tm/blog/symfony-saitin-suojaus-salasanalla/" class="more">Lue lisää</a>]]></description>
			<content:encoded><![CDATA[<p>Mikäli käytät sfGuard- JA basic http authentication yhdistelmää esimerkiksi kehityssivustolla, jää Chrome ikuiseen looppiin kysymään salasanoja authentication-popupissa.</p>
<p>Tähän on erittäin yksinkertainen syy. sfGuardin login-sivu palauttaa 401-statuksen, mikäli Symfonyyn ei olla kirjauduttu. Selain tulkitsee sen niin, ettei sivustolle olla kirjauduttu vielä ja kysyy täten salasanoja uudelleen, vaikka ne oikein olisikin annettu.</p>
<p>Voit korjata ongelman lisäämällä sfGuardAuth-moduulin applikaatioosi ja tekemällä sinne normaalin actions-classin (class sfGuardAuthActions extends BasesfGuardAuthActions). Ylikirjoita executeSigninin esimerkiksi näin:</p>
<p>&nbsp;</p>
<pre>public function executeSignin($request)
{
	$r = parent::executeSignin($request);
	$this-&gt;getResponse()-&gt;setStatusCode(200);
	return $r;
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://revenue.tm/blog/symfony-saitin-suojaus-salasanalla/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Full screen iOS-verkkopalvelu</title>
		<link>http://revenue.tm/blog/full-screen-ios-verkkopalvelu/</link>
		<comments>http://revenue.tm/blog/full-screen-ios-verkkopalvelu/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 15:01:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tekniikka]]></category>

		<guid isPermaLink="false">http://revnew.sivuviesti.fi/?p=329</guid>
		<description><![CDATA[Olen rakennellut viime päivinä iPad-webbisovellusta. Ajattelin jakaa teidän kanssa monta työtuntia syöneen ongelman. Eli miten tehdä full screen -sivusto niin, että: Saat rekisteröityä iPhonen ja iPadin hiirieleet Safari ei liiku ylös- tai alaspäin scrollatessa Normaalit linkit toimivat (tästä tuli yllättäen &#8230;20.12.2011 <a href="http://revenue.tm/blog/full-screen-ios-verkkopalvelu/" class="more">Lue lisää</a>]]></description>
			<content:encoded><![CDATA[<p>Olen rakennellut viime päivinä iPad-webbisovellusta. Ajattelin jakaa teidän kanssa monta työtuntia syöneen ongelman. Eli miten tehdä full screen -sivusto niin, että:</p>
<ol>
<li>Saat rekisteröityä iPhonen ja iPadin hiirieleet</li>
<li>Safari ei liiku ylös- tai alaspäin scrollatessa</li>
<li>Normaalit linkit toimivat (tästä tuli yllättäen vaikein kohta).</li>
</ol>
<p>Aluksi täytyy kuunnella iOS:n hiirieleitä ja muuttaa ne normaaleiksi tapahtumiksi. Näitä on mm. touchstart, touchmove, touchend ja touchcancel. Tarpeelliseksi tulee hiirieleiden ulkopuolella mm. orientationchange (kun käyttäjä kääntää päätettä 90&#8242;). Lisää iOS-tapahtumista <a href="http://developer.apple.com/library/safari/#documentation/appleapplications/reference/safariwebcontent/HandlingEvents/HandlingEvents.html" target="_blank">Applen sivustolta</a>.</p>
<p><span id="more-329"></span></p>
<p>Uusin jQuery tukee kyllä .bind(&#8220;touchstart&#8221;)-tyylisesti touchstarttia ja touchendiä, mutta ei esimerkiksi touchmovea. Eventit voi muuttaa normaaleiksi seuraavalla tavalla:</p>
<p>Sivuston latauksen yhteydessä:</p>
<pre>document.addEventListener("touchstart", touchHandler, true);
document.addEventListener("touchmove", touchHandler, true);
document.addEventListener("touchend", touchHandler, true);</pre>
<pre>function touchHandler(event)
{
    var touches = event.changedTouches,
    first = touches[0],
    type = "";
    switch(event.type)
    {
        case "touchstart": type = "mousedown"; break;
        case "touchmove":  type="mousemove"; break;
        case "touchend":   type="mouseup"; break;
        default: return;
    }

     //initMouseEvent(type, canBubble, cancelable, view, clickCount,
     //    screenX, screenY, clientX, clientY, ctrlKey,
    //     altKey, shiftKey, metaKey, button, relatedTarget);

    var simulatedEvent = document.createEvent("MouseEvent");
    simulatedEvent.initMouseEvent(type, true, true, window, 1,
              first.screenX, first.screenY,
              first.clientX, first.clientY, false,
              false, false, false, 0/*left*/, null);

    first.target.dispatchEvent(simulatedEvent);
}</pre>
<p><a href="http://ross.posterous.com/2008/08/19/iphone-touch-events-in-javascript/">Lähde</a></p>
<p>Tämän jälkeen haluamme estää normaalin iOS-eventin tapahtumasta, koska olemme jo laukaisseet virtuaalisen eventin. Yksinkertaisinta olisi lisätä touchHandler-funktion loppuun event.preventDefault(), joka estää eventtiä tapahtumasta. However, tällöin mitkään normaalit tapahtumat eivät toimi. Käyttäjä ei voisi esimerkiksi klikata linkkiä. Voisi luulla, että klikkauksen saa laukaistua $(this).click() tyylillä, mutta ei sekään pelannut. Yksi huono hacki olisi tietysti location.hrefin käyttö, mutta sille ei voi syöttää esim. target-parametria. Homma saadaan toimimaan Oikein(tm) seuraavalla koodilla:</p>
<pre>$(document).bind('touchstart touchend', function(e) {
		// Kill normal events, allow link clicking
	if( $(e.target).is("a") || $(e.target).parent().is("a") ) {
		e.stopPropagation();
	} else {
		e.preventDefault();
	}
});</pre>
<p>Edellinen jQuery-koodi tarkistaa, onko klikkaus kohdistunut linkkiin, tai esimerkiksi kuvaan, joka on linkin sisällä. Jos ei, peruutetaan eventti. Halutessaan parent-elementit voisi loopata kaikki läpi tuossa iffissä, mutta meidän käyttötapauksessa sille ei ollut tarvetta.</p>
<p>stopProgation() estää jQueryn tunkeutumasta parentteihin. Normaalistihan &lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;-tapauksessa childiä klikatessa $(document).bind(&#8220;touchstart touchend&#8221;) kävisi läpi kaikki elementit childistä p2:seen. Näin tapahtuen se käynnistäisi preventDefaultin aina, ellei ensimmäinen elementti DOMissa olisi linkki.</p>
<p>&nbsp;</p>
<h2>Muita tarpeellisia juttuja</h2>
<p>Fullscreen:&lt;meta name=&#8221;apple-mobile-web-app-capable&#8221; content=&#8221;yes&#8221;&gt;<br />
Statusbarin tyyli: &lt;meta name=&#8221;apple-mobile-web-app-status-bar-style&#8221; content=&#8221;default&#8221; /&gt;<br />
Estetään käyttäjän skaalaus, tai skaalaus, joka aiheutuu päätettä kääntäessä:<br />
&lt;meta name=&#8221;viewport&#8221; content=&#8221;user-scalable=no, width=device-width, minimum-scale = 1, maximum-scale = 1&#8243; /&gt;</p>
<p>Tein vanhasta tottumuksesta <strong>kaikki</strong> animaatiot manuaalisesti JavaScriptillä, älä tee samaa virhettä. Mikäli mahdollista, käytä <a href="http://api.jquery.com/animate/" target="_blank">jQueryn animatea</a> niin säästät tajuttoman paljon aikaa. Tämän lisäksi joudut tietysti laskemaan hiiren kiihtyvyyksiä, elementtejen sijainteja jne, mutta se on pikku juttu.</p>
<p>iOS ei tykkää, että ladot html:ään tuhat diviä grafiikoineen ja vielä liikuttelet niitä. Lataa sisältö ajaxilla ja näytä vaan tarvittava määrä elementtejä ruudun ulkopuolelta. Hakukoneille kannattaa tietty ladata sisältö ilman JavaScriptiä. Jopa visibility: hidden parantaa suorituskykyä dynaamisesti ladatulle sisällölle, mikäli joissain tilanteissa display: none ei olisi mahdollinen.</p>
]]></content:encoded>
			<wfw:commentRss>http://revenue.tm/blog/full-screen-ios-verkkopalvelu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SEOmoz: Hakukoneoptimointi 2011</title>
		<link>http://revenue.tm/blog/seomoz-hakukoneoptimointi-2011/</link>
		<comments>http://revenue.tm/blog/seomoz-hakukoneoptimointi-2011/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 15:00:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Bisnes]]></category>

		<guid isPermaLink="false">http://revnew.sivuviesti.fi/?p=327</guid>
		<description><![CDATA[SEOmoz julkaisi viikko sitten kätevän tilaston ranking factoreiden muutoksista 2009 -&#62; 2011. Katso kalvot Slidesharesta: SMX Munich Keynote: Moz Ranking Factors]]></description>
			<content:encoded><![CDATA[<p>SEOmoz julkaisi viikko sitten kätevän tilaston ranking factoreiden muutoksista 2009 -&gt; 2011.</p>
<p>Katso kalvot <a href="http://www.slideshare.net/randfish/smx-munich-keynote-moz-ranking-factors" target="_blank">Slidesharesta</a>:</p>
<div id="__ss_7515249"><strong><a title="SMX Munich Keynote: Moz Ranking Factors" href="http://www.slideshare.net/randfish/smx-munich-keynote-moz-ranking-factors">SMX Munich Keynote: Moz Ranking Factors</a></strong><iframe src="http://www.slideshare.net/slideshow/embed_code/7515249" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="425" height="355"></iframe></div>
]]></content:encoded>
			<wfw:commentRss>http://revenue.tm/blog/seomoz-hakukoneoptimointi-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony suomeksi</title>
		<link>http://revenue.tm/blog/symfony-suomeksi/</link>
		<comments>http://revenue.tm/blog/symfony-suomeksi/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 15:00:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tekniikka]]></category>

		<guid isPermaLink="false">http://revnew.sivuviesti.fi/?p=325</guid>
		<description><![CDATA[Toteutamme useimmiten projektit Symfony-alustalle, jolle olemme tehneet omat käännöstiedostot (ja muokanneet sf_guard sekä sf_admin -käännöksiä). Käännöstiedostot käsittävät Symfonyn coren, Apostrophen, Doctrinen sekä admin-työkalun käännökset. Jaamme nyt nämä kaikki tiedostot, ettei muiden tarvitsisi kirjoittaa kaikkia käännöksiä alusta lähtien itse, siinä on kuitenkin jonkin verran hommaa. &#8230;20.12.2011 <a href="http://revenue.tm/blog/symfony-suomeksi/" class="more">Lue lisää</a>]]></description>
			<content:encoded><![CDATA[<p>Toteutamme useimmiten projektit <a href="http://www.symfony-project.org/">Symfony</a>-alustalle, jolle olemme tehneet omat käännöstiedostot (ja muokanneet sf_guard sekä sf_admin -käännöksiä). Käännöstiedostot käsittävät Symfonyn coren, <a href="http://www.apostrophenow.com/">Apostrophen</a>, <a href="http://www.doctrine-project.org/">Doctrinen</a> sekä admin-työkalun käännökset.</p>
<p>Jaamme nyt nämä kaikki tiedostot, ettei muiden tarvitsisi kirjoittaa kaikkia käännöksiä alusta lähtien itse, siinä on kuitenkin jonkin verran hommaa.</p>
<ul>
<li><a href="http://revenue.tm/sites/all/files/i18n/messages.fi.xml">messages.fi.xml</a></li>
<li><a href="http://revenue.tm/sites/all/files/i18n/apostrophe.fi.xml">apostrophe.fi.xml</a></li>
<li><a href="http://revenue.tm/sites/all/files/i18n/sf_guard.fi.xml">sf_guard.fi.xml</a></li>
<li><a href="http://revenue.tm/sites/all/files/i18n/sf_admin.fi.xml">sf_admin.fi.xml</a></li>
</ul>
<p>Voitte muokata ja käyttää tiedostoja niinkuin parhaaksi näette. Tallentakaa tiedostot, selaimet näyttävät nuo todennäköisesti &#8220;väärin&#8221;.</p>
<p>Mikäli teillä on muutosehdotuksia tiedostoihin, raportoikaa ihmeessä.</p>
]]></content:encoded>
			<wfw:commentRss>http://revenue.tm/blog/symfony-suomeksi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vaalimainonta Facebookissa</title>
		<link>http://revenue.tm/blog/vaalimainonta-facebookissa/</link>
		<comments>http://revenue.tm/blog/vaalimainonta-facebookissa/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 14:59:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Bisnes]]></category>

		<guid isPermaLink="false">http://revnew.sivuviesti.fi/?p=323</guid>
		<description><![CDATA[Eduskuntavaalit ovat parin kuukauden päästä ja tällä kertaa vaalimainonnassa on näytetty huomioivan erityisesti sosiaalinen media. Joissain kampanjoissa on huomioitu sosiaalisen median mahdollisuudet ja joissain ei. Erityisesti tämä näkyy Facebookissa. Facebookin mainosmahdollisuudet antavat mahtavat kohdennusmahdollisuudet, jonka avulla kampanjan tuotto/investointisuhde (ROI) on &#8230;20.12.2011 <a href="http://revenue.tm/blog/vaalimainonta-facebookissa/" class="more">Lue lisää</a>]]></description>
			<content:encoded><![CDATA[<p>Eduskuntavaalit ovat parin kuukauden päästä ja tällä kertaa vaalimainonnassa on näytetty huomioivan erityisesti sosiaalinen media.</p>
<p>Joissain kampanjoissa on huomioitu sosiaalisen median mahdollisuudet ja joissain ei. Erityisesti tämä näkyy Facebookissa.</p>
<p>Facebookin mainosmahdollisuudet antavat mahtavat kohdennusmahdollisuudet, jonka avulla kampanjan tuotto/investointisuhde (ROI) on mahdollista saada valtavaksi.</p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><img src="http://revenue.tm/sites/default/files/vaalimainokset.jpg" alt="Vaalimainonta Facebookissa: Sanna Perikö, Seppo Huhta ja Janina Mackiewicz" /></td>
<td>Otetaan esimerkkinä kolmen ehdokkaan mainokset.<strong>Sanna Perkiö</strong>, <strong>Seppo Huhta</strong> ja <strong>Janina Mackiewicz</strong>. Kenen mainosta klikkaisit, mikäli olisit 24v suomalainen sinkkumies? Perkiön mainos ampuu yli (kuka oikeasti äänestää sinkukuuden asiantuntijuuden perusteella?), mutta on ainoa mainos, joka on suunniteltu juuri sinulle. Tässä on esimerkillisesti hyödynnetty Facebookin kohdennusmahdollisuudet.</p>
<p>Huhdan ja Mackiewiczin mainokset kosiskelevat naisia ja miehiä, nuoria ja vanhoja ja jokaista kieltä äidinkielenään puhuvaa. Minkä takia liittyisin edustajan kannattajajoukkoon, joka ajaa vähän kaikkien etuja ja ei tunnu olevan mainoksen perusteella varma itsekään, kenen asioita ajaa.</p>
<p>Kohdennus lukuisten arvojen mukaan ei maksa mitään, joten kannattaa aina tehdä useampi versio mainoksesta, jonka mainosteksti ja muut ominaisuudet ovat tarkasti kohdennettu halutulle kohderyhmälle. Tällöin saavutetaan laadukkaampia vierailijoita: heitä jotka haluavat jakaa juuri sinun ilosanomaasi.</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://revenue.tm/blog/vaalimainonta-facebookissa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSV:n generointi Exceliin</title>
		<link>http://revenue.tm/blog/csvn-generointi-exceliin/</link>
		<comments>http://revenue.tm/blog/csvn-generointi-exceliin/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 14:59:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tekniikka]]></category>

		<guid isPermaLink="false">http://revnew.sivuviesti.fi/?p=321</guid>
		<description><![CDATA[CSV:n generoiminen on älyttömän helppoa. Pari usein vastaan tulevaa kikkaa täytyy kuitenkin tietää tai osata etsiä. Erotin CSV:n nimen perusteella (Comma separated values) olisi loogista käyttää pilkkua. Kuitenkin, koska kohderyhmänä usein on nimenomaan Excel-käyttäjät, on erottimena syytä käyttää puolipistettä (;). Muista &#8230;20.12.2011 <a href="http://revenue.tm/blog/csvn-generointi-exceliin/" class="more">Lue lisää</a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Comma-separated_values">CSV:n</a> generoiminen on älyttömän helppoa. Pari usein vastaan tulevaa kikkaa täytyy kuitenkin tietää tai osata etsiä.</p>
<ol>
<li><strong>Erotin</strong><br />
CSV:n nimen perusteella (Comma separated values) olisi loogista käyttää pilkkua. Kuitenkin, koska kohderyhmänä usein on nimenomaan Excel-käyttäjät, on erottimena syytä käyttää puolipistettä (;). Muista erotella data myös lainaus- tai heittomerkeillä: &#8220;Niko Viitala&#8221;;&#8221;Online Revenue Oy&#8221;;\n</li>
<li><strong>Content-type</strong><br />
Esim. Wikipedian mukaan Content-typenä voidaan käyttää yksinkertaisesti text/csv. Haluamme kuitenkin Excelit avaamaan tiedoston oletuksena, joten laita Content-typeksi application/vnd.ms-excel</li>
<li><strong>Encoding</strong><br />
Excel ei tunnista oletuksena Unicodena tallennettuja CSV-tiedostoja. Lisää tiedoston alkuun <a href="http://en.wikipedia.org/wiki/Byte-order_mark">BOM</a>. Tällä kerrot Excelille tiedoston olevan Unicodea. Homma hoituu näin yksinkertaisesti PHP:llä: echo pack(&#8220;CCC&#8221;,0xef,0xbb,0xbf);<br />
<strong></strong></li>
<li><strong>Numerot</strong><br />
Mikäli puhelinnumerot, postikoodit yms halutaan saada näkymään oikein (nollat alussa jne), tulee numerot näyttää Excelin columnissa tyylillä =&#8221;XXXX&#8221;. Eli generointi PHP:llä esim. echo &#8216;&#8221;=&#8221;"040123123&#8243;&#8221;"&#8216;;</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://revenue.tm/blog/csvn-generointi-exceliin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sivu latautumaan nopeammin</title>
		<link>http://revenue.tm/blog/sivu-latautumaan-nopeammin/</link>
		<comments>http://revenue.tm/blog/sivu-latautumaan-nopeammin/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 14:59:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tekniikka]]></category>

		<guid isPermaLink="false">http://revnew.sivuviesti.fi/?p=319</guid>
		<description><![CDATA[Google on julkaissut mod_pagespeed -moduulin Apachelle, joka nopeuttaa usean tekniikan avulla sivujen latausaikoja ja käytöstä riippuen myös vähentää palvelimien rasitusta. Ominaisuuksiin kuuluu mm. viisas välimuistin asetus selaimelle per tiedosto, sekä css-, html- ja javascript-koodin optimoiminen. Moduuli ei korvaa esimerkiksi palvelimien välimuistiratkaisuja, mutta &#8230;20.12.2011 <a href="http://revenue.tm/blog/sivu-latautumaan-nopeammin/" class="more">Lue lisää</a>]]></description>
			<content:encoded><![CDATA[<p>Google on julkaissut mod_pagespeed -moduulin Apachelle, joka nopeuttaa <a href="http://code.google.com/speed/page-speed/docs/filters.html" target="_blank">usean tekniikan avulla</a> sivujen latausaikoja ja käytöstä riippuen myös vähentää palvelimien rasitusta.</p>
<p>Ominaisuuksiin kuuluu mm. viisas välimuistin asetus selaimelle per tiedosto, sekä css-, html- ja javascript-koodin optimoiminen. Moduuli ei korvaa esimerkiksi palvelimien välimuistiratkaisuja, mutta optimoi generoidun koodin käyttäjää varten. Hyödyt ja haitat ovat siis samankaltaiset, kun tulostuksen gzippauksessa: palvelinresursseja kuluu hiukan enemmän, mutta sivu latautuu käyttäjälle nopeammin.</p>
<p>Eri ominaisuudet on mahdollista ottaa käyttöön VirtualHostejen perusteella. Täten on helppo kokeilla, että millä ominaisuuksilla tietty sivu saa parhaan hyödyn. Useat järjestelmät käyttävät jo valmiiksi Page Speedin tekniikoita, kuten optimoivat valmiiksi JavaScript- sekä CSS-koodit, jolloin Page Speedin filtterin käyttäminen niihin lisää vaan kuormaa palvelimella.</p>
<p>Page Speediä ei ole vielä saatavilla distrojen paketinhallinnoista, mutta se on ladattavissa<a href="http://code.google.com/speed/page-speed/docs/module.html" target="_blank">Googlen Page Speed -sivulta</a>. Moduuli vaatii uusimman Apachen. Page Speedistä on saatavilla myös SDK, jonka avulla kehittäjät voivat käyttää Page Speed -tekniikoita myös muualla kuin Apachessa.</p>
]]></content:encoded>
			<wfw:commentRss>http://revenue.tm/blog/sivu-latautumaan-nopeammin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

