<?xml version='1.0'?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:atom="http://www.w3.org/2005/Atom" >
<channel>
	<title><![CDATA[Frdlweb: All site blogs}]]></title>
	<link>https://frdl.de/blog</link>
	<atom:link href="https://frdl.de/blog" rel="self" type="application/rss+xml" />
	<description><![CDATA[}]]></description>
		<item>
	<guid isPermaLink="true">https://frdl.de/blog/view/1483/webfan-ui-concept-4</guid>
	<pubDate>Thu, 09 Apr 2026 16:08:53 +0000</pubDate>
	<link>https://frdl.de/blog/view/1483/webfan-ui-concept-4</link>
	<title><![CDATA[Webfan UI - Concept 4]]></title>
	<description><![CDATA[<p>Webfan is now testing the new successor of an UI concept implementing components that has been around in the stack since years.</p><p>It is based in the following components or forks of them:</p><p>&nbsp;</p><ul><li><strong>StartDir\Html\Container</strong> Compiles and renders HTML. It uses<ul><li><a href="https://github.com/ivopetkov/html-server-components-compiler">ivopetkov/html-server-components-compiler</a> fork <a href="https://startdir.de/install/?source=Webfan%5CWebfat%5CHTMLServerComponentsCompiler">Webfan\Webfat\HTMLServerComponentsCompiler</a> and the <i><strong>insane</strong></i> PHP-NodeJs-styler <a href="https://startdir.de/install/?source=Webfan%5CScript%5CModules">Webfan\Script\Modules</a></li><li><a href="https://github.com/krzksz/phCompile">krzksz/phcompile</a> for <i><strong>Angularifary</strong></i>!</li></ul></li><li><i><strong>Angularifary </strong>scopify-fetch </i><a href="https://cdn.frdl.de/@webfan3/website/patches/angularjs-make-app.js">Directive</a> is used to asynchronous update the pre-rendered Server-HTML in the browser:&nbsp; Example: <code>&lt;span&nbsp;</code><br /><code>&nbsp;scopify-fetch</code><br /><code>&nbsp; url="https://webfan.de/@&lt;?php echo $component-&gt;subject; ?&gt;/actor.json"</code><br /><code>&nbsp; interval="35"&nbsp;</code><br /><code>&nbsp; increaseinterval="15"&nbsp;</code><br /><code>&nbsp; global&nbsp;</code><br /><code>&nbsp; removemissing="false"&nbsp;</code><br /><code>&nbsp; assign="ItemActor"</code><br /><code>&nbsp; transform="actorTransform"&nbsp;</code><br /><code>&gt;&lt;/span&gt;</code>&nbsp;</li><li><a href="https://github.com/mmamedov/page-cache"><strong>mmamedov/page-cache</strong></a> is &nbsp;needed in the front/top of the UI-Controller as the above rendering can be <i><strong>extremely slow</strong></i>!!!</li></ul><p>&nbsp;</p><p><strong>Example Code-Snippet:</strong></p><p>First register shut down function to output the HTML-Document finally:&nbsp;</p><blockquote><p>$ShutdownTasks = \frdlweb\Thread\ShutdownTasks::mutex();<br />$ShutdownTasks(function($ItemUpdater){<br />&nbsp;&nbsp;&nbsp;&nbsp;$str = @$ItemUpdater-&gt;context()-&gt;html()-&gt;compileScope( Config::get('context.scope') );<br />&nbsp;$str = str_replace(['&lt;/head&gt;'], ['&lt;/head&gt;&lt;body&gt;'], $str).'&lt;/body&gt;';<br />&nbsp;echo '&lt;!DOCTYPE html&gt;<br />&lt;html&gt;'.$str.'&lt;/html&gt;';<br />}, $ItemUpdater);</p></blockquote><p>Then write HTML:&nbsp;</p><blockquote><p>$ItemUpdater::context()-&gt;html()-&gt;write('<br />&nbsp;&lt;component src="file:'.__DIR__.'/template-main.php" subject="'.getenv('WEBFINGER_HANDLE').'" description="'.$ItemUpdater-&gt;getItem()-&gt;getData()['description'].'" /&gt;<br />');</p></blockquote><p>&nbsp;</p>]]></description>
	<dc:creator>Melanie Wehowski</dc:creator>		</item>
<item>
	<guid isPermaLink="true">https://frdl.de/blog/view/1463/detect-location-of-homepage-visitor-by-ip</guid>
	<pubDate>Sun, 01 Feb 2026 13:30:29 +0000</pubDate>
	<link>https://frdl.de/blog/view/1463/detect-location-of-homepage-visitor-by-ip</link>
	<title><![CDATA[Detect location of homepage visitor (by IP)]]></title>
	<description><![CDATA[<p>On our websites we may detect the visitors location (e.g. city), for example to suggest search queries. <span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">In this article it is documented how we do this, simple and short for transparancy and re-use.</span></span></p><p><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"><strong>Example HTML+javascript:</strong></span></span></p><blockquote><p><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&lt;div style="display:inline-block;min-height:100px;max-width:400px;"&gt;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&lt;a name="server_location_suggestion"&gt;&lt;/a&gt;</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&lt;div id="serverLocationSuggestion" style="font-size:1.1em;"&gt;&lt;span id="serverLocationSuggestionLoading"&gt;loading/laden...&lt;/span&gt;&lt;/div&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&lt;/div&gt;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></p><p><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&lt;script&gt;</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">(async()=&gt;{</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;var j = await fetch('https://webfan.website/rating/myip.json');</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;var d = await j.json();</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;var el = document.getElementById('serverLocationSuggestion');</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById('serverLocationSuggestionLoading').style.display='none';</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;if(d.city &amp;&amp; d.city.name &amp;&amp; 'string' === typeof d.city.name &amp;&amp; d.city.name.length &gt; 0){</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var l = navigator.language.substr(0,2);</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var a = document.createElement('a');</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var p = document.createElement('p');</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.innerHTML = 'de' !== l</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;? 'Search in instances and websites for &lt;strong&gt;&amp;quot;' + d.city.name + '&amp;quot;&lt;/strong&gt;...🔍'</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;: 'Nach &lt;strong&gt;&amp;quot;' + d.city.name + '&amp;quot;&lt;/strong&gt; in Instanzen und Webseiten suchen...🔍';</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.href= 'https://startdir.de/server/?search=' + encodeURIComponent(d.city.name);</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.appendChild(a);</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el.appendChild(p);</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a = document.createElement('a');</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = document.createElement('p');</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.innerHTML = 'de' !== l</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;? 'Search in accounts for &lt;strong&gt;&amp;quot;' + d.city.name + '&amp;quot;&lt;/strong&gt;...🔍'</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;: 'Nach &lt;strong&gt;&amp;quot;' + d.city.name + '&amp;quot;&lt;/strong&gt; in Accounts suchen...🔍';</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.href= 'https://startdir.de/fediverse/?search=' + encodeURIComponent(d.city.name);</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.appendChild(a);</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el.appendChild(p);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a = document.createElement('a');</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = document.createElement('p');</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.innerHTML = 'de' !== l</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;? 'Search in classifieds ads for &lt;strong&gt;&amp;quot;' + d.city.name + '&amp;quot;&lt;/strong&gt;...🔍'</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;: 'Nach &lt;strong&gt;&amp;quot;' + d.city.name + '&amp;quot;&lt;/strong&gt; in Kleinanzeigen suchen...🔍';</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.href= 'https://an-und-verkaufen.de/netzwerk/?q=' + encodeURIComponent(d.city.name);</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.appendChild(a);</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el.appendChild(p);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;}else{</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el.parentNode.style.display='none';</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">})();</span></span><br /><span style="background-color:rgb(255,255,255);color:rgb(45,48,71);"><span style="-webkit-text-stroke-width:0px;display:inline !important;float:none;font-family:BlinkMacSystemFont, -apple-system, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;">&lt;/script&gt;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></p></blockquote><p><strong>myip.json</strong></p><ol><li>Download the Geo-Data (daily): <i>$geoDBfile = __DIR__.\DIRECTORY_SEPARATOR.'..'.\DIRECTORY_SEPARATOR.'..'.\DIRECTORY_SEPARATOR.'GeoLite2-City.mmdb';</i><br /><i>$geoDBfile_archive = &nbsp;__DIR__.\DIRECTORY_SEPARATOR.'..'.\DIRECTORY_SEPARATOR.'..'.\DIRECTORY_SEPARATOR.'GeoLite2-City.mmdb.gz';</i><br />if('cli'===\PHP_SAPI){<br /><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!file_exists($geoDBfile) || filemtime($geoDBfile) &lt; time() - 1 * 24 * 60 * 60){</i><br /><i>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;file_put_contents($geoDBfile_archive, file_get_contents('https://github.com/wp-statistics/GeoLite2-City/raw/refs/heads/master/GeoLite2-City.mmdb.gz'));&nbsp;&nbsp;&nbsp;&nbsp;</i><br /><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$file_name = $geoDBfile_archive;</i><br /><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$buffer_size = 4096;&nbsp;</i><br /><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$out_file_name = $geoDBfile;&nbsp;</i><br /><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$file = gzopen($file_name, 'rb');</i><br /><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlink($out_file_name);</i><br /><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$out_file = fopen($out_file_name, 'wb');&nbsp;</i><br /><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (!gzeof($file)) { &nbsp;&nbsp;</i><br /><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fwrite($out_file, gzread($file, $buffer_size));</i><br /><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</i><br /><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</i><br /><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose($out_file);</i><br /><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gzclose($file);</i><br /><i>&nbsp;&nbsp;&nbsp;&nbsp;}</i><br /><i>}</i></li><li><p>myip.json&nbsp;&nbsp;</p><p>use GeoIp2\Database\Reader; &nbsp;&nbsp;</p><p>$cityDbReader = new Reader($geoDBfile); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p><p>$rr = $cityDbReader-&gt;city($_SERVER['REMOTE_ADDR']);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;$data=object_to_array($rr); &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;\StartDir\Helpers::cors();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;header('Content-Type: application/json');&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;echo json_encode($data);</p><p>&nbsp;</p></li><li>Dependency: <a href="https://github.com/maxmind/GeoIP2-php">https://github.com/maxmind/GeoIP2-php</a></li></ol>]]></description>
	<dc:creator>Melanie Wehowski</dc:creator>		</item>
