<?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>API | Nerdpress.org</title>
	<atom:link href="https://nerdpress.org/category/api/feed/" rel="self" type="application/rss+xml" />
	<link>https://nerdpress.org</link>
	<description>...dev, tech problems and solutions.</description>
	<lastBuildDate>Mon, 02 Oct 2017 05:49:15 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Splitting Swagger API Documentation yaml files</title>
		<link>https://nerdpress.org/2017/10/01/splitting-swagger-api-documentation-yaml-files/</link>
					<comments>https://nerdpress.org/2017/10/01/splitting-swagger-api-documentation-yaml-files/#comments</comments>
		
		<dc:creator><![CDATA[Max Girkens]]></dc:creator>
		<pubDate>Sun, 01 Oct 2017 06:00:22 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Documentation]]></category>
		<category><![CDATA[swagger]]></category>
		<guid isPermaLink="false">https://nerdpress.org/?p=2777</guid>

					<description><![CDATA[<p>When documenting your API with Swagger/Swagger-UI, one really cool feature to use is the $ref syntax. As Swagger documentation files tend to get real large und hard too read, splitting the config across multiple files might be a good idea. With $ref you could do this quite easily. For example you could reference a single &#8230; </p>
<p class="link-more"><a href="https://nerdpress.org/2017/10/01/splitting-swagger-api-documentation-yaml-files/" class="more-link">Continue reading<span class="screen-reader-text"> "Splitting Swagger API Documentation yaml files"</span></a></p>
The post <a href="https://nerdpress.org/2017/10/01/splitting-swagger-api-documentation-yaml-files/">Splitting Swagger API Documentation yaml files</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></description>
										<content:encoded><![CDATA[<p>When documenting your API with <a href="https://swagger.io/swagger-ui/">Swagger/Swagger-UI</a>, one really cool feature to use is the <em>$ref</em> syntax.</p>
<p>As Swagger documentation files tend to get real large und hard too read, splitting the config across multiple files might be a good idea.<br />
With <em>$ref</em> you could do this quite easily.<br />
<span id="more-2777"></span><br />
For example you could reference a single config file per path like so:</p>
<pre class="brush: yaml; title: ; notranslate">
swagger: &quot;2.0&quot;
basePath: &quot;my-api/v1/&quot;
info:
  version: &quot;0.0.1&quot;
  title: &quot;my API&quot;
tags:
  - name: &quot;section1&quot;
    description: &quot;Some Section&quot;
  - name: &quot;section2&quot;
    description: &quot;Some other Section&quot;

paths:

  ##section 1

  /section1/some/path:
    $ref: 'paths/section1_some_path.yml'

  /section1/some-other-path:
    $ref: 'paths/section1_some_other_path.yml'
</pre>
<p>Then have all actions for this path defined in a dedicated file like this:</p>
<p><strong>paths/section1_some_path.yml:</strong></p>
<pre class="brush: yaml; title: ; notranslate">
post:
  tags:
  - &quot;section1&quot;
  parameters:
    ...
</pre>
<p>This really helped me managing larger documentation files, which otherwise tend to get quite hard to read.</p>The post <a href="https://nerdpress.org/2017/10/01/splitting-swagger-api-documentation-yaml-files/">Splitting Swagger API Documentation yaml files</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></content:encoded>
					
					<wfw:commentRss>https://nerdpress.org/2017/10/01/splitting-swagger-api-documentation-yaml-files/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>mashcloud.net &#8211; mashup soundcloud audio tracks</title>
		<link>https://nerdpress.org/2013/01/24/mashcloud-net-mashup-soundcloud-audio-tracks/</link>
		
		<dc:creator><![CDATA[Max Girkens]]></dc:creator>
		<pubDate>Thu, 24 Jan 2013 20:08:28 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Express]]></category>
		<category><![CDATA[Frontend]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[socket.io]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[sockets]]></category>
		<category><![CDATA[soundcloud]]></category>
		<guid isPermaLink="false">https://nerdpress.org/?p=2359</guid>

					<description><![CDATA[<p>mashcloud.net is an experiment on collaborative realtime audio editing and music creation. I did the project within the frame of  my BA thesis in audio production last year. As I moved the code to github this week, I wanted to give a quick overview of the project and its technical underlyings, just in case someone might &#8230; </p>
<p class="link-more"><a href="https://nerdpress.org/2013/01/24/mashcloud-net-mashup-soundcloud-audio-tracks/" class="more-link">Continue reading<span class="screen-reader-text"> "mashcloud.net &#8211; mashup soundcloud audio tracks"</span></a></p>
The post <a href="https://nerdpress.org/2013/01/24/mashcloud-net-mashup-soundcloud-audio-tracks/">mashcloud.net – mashup soundcloud audio tracks</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></description>
										<content:encoded><![CDATA[<p><a href="http://mashcloud.net/">mashcloud.net</a> is an experiment on collaborative realtime audio editing and music creation. <br />I did the project within the frame of  my BA thesis in audio production last year.</p>
<p>As I moved the code to <a href="https://github.com/gherkins/mashcloud">github</a> this week, I wanted to give a quick overview of the project and its technical underlyings, just in case someone might be interested :)</p>
<p><span id="more-2359"></span>As the title of this post might already suggest, its about selecting and layering loops from audiofiles hosted on <a href="http://soundcloud.com">soundcloud.com</a> and thereby creating new music.</p>
<p><a href="https://nerdpress.org/2013/01/24/mashcloud-net-mashup-soundcloud-audio-tracks/bildschirmfoto-2013-01-24-um-20-46-08/" rel="attachment wp-att-2363"><img fetchpriority="high" decoding="async" class="alignnone size-medium wp-image-2363" alt="Bildschirmfoto 2013-01-24 um 20.46.08" src="https://nerdpress.org/wp-content/uploads/2013/01/Bildschirmfoto-2013-01-24-um-20.46.08-300x174.png" width="300" height="174" srcset="https://nerdpress.org/wp-content/uploads/2013/01/Bildschirmfoto-2013-01-24-um-20.46.08-300x174.png 300w, https://nerdpress.org/wp-content/uploads/2013/01/Bildschirmfoto-2013-01-24-um-20.46.08-1024x593.png 1024w, https://nerdpress.org/wp-content/uploads/2013/01/Bildschirmfoto-2013-01-24-um-20.46.08.png 1050w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Those collections of layered loops are called a session. Sessions can be created anonymously by everyone and are auto-saved on every action. By distributing the URL of a session other users can join and every action is synced between all users in realtime. <br />(complete mayhem, indeed :)</p>
<p>The application is built with HTML5 and JS w/ <a href="http://jquery.com/">jQuery</a> using the <a href="http://developers.soundcloud.com/docs/api/guide">soundcloud API</a> on the client side and runs on <a href="http://nodejs.org/">node.js</a> &amp; <a href="http://www.mongodb.org/">mongoDB</a> with <a href="http://expressjs.com/">express</a>, <a href="http://socket.io/">socket.io</a> and <a href="http://mongoosejs.com/">mongoose</a> on the server side.</p>
<p>I basically started the project to find out if you could play multiple loops asynchronous and synced with low latency using the <a href="https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html">Web Audio API</a> while collaboratively working together with multiple users in realtime. </p>
<p>As that turned out to be not only possible but performed real nicely, the experiment then developed in somewhat of an application and finally got a name and a face.</p>
<p>There&#8217;s a whole lot of things i&#8217;d like to implement / refactor and do when i get some time on my hands, as</p>
<p>&#8211; adding a &#8220;record&#8221; feature to record, save and export created sessions as audiofiles</p>
<p>&#8211; rewriting the client side with <a href="http://backbonejs.org/">backbone.js</a> (as things got a bit messy &#8230;)</p>
<p>&#8211; adding some audio effects to the tracks</p>
<p>&#8211; write some tests</p>
<p>I&#8217;d appreciate any form of contribution as much as any questions or feedback on the project :)</p>
<p>Feel free to check out the live version at <a href="http://mashcloud.net/"> http://mashcloud.net/</a> or the sources at <a href="https://github.com/gherkins/mashcloud">https://github.com/gherkins/mashcloud</a></p>The post <a href="https://nerdpress.org/2013/01/24/mashcloud-net-mashup-soundcloud-audio-tracks/">mashcloud.net – mashup soundcloud audio tracks</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[Symfony 2] Twig &#8211; Global Variables</title>
		<link>https://nerdpress.org/2011/09/12/symfony-2-twig-global-variables/</link>
					<comments>https://nerdpress.org/2011/09/12/symfony-2-twig-global-variables/#comments</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Mon, 12 Sep 2011 10:21:22 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Global Variables]]></category>
		<category><![CDATA[symfony 2]]></category>
		<category><![CDATA[Twig]]></category>
		<guid isPermaLink="false">https://nerdpress.org/?p=1647</guid>

					<description><![CDATA[<p>Schon mal gefragt, welche globalen Variablen in der Twig-Extension eines Symfony 2 (Standard Distri)-Projektes zur Verfügung stehen? Schaut man sich die Klasse GlobalVariables im Namespace Symfony\Bundle\FrameworkBundle\Templating an (diese Klasse ist Teil des Framework-Bundles, d.h., Gleiches gilt ebenfalls für PHP als Template-Maschine), wird einiges klarer. Weiter unten eine Liste der Assessoren, die die Klasse bereitstellt: Symfony\Component\Security\Core\SecurityContext&#124;void &#8230; </p>
<p class="link-more"><a href="https://nerdpress.org/2011/09/12/symfony-2-twig-global-variables/" class="more-link">Continue reading<span class="screen-reader-text"> "[Symfony 2] Twig &#8211; Global Variables"</span></a></p>
The post <a href="https://nerdpress.org/2011/09/12/symfony-2-twig-global-variables/">[Symfony 2] Twig – Global Variables</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></description>
										<content:encoded><![CDATA[<p>Schon mal gefragt, welche globalen Variablen in der Twig-Extension eines Symfony 2 (Standard Distri)-Projektes zur Verfügung stehen?<span id="more-1647"></span><br />
Schaut man sich die Klasse GlobalVariables im Namespace Symfony\Bundle\FrameworkBundle\Templating an (diese Klasse ist Teil des Framework-Bundles, d.h., Gleiches gilt ebenfalls für PHP als Template-Maschine), wird einiges klarer. Weiter unten eine Liste der Assessoren, die die Klasse bereitstellt:</p>
<pre class="brush: bash; title: ; notranslate">
    Symfony\Component\Security\Core\SecurityContext|void         getSecurity()
    Symfony\Component\Security\Core\User\(Advanced)UserInterface getUser()
    Symfony\Component\HttpFoundation\Request|void                getRequest()
    Symfony\Component\HttpFoundation\Session|void                getSession()
    string                                                       getEnvironment()
    bool                                                         getDebug()</pre>
<p>In Twig liegt der Container im &#8220;app&#8221;-Namespace, &#8220;Übersetzt&#8221; nach Twig heißt das ganze also:</p>
<pre class="brush: bash; title: ; notranslate">
    app.security
    app.user
    app.request
    app.session
    app.environment
    app.debug
</pre>
<p>Viel Spaß beim Templates-Bauen ;)</p>The post <a href="https://nerdpress.org/2011/09/12/symfony-2-twig-global-variables/">[Symfony 2] Twig – Global Variables</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></content:encoded>
					
					<wfw:commentRss>https://nerdpress.org/2011/09/12/symfony-2-twig-global-variables/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title>Symfony 2 wird super. Oder &#8230;?</title>
		<link>https://nerdpress.org/2011/05/11/symfony-2-wird-super-oder/</link>
					<comments>https://nerdpress.org/2011/05/11/symfony-2-wird-super-oder/#comments</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 10 May 2011 22:09:30 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Doctrine ORM]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software engineering]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Dependency Injection]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[DIC]]></category>
		<category><![CDATA[IoC]]></category>
		<category><![CDATA[Software Architecture]]></category>
		<category><![CDATA[symfony 2]]></category>
		<guid isPermaLink="false">https://nerdpress.org/?p=1462</guid>

					<description><![CDATA[<p>Natürlich wird Symfony 2 super. Die Dokumentation ist wie gewohnt zum jetzigen, frühen Zeitpunkt genial, die Architektur durchdacht, die Entwickler-Community steckt sowieso alles in die Tasche, man sieht einfach: Da steckt eine Menge Arbeit, Hirnschmalz und Erfahrung hinter. Aber genug geschleimt ;) Mein Lieblingsthema ist ja zur Zeit der Dependency Injection Container. Und irgendwie stinkt &#8230; </p>
<p class="link-more"><a href="https://nerdpress.org/2011/05/11/symfony-2-wird-super-oder/" class="more-link">Continue reading<span class="screen-reader-text"> "Symfony 2 wird super. Oder &#8230;?"</span></a></p>
The post <a href="https://nerdpress.org/2011/05/11/symfony-2-wird-super-oder/">Symfony 2 wird super. Oder …?</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></description>
										<content:encoded><![CDATA[<p>Natürlich wird Symfony 2 super. Die Dokumentation ist wie gewohnt zum jetzigen, frühen Zeitpunkt genial, die Architektur durchdacht, die Entwickler-Community steckt sowieso alles in die Tasche, man sieht einfach: Da steckt eine Menge Arbeit, Hirnschmalz und Erfahrung hinter. Aber genug geschleimt ;) </p>
<p>Mein Lieblingsthema ist ja zur Zeit der Dependency Injection Container. Und irgendwie stinkt mir die ganze Container-Konfiguration noch gewaltig. Meine <a href="https://nerdpress.org/2010/09/26/dependency-injection-mit-php-5-3-runkit-erweiterung-und-doctrine-2-annotationen/">kläglichen Versuche</a>, selbst mal so was ähnliches wie eine brauchbare Autowiring-Implementierung herunterzubrechen, waren natürlich auch bzw. erst recht nicht der große Wurf &#8211; was vor allem daran lag, dass ich den Service Container und damit den ganzen Sinn und Zweck des Ganzen einfach mal wegrationalisiert hatte &#8211; Loose Coupling sieht natürlich anders aus, das sei den Kritikern zugestanden. Ich verteidige mich mal dadurch, dass ich eigentlich nur mal mit Mixins rumspielen wollte &#8211; da hab&#8217; ich wohl die eine oder andere Begrifflichkeit durcheinander geworfen. </p>
<p>Aber um mal zu des Pudels Kern zu kommen: Ist es wirklich so geil, mit kilometerlangen XML-Dateien, &#8216;ner Menge Initialisierungscode und ohne mit der heißgeliebten Code-Completion in der IDE meiner Wahl ein Paradigma zu kaufen, das im speziellen Anwendungskontext &#8211; nicht im Framework-Kontext &#8211; eher selten Anwendung findet? </p>
<p><span id="more-1462"></span></p>
<p>Es ist doch so: PHP bietet zwar mittlerweile eine vernünftige Reflection API, aber wenig (keine) Möglichkeiten, Code zur Compile- oder Runtime effizient zu injizieren (vorbei bspw. an der Sichtbarkeit, was für Property Injection aus meiner Sicht erforderlich wäre). Mit Handständen geht das mittels der Reflection API, noch fieser mit bspw. Runkit. </p>
<p>Somit ist &#8211; (natürlich nur aus meiner Sicht, was im Übrigen für den gesamten &#8220;Complaint&#8221; gilt &#8211; dabei wäre ich wirklich froh, berichtigt zu werden) jeder Versuch, die Konfiguration eines wie auch immer gearteten, auf PHP sitzenden, DIC mit Syntactic Sugar anzureichern, vergeblich. Und Syntactic Sugar ist dringend vonnöten, um das Zeug in der Praxis RAD-tauglich zu machen. Nehme ich PHP den RAD-Faktor, was bleibt denn dann noch übrig?</p>
<p>Symfony 2 behilft sich damit, einen DI-Container zu definieren und ihn als PHP-Code wegzucachen. Dieser hat dann Accessoren für alle definierten Services, Constructor-Injection ist durch Referenzierung in den Konfigurationsdateien möglich. Die Doku spricht zusätzlich von Setter- und Property-Injection, dazu konnte ich aber irgendwie keine dokumentierten Beispiele finden. Es gibt aber immerhin die Möglichkeit, Methoden in der Service-Klasse als Pre- oder Post-Initialization Interceptoren auszuführen.</p>
<p>Letztlich tut der Container, was er soll: Abhängigkeiten in beliebige Instanzen zu injizieren. Bei Bedarf auch gegen ein Interface, aber das ist letztlich aufgrund des Sprachentwurfs nur optional (Was impliziert, das man auf Kosten riesiger Flexibilität &#8211; die man nicht braucht &#8211; schnell mal riskiert, durch einen falsch konfigurierten DI-Container seine Anwendung kaputt zu machen).</p>
<p>Aber der Aufwand steht meiner Meinung nach noch in keinem Verhältnis zum Nutzen. Am Beispiel einer Controller Extension, die als Service definiert wird, möchte ich das mal demonstrieren. Die offizielle Symfony 2-Dokumentation sagt, dass</p>
<blockquote><p>To keep things simple, Symfony2 by defaults does not require that controllers be defined as services. Furthermore Symfony2 injects the entire service container into your controller.
</p></blockquote>
<p>Das ist immerhin schon einmal eine Information. Das Standardverhalten ist also, dass ich automagisch eine Controllerklasse habe, die den Container kennt (Wie? Magisch? Ich dachte, Symfony 2 hat die Magie zugunsten transparentem Code und ständiger Kontrolle über jeden Aspekt des Core-Frameworks aufgegeben?). Dadurch, dass er ein ContainerAware Interface implementiert, kennt er auch einen Shortcut auf </p>
<pre class="brush: php; title: ; notranslate">$this-&gt;container-&gt;get('serviceid')</pre>
<p>, nämlich </p>
<pre class="brush: php; title: ; notranslate">$this-&gt;get('serviceid');</pre>
<p>. Um Bspw. ein Doctrine-Entity zu persistieren, reichen &#8220;ein paar codezeilen&#8221;:</p>
<pre class="brush: php; title: ; notranslate">
     $em = $this-&gt;get('doctrine.orm.entity_manager');
     $em-&gt;???($myEntity);
</pre>
<p>Wie hieß die Methode da am Entity Manager jetzt nochmal? Das ist das erste Problem: Dadurch, dass alle Services anonym im Service Container herumdümpeln bzw. auf ihre Instanziierung warten, habe ich in meiner IDE keinerlei Code-Completion mehr. Um das wieder zu erreichen, muss ich entweder<br />
&#8211; einen Accessor schreiben (getEntityManager()) und diesen mittels PHP-Doc type-hinten (annotieren) oder<br />
&#8211; mindestens einen magischen Docblock davorsetzen, der genau *meiner* IDE die Möglichkeit gibt, den Variablentyp zu erraten (aber ggf. proprietär ist, d.h. in anderen IDEs nicht unbedingt funktionieren muss). Für die Netbeans IDE gibt es dafür bspw. das &#8220;<a href="http://blogs.oracle.com/netbeansphp/entry/defining_a_variable_type_in">vdoc</a>&#8220;-Feature.</p>
<p>Das ganze setzt natürlich voraus, dass ich *weiß*, welches Interface der Service doctrine.orm.entity_manager implementiert bzw wie die konkrete Klasse (samt Namespace) desselben heißt. Und vorher muss ich auch noch wissen, wie überhaupt der *Servicename* des Entity Managers lautet. </p>
<p>Bin ich also komplett Ahnungslos, rufe ich erstmal ein Terminal auf, tippe sowas wie</p>
<pre class="brush: jscript; title: ; notranslate">$ app/console container:debug --show-private</pre>
<p> ein und suche mir anschließend in der kilometerlangen Liste genau die Services zusammen, die ich brauche.</p>
<p>Dafür brauche ich als Framework-Newbie schonmal richtig tiefgehende Kenntnisse darüber, was ein DIC überhaupt ist, tut und zur Konfiguration erfordert.</p>
<p>Um also das, was &#8220;früher&#8221; ein </p>
<pre class="brush: php; title: ; notranslate">new Cart($color, $maxSpeed)-&gt;save()</pre>
<p> war, zu erreichen, muss ich nun erstmal ganz schön viel Sport treiben (dieses Beispiel nur exemplarisch, es steht außer Frage, dass die Doctrine 2-Architektur wirklich klasse ist. Das Manko aus meiner Sicht ist die Integration in Sf2, nicht der ORM-Layer an sich.)  </p>
<p>Möchte ich den Accessor der ContainerAware-Implementierung am Controller vermeiden und die Services &#8220;direkt&#8221; injizieren, muss ich ihn selbst als Service am DIC registrieren. Wie das funktioniert, würde den Rahmen sprengen, nur so viel: Der Aufwand steht aus meiner Sicht wieder in keinem Verhältnis zum Ergebnis. Allerdings habe ich damit den Vorteil, dass ich bspw. keine abstrakte Controllerklasse mehr zu erweitern habe &#8211; der Controller kann ein simples Popo sein. Dass es aber nicht zu simpel sein darf, zeigt bspw., das ich trotz alledem mindestens einen Constructor definieren muss, der eben alle benötigten Services aufnimmt und an Instanzvariablen bindet. Und das können einige sein &#8211; fängt an beim Templating, geht übers Formframework, ggf. den Entity-Manager, einen Mailer und was einem sonst noch so einfällt. Dabei wollten wir doch ab jetzt nur noch leichtgewichtige Controller haben?</p>
<p>Meiner Meinung nach liegt die Lösung der Malaise in zwei Alternativen: Man baut so lange Abstracts, die den ganzen Kram als Shortcuts bereitstellen (dann hätten wir bspw. wieder eine komplexe, abstrakte Kontrollerklasse, die mindestens alles kennt, was in Symfony 1 noch dem ApplicationContext gehörte) &#8211; womit wir unser Loose Coupling Pardigma wieder in den Schrank zu den übrigen Ideen stellen können, die im Nachgang irgendwie doch nicht funktionierten. Oder legt Autowiring drüber. </p>
<p>Flow 3 baut bspw. an einem DIC + Autowiring, der alle verwalteten Services durch eine Kombination der Analyse von Annotationen (also PHP-Doccomments) und Signaturen (Typehints) direkt an die erzeugten Instanzen bindet. Die Konfiguration scheint damit sehr viel leichtgewichtiger. </p>
<p>Grails (was so weit ich weiß auf der Spring IOC-Komponente sitzt) geht noch einen Schritt weiter und mappt Instanzvariablen durch reine Naming-Conventions: Wenn also eine Instanzvariable auf &#8220;Service&#8221; endet und es zur Eigenschaft &#8220;mailerService&#8221; einen passenden Service &#8220;mailer&#8221; gibt, wird dieser automagisch injiziert. Kein zusätzlicher Code noch Annotations vonnöten.</p>
<p>Ich wüsste aber nicht, wie man solche Features wirklich performanceneutral, effizient und stabil auf einer Plattform wie PHP aufsetzen könnte &#8211; dafür ist die Sprache einfach (noch) nicht weit genug. </p>
<p>Abschließend bleibt ein übler Nachgeschmack &#8211; und der Eindruck, dass man sich hier fatal an den XML-&#8220;Konfigurationswahnsinn&#8221; der entsprechenden Java-&#8220;Vorbilder&#8221; annähern möchte. Wo doch gerade in diesem Lager  intensiv daran gearbeitet wird, genau davon abzurücken und Konfigurationen eben durch Konventionen zu ersetzen.  </p>
<p>Was denkt ihr? Kann das ganze doch durch Routine punkten, sodass es durch ein wenig konkrete Projekterfahrung doch ganz leicht von der Hand geht? Wird der DIC im Tagesgeschäft schon intensiv benutzt, oder werden nur die Standardfunktionen des Frameworks verwendet und das Zeug &#8220;unter der Haube&#8221; doch lieber den Framework- und Bundle-Entwicklern überlassen? Ich bin wieder sehr gespannt auf Meinungen und Kritik&#8230;</p>The post <a href="https://nerdpress.org/2011/05/11/symfony-2-wird-super-oder/">Symfony 2 wird super. Oder …?</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></content:encoded>
					
					<wfw:commentRss>https://nerdpress.org/2011/05/11/symfony-2-wird-super-oder/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>ReflectionParameter::isOptional() vs. ReflectionParameter::isDefaultValueAvailable()</title>
		<link>https://nerdpress.org/2010/09/28/reflectionparameterisoptional-vs-reflectionparameterisdefaultvalueavailable/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 28 Sep 2010 16:03:50 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software engineering]]></category>
		<category><![CDATA[Introspektion]]></category>
		<category><![CDATA[Reflection]]></category>
		<category><![CDATA[Runkit]]></category>
		<guid isPermaLink="false">https://nerdpress.org/?p=1128</guid>

					<description><![CDATA[<p>Während der Bastelei am DI-Container bin ich über die beiden Methoden ReflectionParameter::isOptional() und ReflectionParameter::isDefaultValueAvailable() gestoßen. Der kleine, undokumentierte und feine Unterschied ist folgender: Ein formaler Parameter einer Methode/Funktion ist immer optional, wenn er einen Initialwert zugewiesen bekommt (Fachausdruck &#8220;Polymorphie für Arme&#8221;). Nun kann es sein, dass eine Methode zwar optional ist, man den DefaultValue aber &#8230; </p>
<p class="link-more"><a href="https://nerdpress.org/2010/09/28/reflectionparameterisoptional-vs-reflectionparameterisdefaultvalueavailable/" class="more-link">Continue reading<span class="screen-reader-text"> "ReflectionParameter::isOptional() vs. ReflectionParameter::isDefaultValueAvailable()"</span></a></p>
The post <a href="https://nerdpress.org/2010/09/28/reflectionparameterisoptional-vs-reflectionparameterisdefaultvalueavailable/">ReflectionParameter::isOptional() vs. ReflectionParameter::isDefaultValueAvailable()</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></description>
										<content:encoded><![CDATA[<p>Während der Bastelei am <a href="https://nerdpress.org/2010/09/26/dependency-injection-mit-php-5-3-runkit-erweiterung-und-doctrine-2-annotationen/">DI-Container</a> bin ich über die beiden Methoden ReflectionParameter::isOptional() und ReflectionParameter::isDefaultValueAvailable() gestoßen. Der kleine, undokumentierte und feine Unterschied ist folgender:</p>
<p><span id="more-1128"></span></p>
<p>Ein formaler Parameter einer Methode/Funktion ist immer optional, wenn er einen Initialwert zugewiesen bekommt (Fachausdruck &#8220;Polymorphie für Arme&#8221;). Nun kann es sein, dass eine Methode zwar optional ist, man den DefaultValue aber nicht abfragen <strong>darf</strong>. ReflectionParameter::getDefaulValue() würde in diesem Falle eine Exception werfen. Dies kann bspw. bei internen Funktionen/Methoden (auch der Default-Constructor ist eine &#8220;interne&#8221; Methode) der Fall sein. Also Vorsicht bei Verwendung von ReflectionParameter::isOptional(), besser nochmal via ReflectionParameter::isDefaultValueAvailable() prüfen, ob man an den Parameter wirklich dran darf, bevor man ihn sich via ReflectionParameter::getDefaultValue() holt.</p>The post <a href="https://nerdpress.org/2010/09/28/reflectionparameterisoptional-vs-reflectionparameterisdefaultvalueavailable/">ReflectionParameter::isOptional() vs. ReflectionParameter::isDefaultValueAvailable()</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Cheat-Sheets für alle(s)</title>
		<link>https://nerdpress.org/2010/06/13/cheat-sheets-fur-alles/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sun, 13 Jun 2010 13:26:01 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[DB]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Bookmarks]]></category>
		<category><![CDATA[Cheat-Sheet]]></category>
		<category><![CDATA[Dokumentation]]></category>
		<category><![CDATA[Referenz]]></category>
		<guid isPermaLink="false">https://nerdpress.org/?p=1052</guid>

					<description><![CDATA[<p>Diesem Mann ist sicher nie langweilig: http://www.addedbytes.com/cheat-sheets/. Hinter diesem Link verbergen sich Cheat Sheets zum Selber-Ausdrucken für alles Denkbare.</p>
The post <a href="https://nerdpress.org/2010/06/13/cheat-sheets-fur-alles/">Cheat-Sheets für alle(s)</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></description>
										<content:encoded><![CDATA[<p>Diesem Mann ist sicher nie langweilig: <a href="http://www.addedbytes.com/cheat-sheets/">http://www.addedbytes.com/cheat-sheets/</a>. Hinter diesem Link verbergen sich Cheat Sheets zum Selber-Ausdrucken für alles Denkbare. </p>The post <a href="https://nerdpress.org/2010/06/13/cheat-sheets-fur-alles/">Cheat-Sheets für alle(s)</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Dependency Injection mit Symfony 1.x</title>
		<link>https://nerdpress.org/2010/05/27/dependency-injection-mit-symfony-1-x/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Thu, 27 May 2010 16:58:23 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software engineering]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Dependency Injection]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Inversion of Control]]></category>
		<category><![CDATA[IoC]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Service]]></category>
		<category><![CDATA[sfDependencyInjectionContainerPlugin]]></category>
		<category><![CDATA[Symfony Components]]></category>
		<guid isPermaLink="false">https://nerdpress.org/?p=987</guid>

					<description><![CDATA[<p>Beschreibung IoC Pattern anhand Grails Services und Kurze Einführung in die Symfony-Komponente "Dependency Injection".</p>
The post <a href="https://nerdpress.org/2010/05/27/dependency-injection-mit-symfony-1-x/">Dependency Injection mit Symfony 1.x</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></description>
										<content:encoded><![CDATA[<p>Durch meine ersten Gehversuche mit <a href="http://www.grails.org/">Grails</a> sowie einen interessanten Vortrag über JSF2 bin ich kürzlich über das Kürzel &#8220;<a href="http://de.wikipedia.org/wiki/Inversion_of_Control">IoC</a>&#8221; gestoßen. Das ganze ist vom Prinzip her recht einfach und in Grails, das im Grunde ein stinknormales MVC-Pattern implementiert, konkret gelöst, indem man durch eine Namenskonvention am Controller automatisch sogenannte Services instanziiert. </p>
<p><span id="more-987"></span></p>
<p>Also anstatt zu schreiben:</p>
<pre class="brush: groovy; title: ; notranslate">
class DefaultController {
  
  def mySuperService
  
  def index = {
   mySuperService = new MySuperService(params);
   mySuperService.getData()
  }
}
</pre>
<p>schreibe ich einfach</p>
<pre class="brush: groovy; title: ; notranslate">
class DefaultController {
 
  def mySuperService
 
  def index = {
   mySuperService.getData()
  }
}
</pre>
<p>Gut, sieht jetzt nicht besonders spektakulär aus, doch wenn man weiß, dass mySuperService im Hintergrund (Stichwort &#8220;Spring Managed Bean&#8221;) automatisch instanziiert sowie an meinen Controller gebunden wurde und dass da prinzipiell noch viel mehr <a href="http://www.grails.org/Services">geht</a>, ist das bereits ein ganz brauchbares Feature.</p>
<p>Natürlich ist die Injizierung per Naming-convention eine Grails-eigene Lösung (alles, was auf Service endet, ist ein Service und wird injiziert), um Konfigurationsarbeit zu sparen. Für gewöhnlich wird das Verhalten sogenanner &#8220;<a href="http://java.sun.com/javaee/6/docs/api/javax/annotation/ManagedBean.html">managed Beans</a>&#8221; natürlich konfiguriert, entweder Java-typisch via XML-Konfigurationsdatei oder durch <a href="http://de.wikipedia.org/wiki/Annotation#Informatik">Annotationen</a>.</p>
<p>Dabei kann wiederum java-typisch auch der &#8220;Scope&#8221; einer Bean bestimmt werden; hier bringt vor allem der &#8220;Singleton&#8221; bzw. Application Scope einen Vorteil gegenüber einer statuslosen PHP-Anwendung. Doch bereits die Fähigkeit, den Scope überhaupt fein granulieren zu können, setzt das ganze wieder von PHP-Gemurkse ala $_SESSION, $_REQUEST etc. ab. </p>
<p>Also egal wo und in welchem Kontext man Managed Beans, Enterprise Java Beans, Spring Beans (Die Unterschiede interessieren hier mal nicht die Bohne &#8211; ich könnte sie auch gar nicht qualifiziert erläutern) einsetzt &#8211; das IoC-Muster spart Code, vereinfacht Abhängigkeiten und sorgt für schlankere Konstruktoren &#8211; ist insgesamt also eine sehr mächtige Sache.</p>
<p>Was aber nicht heißt, dass so etwas generell nicht auch in meiner PHP-Anwendung funktionieren kann.</p>
<h3><strong>sfDependencyInjectionContainerPlugin</strong></h3>
<p>Dieses Plugin (<a href="http://www.symfony-project.org/plugins/sfDependencyInjectionContainerPlugin">http://www.symfony-project.org/plugins/sfDependencyInjectionContainerPlugin</a>) leistet genau das: Es verwaltet entweder über eine in PHP formulierte <a href="http://de.wikipedia.org/wiki/Dom%C3%A4nenspezifische_Sprache">DSL</a>(hust), über XML oder eine symfony-typische .yml-Datei konfigurierte Abhängigkeiten. Das Plugin ist selbst nur ein Adapter, das die <a href="http://components.symfony-project.org/">Symfony-Komponente</a> <a href="http://components.symfony-project.org/dependency-injection/">DependencyInjection</a> in ein Symfony 1.2 (und höher) Projekt integriert &#8211; in Symfony 2.0 wird DependencyInjection voraussichtlich Bestandteil des Systemkerns sein.</p>
<p>Zur Installation und Konfiguration des Plugins verweise ich auf die <a href="http://www.symfony-project.org/plugins/sfDependencyInjectionContainerPlugin">README</a>-Datei. Trotzdem vielleicht der Hinweis, dass die Bibliotheken mit einem eigenen Autoloader daherkommen, daher empfehle ich, folgende Programm-Zeilen in eure ProjectConfiguration.class.php hinzuzufügen:</p>
<p>config/projectConfiguration.class.php</p>
<pre class="brush: php; title: ; notranslate">
  require_once dirname(__FILE__) . '/../pfad/zur/DependencyInjection/Komponente/sfServiceContainerAutoloader.php';
  sfServiceContainerAutoloader::register();
</pre>
<p>Anders habe ich es nicht hinbekommen, zwar lässt sich durch eine config/autoload.yml die Laufzeit von Class Not Found-Fehlern befreien, aber das Symfony Command Line Interface geht dann trotzdem hops. Für einen Tipp, wie man&#8217;s eleganter hinkriegt, wäre ich dankbar.</p>
<p>Beispielsweise möchte ich den Nerdpress-RSS-Feed in meine Seite einbinden. Dazu baue ich einen Proxy, um bequem via AJAX auf das entfernte RSS-XML zugreifen zu können.<br />
Diesen Proxy definiere ich als Service und injiziere ihn meine Symfony-Module:</p>
<p>config/services.yml:</p>
<pre class="brush: jscript; title: ; notranslate">
services:
  NerdpressRssProxy:
    class: NerdpressRssProxy
</pre>
<p>Diese drei Zeilen reichen bereits aus, um meine Abhängigkeit zu definieren.</p>
<p>Nun implementiere ich die Service-Klasse:</p>
<p>lib/NerdpressRssProxy.php</p>
<pre class="brush: php; title: ; notranslate">
class NerdpressRssProxy
{
  /**
   * @var sfFileCache
   */
  protected $cache;

  /**
   * @return sfFileCache
   */
  public function getCache()
  {
    if (null === $this-&gt;cache)
    {
      $this-&gt;cache = new sfFileCache(array('cache_dir' =&gt; sfConfig::get('sf_cache_dir')));
    }
    return $this-&gt;cache;
  }

  /**
   * @return string
   * @throws Exception
   */
  public function getEntries()
  {
    $cache = $this-&gt;getCache();

    sfContext::getInstance()-&gt;getConfiguration()-&gt;loadHelpers(array('Helper', 'Tag', 'Url', 'Text'));

    if(!($rss = $cache-&gt;get('nerdpress_rss')))
    {
      if(($rss = @file_get_contents('https://nerdpress.org/feed')))
      {
        $rss = auto_link_text($rss, 'all', array('class' =&gt; 'external'));

        $cache-&gt;set('nerdpress_rss', $rss, 3600);
      }
      else
      {
        throw new Exception('Rss feed could not be opened');
      }
    }
    return $rss;
  }
}
</pre>
<p>Die Methode getEntries() rufe ich nun in meinem Nerdpress-RSS-Modul auf, um die WebResponse zu befüllen:</p>
<p>apps/frontend/modules/rssProxy/actions/actions.class.php</p>
<pre class="brush: php; title: ; notranslate">
class rssProxyActions extends sfActions
{
  public function preExecute()
  {
    $this-&gt;getResponse()-&gt;setContentType('application/rss+xml');
  }
  
  public function executeNerdpress(sfWebRequest $request)
  {
    try
    {
      // SERVICE HOLEN UND getEntries() AUFRUFEN
      $rss = $this-&gt;getService('NerdpressRssProxy')-&gt;getEntries();

      $this-&gt;getResponse()-&gt;setHttpHeader('Content-Length', mb_strlen($rss));
      $this-&gt;getResponse()-&gt;setContent($rss);
    }
    catch(Exception $e)
    {
      $this-&gt;forward404($e-&gt;getMessage());
    }
    return sfView::NONE;
  }
}
</pre>
<p>Das wars. Einfach, oder? Ingesamt 3 Zeilen yml-Konfiguration reichen, um Dependency Injection &#8220;the PHP way&#8221; zu realisieren, Symfony sei Dank. Natürlich ist nicht *ganz* so hübsch wie in der J2EE-Welt und sicherlich funktional noch weit davon entfernt. Aber ein Anfang ist gemacht, und wenn man seine Services erst einmal auf diese Art und Weise unter Kontrolle bringt, ist man vom Nutzen der Sache schnell überzeugt: Mit ein bisschen Disziplin gehören &#8220;Controller-Spaghettiwürste&#8221; nämlich der Vergangenheit an.</p>
<p>Bitte entschuldigt eventuell fehlerhafte oder unsaubere Beschreibungen der Begriffe &#8220;Bean&#8221;, &#8220;IoC&#8221;, JSF2 etc. Ich bitte explizit um Korrektur in Form von Kommentaren :)</p>The post <a href="https://nerdpress.org/2010/05/27/dependency-injection-mit-symfony-1-x/">Dependency Injection mit Symfony 1.x</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[Jquery]Namespaces via CSS-Selector adressieren</title>
		<link>https://nerdpress.org/2010/04/29/jquerynamespaces-via-selector-adressieren/</link>
					<comments>https://nerdpress.org/2010/04/29/jquerynamespaces-via-selector-adressieren/#comments</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Thu, 29 Apr 2010 21:38:59 +0000</pubDate>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[Selektor]]></category>
		<category><![CDATA[xml]]></category>
		<guid isPermaLink="false">https://nerdpress.org/?p=952</guid>

					<description><![CDATA[<p>Vielleicht braucht es mal jemand, jedenfalls lassen sich &#8220;genamespacete&#8221; Tags in einer DOM (XML)document Instanz recht einfach mittels \: als Separator adressieren. Ein Beispiel: Ich möchte ein Dublin-Core Metadatum aus einem beliebigen Feed lesen: (function($) { $('item').each(function() { $(arguments&#x5B;1]).find('dc\:creator').&#x5B;...]() } ); })(jQuery); Dies entspricht wohl rein syntaktisch nicht ganz dem entsprechendem CSS3-Proposal (einzusehen unter http://www.w3.org/TR/css3-selectors/#typenmsp). &#8230; </p>
<p class="link-more"><a href="https://nerdpress.org/2010/04/29/jquerynamespaces-via-selector-adressieren/" class="more-link">Continue reading<span class="screen-reader-text"> "[Jquery]Namespaces via CSS-Selector adressieren"</span></a></p>
The post <a href="https://nerdpress.org/2010/04/29/jquerynamespaces-via-selector-adressieren/">[Jquery]Namespaces via CSS-Selector adressieren</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></description>
										<content:encoded><![CDATA[<p>Vielleicht braucht es mal jemand, jedenfalls lassen sich &#8220;genamespacete&#8221; Tags in einer DOM (XML)document Instanz recht einfach mittels \: als Separator adressieren. Ein Beispiel: Ich möchte ein <a href="http://dublincore.org/">Dublin-Core</a> Metadatum aus einem beliebigen Feed lesen:</p>
<pre class="brush: jscript; title: ; notranslate">
(function($) {

  $('item').each(function() { $(arguments&#x5B;1]).find('dc\:creator').&#x5B;...]() } );

})(jQuery);
</pre>
<p>Dies entspricht wohl rein syntaktisch nicht ganz dem entsprechendem CSS3-Proposal (einzusehen unter <a href="http://www.w3.org/TR/css3-selectors/#typenmsp">http://www.w3.org/TR/css3-selectors/#typenmsp</a>). Ich habe beide Möglichkeiten interessehalber auch einmal in einem aktuellen FF3.6 und Chromium  getestet:</p>
<pre class="brush: css; title: ; notranslate">
&lt;style type=&quot;text/css&quot;&gt;
/*&lt;!&#x5B;CDATA&#x5B;*/
  @namespace hanswurst url(https://www.meins.int)

  hanswurst|kaese
  {
    color: red;
  }
/*]]&gt;*/
&lt;/style&gt;
&lt;hanswurst:kaese&gt;
  Hanswurst liebt käse
&lt;/hanswurst:kaese&gt;
</pre>
<p>Ergebnis: Naja, klappt nicht. Eventuell hat jemand eine Idee oder kann mich korrigieren?</p>The post <a href="https://nerdpress.org/2010/04/29/jquerynamespaces-via-selector-adressieren/">[Jquery]Namespaces via CSS-Selector adressieren</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></content:encoded>
					
					<wfw:commentRss>https://nerdpress.org/2010/04/29/jquerynamespaces-via-selector-adressieren/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>X-Sendfile + Apache 2 (Ubuntu)</title>
		<link>https://nerdpress.org/2010/03/24/x-sendfile-apache-2-ubuntu/</link>
					<comments>https://nerdpress.org/2010/03/24/x-sendfile-apache-2-ubuntu/#comments</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Wed, 24 Mar 2010 09:23:01 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software engineering]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Apache 2]]></category>
		<category><![CDATA[mod_xsendfile]]></category>
		<category><![CDATA[X-Sendfile]]></category>
		<guid isPermaLink="false">https://nerdpress.org/?p=857</guid>

					<description><![CDATA[<p>Ein recht verstecktes Feature, das neuere Server, bspw. Lighthttpd + FCGI-Modul bereits &#8220;out of the box&#8221; unterstützen, ist das anwendungsgesteuerte &#8220;Durchschleifen&#8221; von großen Dateien via X-Sendfile Header. Wozu es gut ist und wie man es benutzt,will ich im Folgenden kurz erläutern: Im Prinzip dasseselbe wie fpassthru(), aber eben ohne dass PHP den auszuliefernden Datenstrom komplett &#8230; </p>
<p class="link-more"><a href="https://nerdpress.org/2010/03/24/x-sendfile-apache-2-ubuntu/" class="more-link">Continue reading<span class="screen-reader-text"> "X-Sendfile + Apache 2 (Ubuntu)"</span></a></p>
The post <a href="https://nerdpress.org/2010/03/24/x-sendfile-apache-2-ubuntu/">X-Sendfile + Apache 2 (Ubuntu)</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></description>
										<content:encoded><![CDATA[<p>Ein recht verstecktes Feature, das neuere Server, bspw. Lighthttpd + FCGI-Modul bereits &#8220;out of the box&#8221; unterstützen, ist das anwendungsgesteuerte &#8220;Durchschleifen&#8221; von großen Dateien via X-Sendfile Header.</p>
<p>Wozu es gut ist und wie man es benutzt,will ich im Folgenden kurz erläutern:</p>
<p><span id="more-857"></span></p>
<p>Im Prinzip dasseselbe wie <a href="http://de.php.net/manual/de/function.fpassthru.php">fpassthru()</a>, aber eben ohne dass PHP den auszuliefernden Datenstrom komplett in den Speicher laden muss. Somit verbindet X-Sendfile die beiden Vorteile, dass bspw. Zugriffsberechtigungen applikationsseitig via PHP geprüft werden können und dass die Response selbst ausschließlich durch den darunterliegenden Server (in dem Fall Apache 2) ausliefert wird (und PHP komplett umgeht).</p>
<p>Somit ist es möglich, das PHP-eigene memory_limit zu umgehen und auch riesige Dateien zum (PHP-geschützten) Download bereitzustellen.</p>
<p>Für den Apachen gibt es zur Unterstützung dieses Features <a href="http://tn123.ath.cx/mod_xsendfile">mod_xsendfile</a>. Das Modul ist leider nicht in den offiziellen Ubuntu-Paketquellen enthalten, und auch dotdeb konnte mir bei meiner Suche nicht weiterhelfen. Die Übersetzung + Installation via apxs2 läuft aber unter Ubuntu problemlos (apxs2 ist jeweils in den Paketen apache2-prefork-dev und apache2-threaded-dev enthalten). Standard unter Ubuntu oder generell Gnu/Linux sollte &#8220;Prefork&#8221; sein.</p>
<pre class="brush: bash; title: ; notranslate">apxs -cia mod_xsendfile.c</pre>
<p>kompiliert das Modul und installiert es nach /usr/lib/apache2/modules. Anschließend erstellt man eine neue Konfigurationsdatei unter /etc/apache2/mods-available/mod_xsendfile.load mit folgendem Inhalt:</p>
<pre class="brush: plain; title: ; notranslate">
LoadModule xsendfile_module /usr/lib/apache2/modules/mod_xsendfile.so
&lt;Files *.php&gt;
  XSendFile on
  XSendFileAllowAbove on
&lt;/Files&gt;
</pre>
<p>Dann das Modul noch mit</p>
<pre class="brush: bash; title: ; notranslate">$ a2enmod xsendfile</pre>
<p>aktivieren.</p>
<p>So hats bei mir auf Anhieb funktioniert,  zu den einzelnen Einstellungsmöglichkeiten schaut man dann einfach nochmal in die <a href="http://tn123.ath.cx/mod_xsendfile/">Doku</a>.</p>
<p>Das PHP-Script sieht dann exemplarisch folgendermaßen aus:</p>
<pre class="brush: php; title: ; notranslate">
if($user-&gt;isAuthenticated())
{
  // Wir werden eine Binär-Datei ausgeben
  header('Content-type: application/octet-stream');

  // Es wird downloaded.pdf benannt
  header('Content-Disposition: attachment; filename=&quot;'.$file-&gt;getFilename().'&quot;');
  header('Content-Length: ' . $file-&gt;getSize());
  // PASS X-SENDFILE-HEADER.
  header('X-Sendfile: ' . $file-&gt;getPathname());
}
</pre>
<p>Das war einfach, oder?</p>The post <a href="https://nerdpress.org/2010/03/24/x-sendfile-apache-2-ubuntu/">X-Sendfile + Apache 2 (Ubuntu)</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></content:encoded>
					
					<wfw:commentRss>https://nerdpress.org/2010/03/24/x-sendfile-apache-2-ubuntu/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Die YQL Geo Library</title>
		<link>https://nerdpress.org/2010/03/13/die-yql-geo-library/</link>
		
		<dc:creator><![CDATA[Max Girkens]]></dc:creator>
		<pubDate>Sat, 13 Mar 2010 16:51:01 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[geo library]]></category>
		<category><![CDATA[geocoding services]]></category>
		<category><![CDATA[YQL]]></category>
		<guid isPermaLink="false">https://nerdpress.org/?p=844</guid>

					<description><![CDATA[<p>dieses erwähnenswerte Tool ist ein Javascript-Wrapper für die Geocoding Services: Yahoo Placemaker, Yahoo GeoPlanet, jsonip.appspot.com, IP location tools, W3C Geo location und Flickr.places.findByLatLon. Die Syntax ist mal denkbar einfach, denn das ganze beschränkt sich auf eine einzige Methode, nämlich: yqlgeo.get(what,callback) Damit geht neben dem Verorten von Strings à la GooglemapsAPI: yqlgeo.get('cologne, DE',function(o){ alert(o.place.name+' ('+ o.place.centroid.latitude+','+ &#8230; </p>
<p class="link-more"><a href="https://nerdpress.org/2010/03/13/die-yql-geo-library/" class="more-link">Continue reading<span class="screen-reader-text"> "Die YQL Geo Library"</span></a></p>
The post <a href="https://nerdpress.org/2010/03/13/die-yql-geo-library/">Die YQL Geo Library</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></description>
										<content:encoded><![CDATA[<p>dieses erwähnenswerte <a href="http://isithackday.com/hacks/geo/yql-geo-library/">Tool</a> ist ein Javascript-Wrapper für die Geocoding Services:<br />
<a href="http://developer.yahoo.com/geo/placemaker">Yahoo Placemaker</a>, <a href="http://developer.yahoo.com/geo/geoplanet/">Yahoo GeoPlanet</a>, <a href="http://jsonip.appspot.com/">jsonip.appspot.com</a>, <a href="http://iplocationtools.com/ip_location_api.php">IP location tools</a>, <a href="http://dev.w3.org/geo/api/spec-source.html">W3C Geo location</a> und <a href="http://www.flickr.com/services/api/flickr.places.findByLatLon.html">Flickr.places.findByLatLon</a>.</p>
<p>Die Syntax ist mal denkbar einfach, denn das ganze beschränkt sich auf eine einzige Methode, nämlich:</p>
<pre class="brush: jscript; title: ; notranslate">
yqlgeo.get(what,callback)
</pre>
<p><span id="more-844"></span><br />
Damit geht neben dem Verorten von Strings à la GooglemapsAPI:</p>
<pre class="brush: jscript; title: ; notranslate">
yqlgeo.get('cologne, DE',function(o){
  alert(o.place.name+' ('+
  o.place.centroid.latitude+','+
  o.place.centroid.longitude+
')');
})
</pre>
<p>&#8230;auch mal eben Verorten von IPs:</p>
<pre class="brush: jscript; title: ; notranslate">
yqlgeo.get('217.12.14.240',function(o){
  alert(o.place.name + ',' + o.place.country.content +
    ' (' + o.place.centroid.latitude + ',' +
    o.place.centroid.longitude + ')'
  );
});
</pre>
<p>&#8230;Usern, URLS und verlorengegangenen Schlüsseln.</p>
<p>Cooles Ding &#8211; Lohnt sich definitiv mal <a href="http://isithackday.com/hacks/geo/yql-geo-library/">anzuschauen</a>!</p>The post <a href="https://nerdpress.org/2010/03/13/die-yql-geo-library/">Die YQL Geo Library</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
