Vlatní last.fm api rozhrani

Prosím, berte tento článek s značnou rezervou. Byl psán mým mladým Já, které se teprve učilo!

Nejdříve si něco řekneme o službě last.fm. Je to webová aplikace, která shromažďuje informace o tom co jste poslouchali za hudbu. Já bych řekl že to je spíše taková frajeřinka než užitečná věc, ale určitě se tam něco užitečného najde.

Jak jsem už v úvodu naznačil je to velmi jednoduché, ale určitě se najdou i tací kteří neví jak na to. To co budeme dělat můžete vidět třeba u mně v pravém sloupci, je to ten krásný obdelník ve kterém se ukazují písničky které zrovna poslouchám.

Popis: Naše aplikace zobrazí základní informace (vaš banner, přezdívku, odkaz na vás, počet poslechnutých písní a od kdy probíhá vás záznam) a pak zobrazí poslední písničky které jste poslouchali (včetně alba, autora a kdy jste ji slyšeli). Dále aplikace obsahuje cache kvůli zrychlení načítání a snížení nároků.

Co potřebujeme: Nejlepší bude vlastní web s podporou PHP a SimpleXML.

Jak na to: Celá aplikace se skládá ze 4 souborů:

  • lastfm.php (obsahuje všechny scripty a html)
  • lastfm.css (obsahuje stylování pro naši tabulku)
  • lastfm_cache.xml (pro cachování vašich tracků, nejspíše bude třeba nastavit oprávnění na 777)
  • lastfm_uset.xml (pro osobní informace, které se načtou pouze jednou, nejspíše bude třeba nastavit oprávnění na 777). Všechny soubory umístíme do jedné složky (lastfm.css si můžete dát kam chcete, nebo slučte s jiným css souborem) a xml souborům nastavíme oprávněni na 777.

Poznámky pod čárou.

  • Proč se to cachuje Cache vašich tracků je docela nezbytné, protože odezva api last.fm je docela velká a načítání aktuálních dat při každém reloadu stránky je nesmysl.

  • Jak často se to cachuje Cachování tracků a informací o vás probíhá odděleně. Tracky se aktualizují každé 3 minuty, což je bych řekl takové ideální. Informace o vás se aktualizují co 7 dní, obsahují váš avatar, nick, odkaz a další drobnosti a není třeba je načítat často.

  • Jak se to cachuje Cachuje se to prostým uložením výstupu api do xml souboru. V okamžiku kdy je xml soubor starý 3 minuty, respektive 7 dní, proběhne aktualizace z api last.fm.

  • Ruční aktualizace osobních údajů Pokud z nějakého důvodu potřebujete zaktualizovat osobní údaje, stačí jednoduše smazat OBSAH souboru lastfm_user.xml. Upozorňuji, smazat obsah ne samotný soubor.

  • Licence a tak... Můj kód je kompletně svobodný, což znamená že sním můžete dělat co chcete. Na oplátku od vás žádám aby jste nechali spodní lištu, s odkazem, tak jak je. Je to jediné co z toho mám.



RSS jednoduše a rychle

Prosím, berte tento článek s značnou rezervou. Byl psán mým mladým Já, které se teprve učilo!

Dnes jsem se rozhodl přidat na svůj blog RSS export. Při hledáni na netu jsem ale zjistil že není (nenašel jsem) návod kde by bylo osvětleno vše podstatné.

Inu proto jsem se rozhodl posbírat vše potřebné a udělat si svůj jednoduchý exportér. Začneme PHP hlavičkou.

<?php
header('content-type: application/xml');
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";

include_once "funkce/dtb.php";
?>

Na prvním řádku řekneme prohlížeči že posíláme xml soubor, na druhém je nastavení verze xml a kódování a na třetím připojujeme soubor s připojením k databázi. Všimněte si druhého řádku, protože se xml prezentuje jako <?xml musíme buď vypnout php direktivu short_open_tag nebo to vložit do echo, tak jak to vidíte v příkladu. Pokud tak neučiníte bude se zmiňované <?xml brát jako <? kterým začíná PHP a to nechceme.

Po hlavičce následuje rss hlavička.

<rss version="2.0">
<channel>
<title> Jméno RSS kanálu </title>
<link> Odkaz na zdroj RSS kanálu </link>
<description> Popis </description>
<language> Nastavení jazyka kanálu (cs-CZ) </language>

A opět, první řádek říká prohlížeči nebo čtečce že se jedná o RSS dokument a nastavuje jeho verzi. Druhý řádek otevírá kanál, takže vše co bude v něm bude někde vidět. A nakonec nasleduje popisovací hlavička RSS kanálu.

Pak následuje generování samotného obsahu, tedy věcí které budou čtenáře zajímat.

<?php
  $query=mysql_query(" Dotaz kterým získáme, články, příspěvky, atd... ");
  while($data=mysql_fetch_assoc($query)){
    echo "\t\t\t<item>
      <title> Jméno, bude reprezentovat jeden objekt a bude na něj odkazem </title>
      <link> Odkaz na objekt </link>
      <description> Popis objektu, například první odstavec článku,
                    ale bez HTML formátovaní! </description>
      <pubDate> Datum vložení do dtb ve formátu Thu, 12 Jan 2012 14:41:21 +0100 </pubDate>
    </item>\n";
  } ?>