<item>
	<guid isPermaLink="true">https://frdl.de/blog/view/1413/melanie-browser</guid>
	<pubDate>Tue, 30 Sep 2025 15:12:01 +0000</pubDate>
	<link>https://frdl.de/blog/view/1413/melanie-browser</link>
	<title><![CDATA[Melanie Browser]]></title>
	<description><![CDATA[<p><i>Blogartikel von elgg (Frdlweb)</i></p><p>Der <a href="https://browse.webfan3.de/"><strong>Melanie Browser</strong></a> ist im Prinzip ein Proxy(-Server) aus einer privaten Testerei entstanden, nun hauptsächlich ein Proxy für <a href="https://search.webfan.de/">die Webfan Metasuchmaschine(n)</a>.</p><p>Target Hosts müssen in einer Whitelist erlaubt sein, es gib öffentliche/public targets/routes und welche nur für Webfan-User und private Routes.</p><p>Es gibt folgende Rule-/Proxy-Types:</p><ul><li>redirect</li><li>fetchframe</li><li>iframe</li><li>proxy</li><li>newwindow</li></ul><p>&nbsp;</p>]]></description>
	<dc:creator>Melanie Wehowski</dc:creator>		</item>
<item>
	<guid isPermaLink="true">https://frdl.de/blog/view/1225/webfanjs-frdlwebjs-markdown-components</guid>
	<pubDate>Mon, 25 Dec 2023 21:37:40 +0000</pubDate>
	<link>https://frdl.de/blog/view/1225/webfanjs-frdlwebjs-markdown-components</link>
	<title><![CDATA[webfan.js | Frdlweb.js - Markdown Components]]></title>
	<description><![CDATA[<p>The <a href="https://frdlweb.de/cdn/index#examples">framework</a> parses everything that is in the innerHTML of an element wich has the attribute or the class <code>frdl-markdown</code> as <a href="https://de.wikipedia.org/wiki/Markdown">markdown</a> and then purifies the HTML result. So for example:</p><blockquote><p>&lt;div frdl-markdown&gt;</p><p>**fat**</p><p>&lt;/div&gt;</p></blockquote><p>…will be parsed into:</p><blockquote><p>&lt;div frdl-markdown&gt;</p><p>&lt;b&gt;fat&lt;/b&gt;</p><p>&lt;/div&gt;</p></blockquote><p>…and the result looks like:</p><blockquote><p><strong>fat</strong></p></blockquote>]]></description>
	<dc:creator>Melanie Wehowski</dc:creator>		</item>
<item>
	<guid isPermaLink="true">https://frdl.de/blog/view/1213/darkmode-added-to-the-framework</guid>
	<pubDate>Sat, 23 Dec 2023 19:21:06 +0000</pubDate>
	<link>https://frdl.de/blog/view/1213/darkmode-added-to-the-framework</link>
	<title><![CDATA[Darkmode added to the framework]]></title>
	<description><![CDATA[<p>Thanks to <a href="https://www.npmjs.com/package/darkmode-js">darkmode-js</a>, a darkmode was added to the framework:</p><blockquote><p>&nbsp;&nbsp;&nbsp;&nbsp;async function darkmode(Webfan){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(true !== Webfan.c.website.darkmode.enabled &amp;&amp; 'true' !== Webfan.c.website.darkmode.enabled){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;return;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(new Webfan.Darkmode(Webfan.c.website.darkmode.options)).showWidget();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(err){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;console.warn(err);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</p></blockquote><p><a href="https://frdl.de/blog/view/1208/webfanjs-webfan-websitejs-configuration-parameters">Read here how you can change the options: https://frdl.de/blog/view/1208/webfanjs-webfan-websitejs-configuration-parameters</a></p><p>&nbsp;</p>]]></description>
	<dc:creator>Melanie Wehowski</dc:creator>		</item>
<item>
	<guid isPermaLink="true">https://frdl.de/blog/view/1208/webfanjs-frdlwebjs-configuration-parameters</guid>
	<pubDate>Sat, 23 Dec 2023 19:17:39 +0000</pubDate>
	<link>https://frdl.de/blog/view/1208/webfanjs-frdlwebjs-configuration-parameters</link>
	<title><![CDATA[webfan.js | Frdlweb.js Configuration Parameters]]></title>
	<description><![CDATA[<p>As you may have noticed we have appended the <a href="https://frdlweb.de/cdn/index#examples">injection-Url for the webfan.js in the example</a> by a “configuration query”:<br />&nbsp;</p><pre><code class="language-plaintext">'DEBUG.enabled=true&amp;website.consent.ads=false&amp;angularjs.html5mode.rewriteLinks=false&amp;angularjs.html5mode.enabled=false'</code></pre><p>These query-attributes are objects in the “dot-notation”. You can <strong>alter the query</strong> and it will be <strong>merged</strong> into the configuration object.</p><p>To get <strong>the defaults</strong> of the configuration object and to get wich attributes/members you can use/alter, you can read and study this file:</p><p><a href="https://cdn.startdir.de/@webfan3/common/config-defaults.js">https://cdn.startdir.de/@webfan3/common/config-defaults.js</a>&nbsp;</p><blockquote><p>…</p><p>DEF.angularjs.html5mode.enabled = true; //null !== document.querySelector('base');</p><p>DEF.angularjs.html5mode.requireBase = null !== document.querySelector('base');</p><p>DEF.angularjs.html5mode.rewriteLinks = null !== document.querySelector('a[ui-sref]');</p><p>…</p></blockquote><p>It will be compiled into every current webpack built.</p><p>You can edit this options runtime as described above.</p>]]></description>
	<dc:creator>Melanie Wehowski</dc:creator>		</item>
<item>
	<guid isPermaLink="true">https://frdl.de/blog/view/1169/rss-viewer-frdlwebjs-component</guid>
	<pubDate>Sun, 26 Nov 2023 05:39:10 +0000</pubDate>
	<link>https://frdl.de/blog/view/1169/rss-viewer-frdlwebjs-component</link>
	<title><![CDATA[RSS Viewer - Frdlweb.js Component]]></title>
	<description><![CDATA[<p>Display merged RSS Feed items in random order (example limited to 60 items displayed initially, loads more on scrolling):</p><blockquote><p>&lt;div webfan-rss-feeds="https://www.tagesschau.de/index~rss2.xml https://www.tagesschau.de/investigativ/index~rss2.xml https://www.tagesschau.de/faktenfinder/index~rss2.xml https://www.tagesschau.de/wissen/technologie/index~rss2.xml" webfan-rss-headline="h3" webfan-rss-max-items="60"&gt;&lt;/div&gt;</p></blockquote><p>The <a href="https://cdn.startdir.de/">webfan.js</a> has to be injected to run the component.</p><p><strong>Customize item sorting</strong></p><p>There are 3 modes of sort order available:</p><ul><li>rand : random order (default)</li><li>asc: oldest items first</li><li>desc: newest items first</li></ul><p>You can configure the sorting by the <code>webfan-rss-sorting</code>-attribute of the component.&nbsp;</p><p>Example to display neswest items first:</p><blockquote><p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;div webfan-rss-feeds="https://example.com/feed1.rss https://example.com/otherfeed2.rss"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;webfan-rss-headline="h4" webfan-rss-max-items="5" webfan-rss-sorting="desc" style="max-height:1536px;"&gt;&lt;/div&gt;</p></blockquote><p><strong>@Todo:</strong></p><p>To provide the correct order by timestamps after merging the feeds, in the next version we will implement our <code>@frdl/sort</code>package! It is available via npm:&nbsp;</p><p><code>npm i @frdl/sort</code></p><p><a href="https://www.npmjs.com/package/@frdl/sort">https://www.npmjs.com/package/@frdl/sort</a></p><p>It is just not implemented yet due to my time on other projects.</p>]]></description>
	<dc:creator>Melanie Wehowski</dc:creator>		</item>
<item>
	<guid isPermaLink="true">https://frdl.de/blog/view/247/introducing-io4webfat-facades</guid>
	<pubDate>Sun, 17 Sep 2023 03:52:10 +0000</pubDate>
	<link>https://frdl.de/blog/view/247/introducing-io4webfat-facades</link>
	<title><![CDATA[Introducing IO4/Webfat Facades]]></title>
	<description><![CDATA[<p><strong>Import shortcuts and facades into ANY namespace</strong></p><p>You can now import the <a href="https://github.com/frdlweb/webfat/blob/e1949d2d55ccb984b168e11c0a7f0262799367b6/public/index.php#L5534">facades</a> into ANY namespace.</p><p>So this works:</p><blockquote><p>&nbsp;&nbsp;&lt;?php</p><p>namespace MyNamespace1;</p><p>&nbsp;&nbsp;echo &nbsp; Helper::toUUID4() ;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;echo '-';&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;echo Config::get('appId');&nbsp;&nbsp;&nbsp;&nbsp;</p></blockquote><p>…and this works also…:</p><blockquote><p>&nbsp;&nbsp;&lt;?php</p><p>namespace MyOtherNamespace2;</p><p>&nbsp;&nbsp;echo &nbsp; Helper::toUUID4() ;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;echo '-';&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;echo Config::get('appId');&nbsp;&nbsp;&nbsp;&nbsp;</p></blockquote><p>The snippet from container-entry “script@inc.common.bootstrap” does it and it now looks like</p><blockquote><p>&lt;?php</p><p>if($container-&gt;has('config.IO4_FACADES_ENABLE') &amp;&amp; true === $container-&gt;get('config.IO4_FACADES_ENABLE')<br />&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; $container-&gt;has('config.app.core.code.facades.$import')<br />&nbsp;&nbsp;&nbsp;&nbsp;){<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;$import = $container-&gt;get('config.app.core.code.facades.$import');<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;$container-&gt;get('app.runtime.stubrunner')-&gt;withFacades(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; $import['baseName'],&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; $import['namespace']&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;);<br />&nbsp;}&nbsp;</p></blockquote><p>It uses the “<a href="https://github.com/johnstevenson/statical">statical library</a>”.</p>]]></description>
	<dc:creator>Melanie Wehowski</dc:creator>		</item>
<item>
	<guid isPermaLink="true">https://frdl.de/blog/view/205/introducing-webfat-scoped-frdl-home</guid>
	<pubDate>Thu, 17 Aug 2023 04:13:23 +0000</pubDate>
	<link>https://frdl.de/blog/view/205/introducing-webfat-scoped-frdl-home</link>
	<title><![CDATA[Introducing Webfat &quot;Scope/d&quot; - FRDL_HOME]]></title>
	<description><![CDATA[<p>The environment variable “FRDL_HOME” defines the global root directory of the frdl-context (the directory where the apps global scope lives in, different to the public www webdirectory).</p><p>You can now customize the scope by the init method or the environment variable “IO4_WORKSPACE_SCOPE”.</p><p>IO4_WORKSPACE_SCOPE can have the values</p><ul><li>@cwd - current working directory - getcwd()</li><li>&nbsp;@www - &nbsp; public www web directory - $_SERVER['DOCUMENT_ROOT']</li><li>@global - USER HOME (Users HOME of current process or webspace) - the first directory in the cwd path wich is readable and writable by the current PHP process.</li><li>@www@parent - the superior directory of &nbsp;$_SERVER['DOCUMENT_ROOT']</li><li>@www@root' - &nbsp;the first directory in the $_SERVER['DOCUMENT_ROOT'] path wich is readable and writable by the current PHP process.</li><li><i>custom directory</i> - set a path/directory in IO4_WORKSPACE_SCOPE</li></ul><p><a href="https://github.com/frdlweb/webfat/blob/4aa209234da5bbf700cc127843d43cb8227e581e/public/index.php#L4354">Code from Webfat:</a></p><blockquote><p>if(null === $scope){<br />&nbsp;$scope = !empty(getenv('IO4_WORKSPACE_SCOPE')) ? getenv('IO4_WORKSPACE_SCOPE') : null;<br />}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />switch($scope){<br />&nbsp;&nbsp;&nbsp;&nbsp;case '@cwd' :<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$__home = &nbsp;getcwd();<br />&nbsp;&nbsp;&nbsp;&nbsp; break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;case '@www' :<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$__home = &nbsp;$_SERVER['DOCUMENT_ROOT'];<br />&nbsp;&nbsp;&nbsp;&nbsp; break;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;case '@www@root' :<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$__home = &nbsp;$getRootDir($_SERVER['DOCUMENT_ROOT']);<br />&nbsp;&nbsp;&nbsp;&nbsp; break;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;case '@www@parent' :<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$__home = &nbsp;dirname($_SERVER['DOCUMENT_ROOT']);<br />&nbsp;&nbsp;&nbsp;&nbsp; break;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;case '@global' :<br />&nbsp;&nbsp;&nbsp;&nbsp;case null :<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$__home = $HOME_DEFAULT;<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;default :<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $__home = is_dir(getenv('IO4_WORKSPACE_SCOPE')) ? getenv('IO4_WORKSPACE_SCOPE') : $HOME_DEFAULT;<br />&nbsp;&nbsp;&nbsp;&nbsp; break;<br />}<br />&nbsp;</p><p>$__home = @is_readable($__home) &amp;&amp; @is_writable($__home) ? $__home : $getRootDir($_SERVER['DOCUMENT_ROOT']);</p><p>$_ENV['FRDL_HOME'] = $__home;&nbsp;&nbsp;&nbsp;&nbsp;<br />putenv('FRDL_HOME='.$_ENV['FRDL_HOME']);</p></blockquote><p>&nbsp;</p>]]></description>
	<dc:creator>Melanie Wehowski</dc:creator>		</item>
<item>
	<guid isPermaLink="true">https://frdl.de/blog/view/171/transforms-php</guid>
	<pubDate>Mon, 31 Jul 2023 15:14:22 +0000</pubDate>
	<link>https://frdl.de/blog/view/171/transforms-php</link>
	<title><![CDATA[Transforms (PHP)]]></title>
	<description><![CDATA[<p>Transforms for multiple purposes. (E.g. transports, migrations, …)</p><blockquote><pre><code class="language-plaintext">namespace Webfan\Transform;

interface TransformInterface
 {
	const RIGHT = 1;
	const LEFT = -1;	
    public function detect($payload) : int;
    public function up($payload);	
	public function down($payload); 
	public function __invoke($payload);
 }</code></pre></blockquote><p>&nbsp;</p><p>Examples in the <a href="https://webfan.de/install/?source=Webfan%5CRemoteObjectProxyClientFactory">RemoteObjects API</a>:</p><blockquote><p>use Webfan\Transform\Sequence;<br />use Webfan\Transform\UrlsafeBinaryTransform;<br />use Webfan\Transform\OpisTranform;<br />use Webfan\Transform\TransformCallbacks;</p></blockquote><p>Transform in <a href="https://registry.frdl.de/?goto=php%3AWebfan%5CTransform">the registry</a></p><p>&nbsp;</p>]]></description>
	<dc:creator>Melanie Wehowski</dc:creator>		</item>
</channel>
</rss>
