Nachdem ich den “kostenlosen” online Musik streaming Service jetzt schon einen Monat lang ausgiebig getestet habe, muss ich mal eben einen positiven Kommentar dazu los werden.
Vor allem im Ausland ist es immer problematisch mit Musikrechten. Dienste wie last.fm oder spotify sind entweder nur in Frankreich oder Deutschland verfügbar oder stark begrenzt. Eine youtube Playlist mag schön und gut sein, aber auch diese wird des öfteren unterbrochen oder Lieder werden übersprungen weil Titel nicht mehr verfügbar sind etc.
Grooveshark hat sich hier als sehr unkompliziert erwiesen. Eine riesige Musikdatenbank und diese ohne Unterbrechungen abrufbar. Man findet tatsächlich alles, selbst unbekannte oder eher lokale Interpreten werden gefunden.
Zwei kleine negative Faktoren sind aus meiner Sicht allerdings die Umsetzung des Players mit Flash/AIR und die chaotische Organisation der Musik mit teils falschen Titeln oder doppelten Liedern.
Ich habe mich trotz dieser Mängel gerade für ein Anywhere Upgrade entschieden und bin schon voll begeistert von den Vorzügen. Für umgerechnet 8 Euro im Monat erhält man eine Desktop Applikation, werbefreien Zugang, eine IPhone App und die Möglichkeit Musik offline abzuspielen.
Die Iphone Anwendung funktioniert leider nur auf gejailbreakten Telefonen, daher habe ich damit gerechnet, dass diese eventuell auf einige Features verzichtet oder eher instabil läuft. Lädt man sie über Cydia herunter kann man sie erstmals für 14 Tage testen. Bis jetzt hatte ich noch keine Probleme und gehe davon aus, dass sie entgegen meiner Erwartungen sehr gut funktioniert.
So viel von einem bislang sehr überzeugten Grooveshark Nutzer.
Danke Martin für die Empfehlung
I needed it for a private project and thought it might be helpful for someone else.
Ever had the problem of needing to share a limited resource between several program components?
As teached in operating systems course there is a method called “Buddy Memory Allocation” which is used to share the computer’s memory between the different applications running on the OS.
I have ported this to php, you can use it for any amount of resources and no matter what type.
<?php
/**
* Each BuddyNode manages part of the resource.
* And may even divide this part again.
* Is used to build a binary tree.
* @author Florian Schnell
*/
class BuddyNode
{
public $start;
public $exp;
public $parent;
public $free;
public $amount;
public $buddy_left;
public $buddy_right;
}
/**
* Manages resources of a limited amount.
* Use the request method to receive a buddy node
* matching the required value.
* If resource is not needed anymore use free to
* share with others again.
* @author Florian Schnell
*/
class BuddyResourcesManager
{
protected $total;
protected $blocks;
protected $root;
function __construct($min, $max)
{
$this->total = abs($min) + $max;
// create main buddy node
$this->root = new BuddyNode();
$this->root->start = 0;
$this->root->parent = null;
$this->root->free = true;
$this->root->amount = $this->total;
$this->root->buddy_left = null;
$this->root->buddy_right = null;
// init buddy list ...
$this->lists[1] = array($this->root);
}
/**
* Retrieves the specified amount of resources.
* @param integer $amount
* @return BuddyNode
*/
function request($amount)
{
$exp_fit = floor(log($this->total / $amount, 2));
// try to get an available block in right size ...
$exp = $exp_fit;
while (!isset($this->lists[$exp]))
$exp--;
$free = false;
do
{
if ($exp < 1) // no resources available!
return false;
// check if there's a free buddy on this level ...
foreach ($this->lists[$exp] as $buddy)
{
if ($buddy->free)
{
$free = $buddy;
if ($exp == $exp_fit){
$free->free = false;
return $free;
}
break;
}
}
// try next level ...
$exp--;
} while (!$free);
// break blocks apart until they have the right size ...
while ($exp_fit > $exp)
{
$this->splitBuddyNode($free);
$free = $free->buddy_left;
$exp++;
}
$free->free = false;
return $free;
}
/**
* This method deallocates the retrieved part of
* the resource so that others can access it again.
* @param BuddyNode $buddy
*/
function free(BuddyNode $buddy)
{
$buddy->free = true;
do
{
$buddy = $buddy->parent;
if ($buddy->buddy_left->free
&& $buddy->buddy_right->free)
{
$buddy->buddy_left->parent = null;
$buddy->buddy_right->parent = null;
$buddy->buddy_left = null;
$buddy->buddy_right = null;
$buddy->free = true;
}
} while ($buddy->parent && $buddy->free);
}
/**
* Take one BuddyNode that is a leaf and split it
* into a left and a right node.
* @param BuddyNode $parent
*/
protected function splitBuddyNode(BuddyNode $parent)
{
// only if this node is not in use
if (!$parent->free)
return;
// can't split already split nodes
if ($parent->buddy_left != null
&& $parent->buddy_right != null)
return;
$subsize = $parent->amount / 2;
$parent->free = false;
// build left leaf
$buddy = new BuddyNode();
$buddy->exp = $parent->exp+1;
$buddy->parent = $parent;
$buddy->amount = $subsize;
$buddy->free = true;
$buddy->start = $parent->start;
$parent->buddy_left = $buddy;
$this->lists[$buddy->exp][] = $buddy;
// build right leaf
$buddy = new BuddyNode();
$buddy->exp = $parent->exp+1;
$buddy->parent = $parent;
$buddy->amount = $subsize;
$buddy->free = true;
$buddy->start = $parent->start
+ $parent->buddy_left->amount;
$parent->buddy_right = $buddy;
$this->lists[$buddy->exp][] = $buddy;
}
}
?>
First create a new object of type BuddyResourcesManager, you need to give a min and a max value. Normally you would set min to zero and set the max value to the available amount of the resource. After that you can the object’s methods request and free to simply get more resources if needed or return any if not anymore.
Hope it helps, cheers.
Bin gut in Paris angekommen, gab zwar das eine oder andere Problem als ich mit meinen Koffern versucht habe Paris einmal unterirdisch zu durchqueren … ansonsten ist aber alles in bester Ordnung.
Die Leute hier sind total nett und hilfsbereit, vor allem dann, wenn man sich im Französisch versucht – obwohl man weiß, dass die Lage eher aussichtslos ist .
Meine Arbeit wird glaube ich durchaus Spaß machen, da ich ziemlich viel eigenverantwortlich machen darf und nur hin und wieder eine Präsentation abgeben muss, welche dann “evaluiert” wird …
Insgesamt habe ich bisher schon einiges gesehen – eigentlich nur gutes – habe dadurch aber auch eher wenig Zeit gehabt mal was hören zu lassen. Werde mal sehen ob ich heute Abend ein paar Fotos hochstellen kann.
A propos Arbeit – ich muss dann auch mal los, hier fängt man ja glücklicherweise erst um 10 Uhr an!
Donc, bonjour
Flo
UPDATE:
Okay, ich habe nun mal ein paar Fotos hochgeladen, dass man sich ein “Bild” machen kann…
Hoffe es gefällt!
Vielleicht kennen es ja ein paar schon, vor ca 2 Jahren habe ich ein Tool geschrieben welches es ermöglicht den Trackmania Dedicated Server aus dem Spiel zu steuern oder automatisch Rekorde aufzeichnen zu lassen und vieles mehr.
Dieses Tool nennt sich Aseco und ist in php geschrieben, außerdem bekam ich Hilfe von Assembler Maniac, welcher einen großen Teil zu dem Projekt beigetragen hat. Es ist mittlerweile schon recht ausgereift und kann auf sourceforge heruntergeladen werden.
Allerdings stießen wir relativ bald an die Grenzen der Interpretersprache wie zum Beispiel bei der Geschwindigkeit, Multithreading oder der leckenden Speicherverwaltung.
Nun hat es eine Weile gedauert bis ich mich wieder aufraffen konnte und für eine C++ Umsetzung nochmal von Null auf angefangen habe. Der Grundstein ist bald gelegt, das heißt die Netzwerkkommunikation klappt und viele Hilfsfunktionen und die Pluginverwaltung funktionieren. Hinter Aseco++ stecken bereits fast 3k Zeilen Code, ich hoffe, dass es bald möglich ist die ersten Plugins zu schreiben Achso, auch wenn ich jetzt gleich ein Windows-Bildschirmfoto poste, das Augenmerk liegt schon auch auf einer platformunabhängigen Lösung …
Nachdem ich noch ein wenig Arbeit investiert habe um den Upload-Vorgang endlich auf ein akzeptables Niveau zu bringen habe ich mir gedacht, dass wohl mehr Leute davon profitieren könnten wenn ich das Werk mal auf sourceforge stelle.
In Zukunft findet man neue Versionen der Bibliothek also nicht mehr (nur) hier.
Neu bei dieser Version …
- Downloads und Uploads haben vom Konzept her gleiche Callback-Handler.
- Upload ist nicht mehr Sync und braucht auch keine DoEvents mehr.
- Upload hat nun auch eine ProgressChanged-Rückmeldung.
- HTML-Dokumentation
- Sourcecode in der .zip
Ein sehr interessantes Video über das bisher erkundete Universum. Es lässt einen von den Himalayas an allen Sternen vorbei bis zum Nachglühen des Urknalls reisen.
Ich finde es sehr imposant, vor allem die Entfernungsangaben am unteren Bildschirmrand sind einfach unvorstellbar …
Muss man sich anschauen, selbst wenn man eigentlich nichts für Physik oder Astronomie über hat
Nachdem ich ein wenig Feedback bezüglich der Wrapper-Bibliothek erhalten und ein paar Fehler korrigiert habe, dachte ich mir, dass es mal wieder Zeit für eine neue Version sei.
Die Bibliothek läuft jetzt ab dem Framework 3.5 und nicht erst ab 4.0b, was ich vorher vergessen hatte zu erwähnen.
Aufgrund eines WordPress Updates kam es die letzten zwei Tage immer wieder zu kleineren Fehlern auf der Seite.
Mittlerweile sollte aber alles wieder laufen =)
Am meisten Probleme hat mir das Last.fm Plugin gemacht, allerdings kann man hier eine neue Version der http.php Datei herunterladen welche die auftretenden Fehler beseitigt.
Die Rapidshare Bibliothek nähert sich ihrem Ende …
Ich habe jetzt die letzten zwei fehlenden Methoden eingebaut und außerdem ein paar weitere Features übernommen.
Durch die SSL Option ist es nun möglich die Rapidshare API über das verschlüsselte SSL Protokoll aufzurufen.
Außerdem kann man die automatische CPU-Überprüfung aktivieren, diese ermittelt nach jeder Anfrage die aktuelle ApiCpu (ein Counter, welcher für die CPU Auslastung einer bestimmten IP Adresse steht und diese blockt sobald sie ein bestimmtes Limit überschritten hat).
Wird das Limit nahezu erreicht wird die Api so lange gelockt bis der Counter resettet wird und weitere Anfragen gestartet werden können ohne Gefahr zu laufen, dass die IP geblockt wird.
Wie schon erwähnt habe ich jetzt die Methoden zum Up- und Download eingebaut.
Ein Beispiel zur Benutzung hier:
void UpAndDownFile()
{
// create the api wrapper ...
RapidshareApi RSApi = new RapidshareApi("login", "password",
RSClient.RSAccountType.Premium,[usessl], [enablemaxcpulock]);
// do the file upload ...
string filelocation = "C:\\bananenkompott.zip";
RapidshareApi.UploadFileResponse response = RSApi.UploadFile(filelocation,
UploadProgressChanged);
string downloadlink = response.link;
// download the file again ...
string location = "C:\\Users\\YourLoginName\\Desktop";
RSApi.DownloadFile(downloadlink, location, DownloadFileDone);
}
void UploadProgressChanged(float percent)
{
// this might update some progress bar or other interface component ...
}
void DownloadFileDone()
{
// file has been downloaded successfully!
}
Ich hab versucht das Ganze so einfach wie möglich zu halten, ich hoffe dass es das auch geworden ist .
Hier gibt es die Bibliothek letztendlich zum Download: Rapidshare Api