Mezi tagy a jsou obsaženy jednotlivé objekty exportu. Ostatní tagy je osvětlen uvnitř ukázky. Datum požadovaného formátu získáte php funkcí date() s prvním parametrem "r".

Na konec jen připomenu že je třeba uvést poslední dva řádky, které uzavřou kanál a skončí RSS výstup.

</channel>
</rss>

Možná jsem vám pomohl, možná píši blbosti, ale jedno vím určitě, mě to funguje.


Nebojte se serialize()

Prosím, berte tento článek s značnou rezervou. Byl psán mým mladým Já, které se teprve učilo!

PHP slon

Konečně jsem se odhodlal a zkouším napsat nějaký odborný článek. Moc jsem po tom nepátral (i když jsem asi měl), ale zdá se mi že php funkce serialize() a unserialize() nejsou moc oblíbené. Je to možná kvůli jejich náročnosti. Tak jsem si udělal vlastní výzkum.

Protože při vývoji aktuální verze hry, bylo třeba uložit do databáze mapu. Uvažoval jsem co na to využit. Mapa se skládá z několika vrstev z čehož nejobsáhlejší vrstvou jsou textury. Mapa má rozměry 60*60 takže je celkem 3600 políček s texturami a každé poličko obsahuje jinou hodnotu.

Postavil jsem si proto jakýsi benchmark který měří časovou náročnost a velikost výstupu funkcí serialize() a unserialize() a funkcí implode() a explode() (pro porovnání) a výsledky mě velice mile překvapily.

<?php
for($i=0; $i<1000; $i++){
	$pole[$i] = "12345";
}
$zacatek = mikrocas();
$ser = serialize($pole);
echo "<tr><td>Čas zpracování: ". (round((mikrocas() - $zacatek)/100,5)) ." s</td></tr>";
echo "<tr><td>Výsledná velikost: ". tri(strlen($ser)) ."</td></tr>";
unset($ser, $pole);
?>

Ukázka zdrojového kódu souboru se1000.php

Celý benchmark s výsledky měření si můžete prohlédnout na adrese ukazky.herangr.cz/serialize/.

Pro mně asi největším překvapení bylo že více rozměrové pole má menší výstup než pole jedno rozměrové. Také si můžete všimnout že funkce implode() a explode() jsou rychlejší a jejich výstup je menší, ovšem pro mé účely se příliš nehodily, protože nedokáži uložit index pole. Naopak při ukládání stotisícového pole přes serialize() je téměř 20x větší než vstup (při délce obsahu každého prvku pole 5 znaků).

Zdroj obrázků http://www.squidoo.com/


Můj první prográmek

Prosím, berte tento článek s značnou rezervou. Byl psán mým mladým Já, které se teprve učilo!

K jeho popisu bych jen přidal to že je to jedno z těch jednoduchých řešení a při práci mi pomohl Kuba (je to trochu složitější než jednoduché). Ale i tak je to sranda...

#include <iostream>
#include <iomanip>

using namespace std;

const int velikostPoli=64;

char prevodNaCHar(int cislo){
char navrat;
switch (cislo){
case 10: navrat='a'; break;
case 11: navrat='b'; break;
case 12: navrat='c'; break;
case 13: navrat='d'; break;
case 14: navrat='e'; break;
case 15: navrat='f'; break;
case 16: navrat='g'; break;
case 17: navrat='h'; break;
case 18: navrat='i'; break;
case 19: navrat='j'; break;
case 20: navrat='k'; break;
}
return navrat;
}

void vystup(int pole[]){
int vypis=0;
for(int i=0; i<velikostPoli; i++){
if(pole[i]>0 || vypis==1){
if(pole[i]<9){
cout << pole[i] << " ";
}else{
cout << prevodNaCHar(pole[i]) << " ";
}
vypis=1;
}
}
}

void prevodnik(int cislo, int soustava){
int pole[velikostPoli];
for(int i=0; i<velikostPoli; i++){ pole[i]=0; }
for(int i=velikostPoli-1; i>=0; i--){
pole[i]=cislo%soustava;
cislo=cislo/soustava;
}
vystup(pole);
}

int main() {
int vstupni_cislo, soustava;
char znovu = 'a';

    	while(znovu == 'a'){
    		cout << "Zadejte cislo v desitkove soustave: ";
    		cin >> vstupni_cislo;
    		cout << "Zadejte vyslednou soustavu (2-20): ";
    		cin >> soustava;
    			if(soustava >= 2 && soustava <=20 && vstupni_cislo>0){
    				cout << vstupni_cislo << " je v " << soustava << " soustave: ";
    				prevodnik(vstupni_cislo, soustava);
    				cout << endl;
    				cout<<"Znova? a/n: ";
    				cin>>znovu;
    				cout << endl;
    			}else{
    				cout << "Jsou povoleny pouze soustavy od 2 po 20!" << endl;
    				znovu='a';
    				cout << endl;
    			}
    	}

}

Lukáš Tížek © 2010 - 2021 | 
statistiky

Statistiky:

Ø blogů denně: 0.0223
Ø pismen denně: 55.8916
celkem blogů: 92
celkem znaků: 231 056
první blog: 3. ledna 2010
stáří blogu: 4 134 dnů
 | 
rozcestník

Som napsal: