<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>PHP on bramp.net</title>
    <link>https://blog.bramp.net/</link>
    <description>Recent content in PHP on bramp.net</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-GB</language>
    <lastBuildDate>Mon, 03 Sep 2012 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://blog.bramp.net/tags/php/" rel="self" type="application/rss+xml" />
    
    <item>
      <title>RFC 1123 dates in PHP</title>
      <link>https://blog.bramp.net/post/2012/09/03/rfc-1123-dates-in-php/</link>
      <pubDate>Mon, 03 Sep 2012 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2012/09/03/rfc-1123-dates-in-php/</guid>
      <description><p>While playing with <a href="http://redbot.org/">REDbot</a> I realised my last-modified headers (being sent by PHP) were not RFC 1123 complaint. A complaint date looks like <code>Sun, 06 Nov 1994 08:49:37 GMT</code>. There are two ways to generate such a date in PHP;</p>
<ol>
<li>
<p>if you have pecl_http &gt;= 0.1.0, then</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="nx">http_date</span><span class="p">(</span><span class="nv">$timestamp</span><span class="p">)</span>
</span></span></code></pre></div></li>
<li>
<p>or if you don’t want to use pecl</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="nx">gmdate</span><span class="p">(</span><span class="s1">&#39;D, d M Y H:i:s&#39;</span><span class="p">,</span> <span class="nv">$timestamp</span><span class="p">)</span><span class="o">.</span><span class="s1">&#39; GMT&#39;</span>
</span></span></code></pre></div></li>
<li>
<p>or if you have PHP &gt;5.2 you can use the DateTime constant</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="nx">gmdate</span><span class="p">(</span><span class="nx">DATE_RFC2822</span><span class="p">,</span> <span class="nv">$timestamp</span><span class="p">)</span>
</span></span></code></pre></div></li>
</ol>
<p>an example of it’s use:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="nx">header</span><span class="p">(</span><span class="s1">&#39;Last-Modified: &#39;</span> <span class="o">.</span> <span class="nx">gmdate</span><span class="p">(</span><span class="s1">&#39;D, d M Y H:i:s&#39;</span><span class="p">,</span> <span class="nv">$lastModified</span><span class="p">)</span><span class="o">.</span><span class="s1">&#39; GMT&#39;</span><span class="p">);</span>
</span></span></code></pre></div></description>
    </item>
    
    <item>
      <title>PHP Polygon Clipper using the Sutherland-Hodgman algorithm</title>
      <link>https://blog.bramp.net/post/2011/11/26/php-polygon-clipper-using-the-sutherland-hodgman-algorithm/</link>
      <pubDate>Sat, 26 Nov 2011 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2011/11/26/php-polygon-clipper-using-the-sutherland-hodgman-algorithm/</guid>
      <description><p>I wrote a PHP implementation of the polygon clipping algorithm by Sutherland-Hodgman. Available below, or from <a href="https://gist.github.com/bramp/1396058#file-clip-class-php">github</a>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="cl"><span class="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd"> * Polygon Clipping
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @author Andrew Brampton me &lt;at&gt; bramp &lt;dot&gt; net
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @url http://bramp.net/blog/2011/11/php-polygon-clipper-using-the-sutherland-hodgman-algorithm/
</span></span></span><span class="line"><span class="cl"><span class="sd"> *
</span></span></span><span class="line"><span class="cl"><span class="sd"> * Based on the Sutherland-Hodgman algorithm (1974).
</span></span></span><span class="line"><span class="cl"><span class="sd"> * http://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm
</span></span></span><span class="line"><span class="cl"><span class="sd"> *
</span></span></span><span class="line"><span class="cl"><span class="sd"> * This approache assumes four clip edges (the bounding box).
</span></span></span><span class="line"><span class="cl"><span class="sd"> * The original algorithm iterated though each clip edge, and then each point. Instead
</span></span></span><span class="line"><span class="cl"><span class="sd"> * we iterate each point, and then clip edge. This reduces the memory usage. TODO Measure if that is useful!
</span></span></span><span class="line"><span class="cl"><span class="sd"> *
</span></span></span><span class="line"><span class="cl"><span class="sd"> * Usage:
</span></span></span><span class="line"><span class="cl"><span class="sd"> *   require(&#39;clip.class.php&#39;);
</span></span></span><span class="line"><span class="cl"><span class="sd"> * 
</span></span></span><span class="line"><span class="cl"><span class="sd"> *   // Create a cliper with bounds defined by the points (x1, y1)-(x2,y2);
</span></span></span><span class="line"><span class="cl"><span class="sd"> *   $clip = new SutherlandHodgman($x1, $y1, $x2, $y2);
</span></span></span><span class="line"><span class="cl"><span class="sd"> * 
</span></span></span><span class="line"><span class="cl"><span class="sd"> *   // Create array of 2 tuple coordinates
</span></span></span><span class="line"><span class="cl"><span class="sd"> *   $points = { {x1, y1}, {x2, y2} ... {xN, yN} }&#39;
</span></span></span><span class="line"><span class="cl"><span class="sd"> *
</span></span></span><span class="line"><span class="cl"><span class="sd"> *   // Clip! The resulting array will only have points within the bounds
</span></span></span><span class="line"><span class="cl"><span class="sd"> *   $points = $clip-&gt;clip($points);
</span></span></span><span class="line"><span class="cl"><span class="sd"> *
</span></span></span><span class="line"><span class="cl"><span class="sd"> */</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">abstract</span> <span class="k">class</span> <span class="nc">Edge</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">var</span> <span class="nv">$bound</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">function</span> <span class="fm">__construct</span><span class="p">(</span><span class="nv">$bound</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">bound</span> <span class="o">=</span> <span class="nv">$bound</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd">	 * Is point $p inside the bounds. Techinically is it on the inside
</span></span></span><span class="line"><span class="cl"><span class="sd">	 * of the infinite edge defined by $bound
</span></span></span><span class="line"><span class="cl"><span class="sd">	 *
</span></span></span><span class="line"><span class="cl"><span class="sd">	 * @param point $p
</span></span></span><span class="line"><span class="cl"><span class="sd">	 */</span>
</span></span><span class="line"><span class="cl">	<span class="k">abstract</span> <span class="k">function</span> <span class="nf">inside</span><span class="p">(</span><span class="nv">$p</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd">	 * Finds the intersection with the bounds, on the line p1-p2
</span></span></span><span class="line"><span class="cl"><span class="sd">	 *
</span></span></span><span class="line"><span class="cl"><span class="sd">	 * @param point $p1 The point inside the bounds
</span></span></span><span class="line"><span class="cl"><span class="sd">	 * @param point $p2 The point outside the bounds
</span></span></span><span class="line"><span class="cl"><span class="sd">	 */</span>
</span></span><span class="line"><span class="cl">	<span class="k">abstract</span> <span class="k">function</span> <span class="nf">intersect</span><span class="p">(</span><span class="nv">$p1</span><span class="p">,</span> <span class="nv">$p2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">abstract</span> <span class="k">class</span> <span class="nc">HorzEdge</span> <span class="k">extends</span> <span class="nx">Edge</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd">	 * Returns the point at which the line $p1-$p2 hits the horz boundary
</span></span></span><span class="line"><span class="cl"><span class="sd">	 *
</span></span></span><span class="line"><span class="cl"><span class="sd">	 * @param point $p1
</span></span></span><span class="line"><span class="cl"><span class="sd">	 * @param point $p2
</span></span></span><span class="line"><span class="cl"><span class="sd">	 *
</span></span></span><span class="line"><span class="cl"><span class="sd">	 * @return point
</span></span></span><span class="line"><span class="cl"><span class="sd">	 */</span>
</span></span><span class="line"><span class="cl">	<span class="k">function</span> <span class="nf">intersect</span><span class="p">(</span><span class="nv">$p1</span><span class="p">,</span> <span class="nv">$p2</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nv">$dY</span> <span class="o">=</span> <span class="nv">$p2</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="nv">$p1</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="k">if</span> <span class="p">(</span><span class="nv">$dY</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="k">return</span> <span class="k">array</span><span class="p">(</span><span class="nv">$p1</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">bound</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="nv">$dX</span> <span class="o">=</span> <span class="nv">$p2</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="nv">$p1</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">		<span class="nv">$dY2</span> <span class="o">=</span> <span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">bound</span> <span class="o">-</span> <span class="nv">$p1</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="k">array</span><span class="p">((</span><span class="nv">$dY2</span> <span class="o">/</span> <span class="nv">$dY</span><span class="p">)</span> <span class="o">*</span> <span class="nv">$dX</span> <span class="o">+</span> <span class="nv">$p1</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">bound</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">abstract</span> <span class="k">class</span> <span class="nc">VertEdge</span> <span class="k">extends</span> <span class="nx">Edge</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd">	* Returns the point at which the line $p1-$p2 hits the vertical boundary
</span></span></span><span class="line"><span class="cl"><span class="sd">	*
</span></span></span><span class="line"><span class="cl"><span class="sd">	* @param point $p1
</span></span></span><span class="line"><span class="cl"><span class="sd">	* @param point $p2
</span></span></span><span class="line"><span class="cl"><span class="sd">	*
</span></span></span><span class="line"><span class="cl"><span class="sd">	* @return point
</span></span></span><span class="line"><span class="cl"><span class="sd">	*/</span>
</span></span><span class="line"><span class="cl">	<span class="k">function</span> <span class="nf">intersect</span><span class="p">(</span><span class="nv">$p1</span><span class="p">,</span> <span class="nv">$p2</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nv">$dX</span> <span class="o">=</span> <span class="nv">$p2</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="nv">$p1</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="k">if</span> <span class="p">(</span><span class="nv">$dX</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="k">return</span> <span class="k">array</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">bound</span><span class="p">,</span> <span class="nv">$p1</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="nv">$dY</span> <span class="o">=</span> <span class="nv">$p2</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="nv">$p1</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">		<span class="nv">$dX2</span> <span class="o">=</span> <span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">bound</span> <span class="o">-</span> <span class="nv">$p1</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="k">array</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">bound</span><span class="p">,</span> <span class="p">(</span><span class="nv">$dX2</span> <span class="o">/</span> <span class="nv">$dX</span><span class="p">)</span> <span class="o">*</span> <span class="nv">$dY</span> <span class="o">+</span> <span class="nv">$p1</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">function</span> <span class="nf">intersect</span><span class="p">(</span><span class="nv">$p1</span><span class="p">,</span> <span class="nv">$p2</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$dX</span> <span class="o">=</span> <span class="nv">$p2</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="nv">$p1</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$dY</span> <span class="o">=</span> <span class="nv">$p2</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="nv">$p1</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">RightEdge</span> <span class="k">extends</span> <span class="nx">VertEdge</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">function</span> <span class="nf">inside</span><span class="p">(</span><span class="nv">$p</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="nv">$p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">bound</span><span class="p">;</span> <span class="c1">//X
</span></span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">LeftEdge</span> <span class="k">extends</span> <span class="nx">VertEdge</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">function</span> <span class="nf">inside</span><span class="p">(</span><span class="nv">$p</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="nv">$p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">bound</span><span class="p">;</span> <span class="c1">//X
</span></span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">TopEdge</span> <span class="k">extends</span> <span class="nx">HorzEdge</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">function</span> <span class="nf">inside</span><span class="p">(</span><span class="nv">$p</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="nv">$p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">bound</span><span class="p">;</span> <span class="c1">//Y
</span></span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">BottomEdge</span> <span class="k">extends</span> <span class="nx">HorzEdge</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">function</span> <span class="nf">inside</span><span class="p">(</span><span class="nv">$p</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="nv">$p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">&lt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">bound</span><span class="p">;</span> <span class="c1">//Y
</span></span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">function</span> <span class="nf">check_point</span><span class="p">(</span><span class="nv">$p</span><span class="p">,</span> <span class="nv">$msg</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="p">(</span><span class="nv">$p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;</span> <span class="o">-</span><span class="mi">180</span> <span class="o">||</span> <span class="nv">$p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">180</span> <span class="o">||</span> <span class="nv">$p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">&lt;</span> <span class="o">-</span><span class="mi">90</span> <span class="o">||</span> <span class="nv">$p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">90</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">var_dump</span><span class="p">(</span><span class="nv">$p</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="nx">var_dump</span><span class="p">(</span><span class="nx">debug_backtrace</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">		<span class="k">die</span><span class="p">(</span><span class="s2">&#34;Something went wrong! </span><span class="si">$msg</span><span class="s2">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">SutherlandHodgman</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">var</span> <span class="nv">$edges</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd">	 * Construct with the bounds of the clipped area
</span></span></span><span class="line"><span class="cl"><span class="sd">	 *
</span></span></span><span class="line"><span class="cl"><span class="sd">	 * @param unknown_type $x1
</span></span></span><span class="line"><span class="cl"><span class="sd">	 * @param unknown_type $y1
</span></span></span><span class="line"><span class="cl"><span class="sd">	 * @param unknown_type $x2
</span></span></span><span class="line"><span class="cl"><span class="sd">	 * @param unknown_type $y2
</span></span></span><span class="line"><span class="cl"><span class="sd">	 */</span>
</span></span><span class="line"><span class="cl">	<span class="k">function</span> <span class="fm">__construct</span><span class="p">(</span><span class="nv">$x1</span><span class="p">,</span> <span class="nv">$y1</span><span class="p">,</span> <span class="nv">$x2</span><span class="p">,</span> <span class="nv">$y2</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">assert</span><span class="p">(</span><span class="nv">$x1</span> <span class="o">&lt;</span> <span class="nv">$x2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="nx">assert</span><span class="p">(</span><span class="nv">$y1</span> <span class="o">&lt;</span> <span class="nv">$y2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">edges</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">			<span class="k">new</span> <span class="nx">RightEdge</span><span class="p">(</span><span class="nv">$x2</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">			<span class="k">new</span> <span class="nx">TopEdge</span><span class="p">(</span><span class="nv">$y1</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">			<span class="k">new</span> <span class="nx">LeftEdge</span><span class="p">(</span><span class="nv">$x1</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">			<span class="k">new</span> <span class="nx">BottomEdge</span><span class="p">(</span><span class="nv">$y2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd">	 * Clip the array of (x,y) coords to the bounds
</span></span></span><span class="line"><span class="cl"><span class="sd">	 * specified in the constructor
</span></span></span><span class="line"><span class="cl"><span class="sd">	 *
</span></span></span><span class="line"><span class="cl"><span class="sd">	 * @param array $points
</span></span></span><span class="line"><span class="cl"><span class="sd">	 */</span>
</span></span><span class="line"><span class="cl">	<span class="k">function</span> <span class="nf">clip</span><span class="p">(</span><span class="nv">$points</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="k">if</span> <span class="p">(</span><span class="nx">count</span><span class="p">(</span><span class="nv">$points</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="k">throw</span> <span class="s2">&#34;Clip requires a polygon of three points or more&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="k">foreach</span> <span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">edges</span> <span class="k">as</span> <span class="nv">$edge</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="nv">$output</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">			<span class="k">if</span> <span class="p">(</span><span class="k">empty</span><span class="p">(</span><span class="nv">$points</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">				<span class="k">return</span> <span class="nv">$points</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">			<span class="nv">$previous</span> <span class="o">=</span> <span class="nv">$points</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">			<span class="nv">$previousInside</span> <span class="o">=</span> <span class="nv">$edge</span><span class="o">-&gt;</span><span class="na">inside</span><span class="p">(</span><span class="nv">$previous</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">			<span class="c1">// Add the first onto the end so it eventually gets processed
</span></span></span><span class="line"><span class="cl">			<span class="nv">$points_count</span> <span class="o">=</span> <span class="nx">count</span><span class="p">(</span><span class="nv">$points</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">			<span class="k">if</span> <span class="p">(</span><span class="nv">$points</span><span class="p">[</span><span class="nv">$points_count</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">!==</span> <span class="nv">$points</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">				<span class="nv">$points</span><span class="p">[]</span> <span class="o">=</span> <span class="nv">$points</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">				<span class="nv">$points_count</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">			<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">			<span class="k">for</span> <span class="p">(</span><span class="nv">$i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="nv">$i</span> <span class="o">&lt;</span> <span class="nv">$points_count</span><span class="p">;</span> <span class="nv">$i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">				<span class="nv">$point</span> <span class="o">=</span> <span class="nv">$points</span><span class="p">[</span><span class="nv">$i</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">				<span class="nx">assert</span><span class="p">(</span><span class="nx">is_array</span><span class="p">(</span><span class="nv">$point</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">				<span class="nx">assert</span><span class="p">(</span><span class="nx">count</span><span class="p">(</span><span class="nv">$point</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">				<span class="nv">$inside</span> <span class="o">=</span> <span class="nv">$edge</span><span class="o">-&gt;</span><span class="na">inside</span><span class="p">(</span><span class="nv">$point</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">				<span class="k">if</span> <span class="p">(</span><span class="nv">$inside</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">					<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nv">$previousInside</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">						<span class="nx">assert</span><span class="p">(</span><span class="o">!</span><span class="nv">$edge</span><span class="o">-&gt;</span><span class="na">inside</span><span class="p">(</span><span class="nv">$previous</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">						<span class="nv">$output</span><span class="p">[]</span> <span class="o">=</span> <span class="nv">$edge</span><span class="o">-&gt;</span><span class="na">intersect</span><span class="p">(</span><span class="nv">$point</span><span class="p">,</span> <span class="nv">$previous</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">					<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">					<span class="nv">$output</span><span class="p">[]</span> <span class="o">=</span> <span class="nv">$point</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">				<span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nv">$previousInside</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">					<span class="nx">assert</span><span class="p">(</span><span class="nv">$edge</span><span class="o">-&gt;</span><span class="na">inside</span><span class="p">(</span><span class="nv">$previous</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">					<span class="nv">$output</span><span class="p">[]</span> <span class="o">=</span> <span class="nv">$edge</span><span class="o">-&gt;</span><span class="na">intersect</span><span class="p">(</span><span class="nv">$previous</span><span class="p">,</span> <span class="nv">$point</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">				<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">				<span class="nv">$previous</span> <span class="o">=</span> <span class="nv">$point</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">				<span class="nv">$previousInside</span> <span class="o">=</span> <span class="nv">$inside</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">			<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">			<span class="nv">$points</span> <span class="o">=</span> <span class="nv">$output</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="nv">$output</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></description>
    </item>
    
    <item>
      <title>Building PHP’s Debian package nightmare</title>
      <link>https://blog.bramp.net/post/2011/11/22/building-phps-debian-package-nightmare/</link>
      <pubDate>Tue, 22 Nov 2011 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2011/11/22/building-phps-debian-package-nightmare/</guid>
      <description><p>I just tried to compile the Debian PHP packages, so I could make some <a href="http://www.howtoforge.com/recompiling-php5-with-bundled-support-for-gd-on-ubuntu">minor tweaks</a> to the source, to fix a bug I’m hopefully going to document shortly. This turned out to be very problematic, mainly due to the testing phase!</p>
<p>To build the Debian packages you typically do the following:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir php
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> php
</span></span><span class="line"><span class="cl">apt-get <span class="nb">source</span> php5
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> php5-*
</span></span><span class="line"><span class="cl">debuild -us -uc -j4
</span></span></code></pre></div><p>While testing, the debian/setup_mysql.sh script is called, to create a temporary MySQL database. This however failed to execute correctly because I had some custom options in my <a href="http://dev.mysql.com/doc/refman/5.1/en/option-files.html">~/.my.cnf</a>. Thus it failed like so:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># start our own mysql server for the tests</span>
</span></span><span class="line"><span class="cl">/bin/sh debian/setup-mysql.sh <span class="m">1029</span> /home/bramp/vendor/php/php5-5.3.8.0/mysql_db
</span></span><span class="line"><span class="cl">mysqladmin: connect to server at <span class="s1">&#39;localhost&#39;</span> failed
</span></span><span class="line"><span class="cl">error: <span class="s1">&#39;Access denied for user &#39;</span>root<span class="s1">&#39;@&#39;</span>localhost<span class="s1">&#39; (using password: YES)&#39;</span>
</span></span><span class="line"><span class="cl">make: *** <span class="o">[</span>test-results.txt<span class="o">]</span> Error <span class="m">1</span>
</span></span><span class="line"><span class="cl">dpkg-buildpackage: error: debian/rules build gave error <span class="nb">exit</span> status <span class="m">2</span>
</span></span><span class="line"><span class="cl">debuild: fatal error at line 1348:
</span></span><span class="line"><span class="cl">dpkg-buildpackage -rfakeroot -D -us -uc -j8 failed
</span></span></code></pre></div><p>After removing the my.cnf things were ok. The below patch fixes it in a more general way:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-diff" data-lang="diff"><span class="line"><span class="cl"><span class="gd">-- debian/setup-mysql.sh.org	2011-11-21 21:57:07.244481175 -0500
</span></span></span><span class="line"><span class="cl"><span class="gi">+++ debian/setup-mysql.sh	2011-11-21 21:40:39.384455880 -0500
</span></span></span><span class="line"><span class="cl"><span class="gu">@@ -16,7 +16,7 @@
</span></span></span><span class="line"><span class="cl"> 
</span></span><span class="line"><span class="cl"> socket=$datadir/mysql.sock
</span></span><span class="line"><span class="cl"> # Commands:
</span></span><span class="line"><span class="cl"><span class="gd">-mysqladmin=&#34;mysqladmin -u root -P $port -h localhost --socket=$socket&#34;
</span></span></span><span class="line"><span class="cl"><span class="gi">+mysqladmin=&#34;mysqladmin --no-defaults -u root -P $port -h localhost --socket=$socket&#34;
</span></span></span><span class="line"><span class="cl"> mysqld=&#34;/usr/sbin/mysqld --no-defaults --bind-address=localhost --port=$port --socket=$socket --datadir=$datadir&#34;
</span></span><span class="line"><span class="cl"> 
</span></span><span class="line"><span class="cl"> # Main code #
</span></span></code></pre></div><p>The next problem I encountered is that all the automated PHP unit tests were failing, and they would eventually get stuck and use all my RAM and swap space (at least 16GiB of it) :( I’m not sure what made the machine run out of RAM, but the tests were failing because the version of PHP that was running the tests was incorrectly loading extensions from my system. The quick fix for this was to disable any extensions I had installed to my system. I just</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo mv /etc/php5/conf.d /etc/php5/conf.d.tmp
</span></span></code></pre></div><p>to do that.</p>
<p>This made me think that in future I should perhaps find a cleaner environment to build these packages. In fact, it makes me wonder if the builds are just broken if my environment clearly impacts the successful run of tests.</p>
<p>One trick I found while building again and again, is that you can pass “-nc” to debuild so that it does not clean, and thus reuses the existing build materials for a faster build. Either way, I now have my own version of PHP built and installed! Next time I might just ignore the .deb files and build direct from source.</p>
</description>
    </item>
    
    <item>
      <title>PHP Destructor objects</title>
      <link>https://blog.bramp.net/post/2011/11/02/php-destructor-objects/</link>
      <pubDate>Wed, 02 Nov 2011 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2011/11/02/php-destructor-objects/</guid>
      <description><p>PHP’s lack of a finally keyword is apalling, and even though there seems to be some hacks around it, I have come up with own today. I’m following the C++ concept of allocating objects on the stack, and letting them cleanup any resources when the stack is rolled back.</p>
<p>Take an example. I am creating some files that I want to always be deleted after the script has finished. In any sane language (that has Exceptions) I would write:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="k">try</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// Create files
</span></span></span><span class="line"><span class="cl">  <span class="c1">// Do something with the files
</span></span></span><span class="line"><span class="cl"><span class="p">}</span> <span class="k">finally</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// Delete files - This code will run no matter what exceptions or errors occur while creating the files.
</span></span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>However, this is the hack I’ve managed with PHP:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">UnlinkMe</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">var</span> <span class="nv">$filename</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">function</span> <span class="fm">__construct</span><span class="p">(</span><span class="nv">$filename</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nv">$this</span><span class="o">-&amp;</span><span class="nx">gt</span><span class="p">;</span><span class="nx">filename</span> <span class="o">=</span> <span class="nv">$filename</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">function</span> <span class="fm">__destruct</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">unlink</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&amp;</span><span class="nx">gt</span><span class="p">;</span><span class="nx">filename</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// To use:
</span></span></span><span class="line"><span class="cl"><span class="k">function</span> <span class="nf">doSomething</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nv">$unlinkme</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">UnlinkMe</span><span class="p">(</span><span class="s1">&#39;/tmp/filename&#39;</span><span class="p">)</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Do some work with the files
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Here we are creating a UnlinkMe object, that has a destructor set up to delete a file. This UnlinkMe object is only used in the doSomething() function. Once that function returns, there are no longer any references to the object. When PHP decides to garbage collect (to free up some memory), it will destroy the UnlinkMe object, and thus call the __destruct method. Voila, we now call unlink and have cleaned up the file, even after the script has finished running.</p>
<p>There is lots of room for improvement, and this technique has lots of gotchas. For example, PHP has some bizzare rules for when __destruct method will not be called. So please don’t rely on this technique, but it might be useful, and keep your code cleaner and more organised.</p>
</description>
    </item>
    
    <item>
      <title>SQLSTATE[HY000]: General error: 2053</title>
      <link>https://blog.bramp.net/post/2011/10/25/sqlstatehy000-general-error-2053/</link>
      <pubDate>Tue, 25 Oct 2011 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2011/10/25/sqlstatehy000-general-error-2053/</guid>
      <description><p>I encountered the following odd exception:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">PHP Fatal error:  Uncaught exception &#39;PDOException&#39; with message &#39;SQLSTATE[HY000]: General error: 2053 &#39; in /home/bramp/my.php:29
</span></span><span class="line"><span class="cl">Stack trace:
</span></span><span class="line"><span class="cl">#0 /home/bramp/my.php(29): PDOStatement-&gt;fetch(2)
</span></span></code></pre></div><p>Searching on Google didn’t reveal much help, but I eventually figure out the root cause. Spot the mistake:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="o">...</span>
</span></span><span class="line"><span class="cl"><span class="nv">$sql</span> <span class="o">=</span> <span class="s1">&#39;SELECT TRIGGER_NAME, TRIGGER_GROUP, JOB_NAME FROM QRTZ_TRIGGERS&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$sth</span> <span class="o">=</span> <span class="nv">$dbh</span><span class="o">-&gt;</span><span class="na">prepare</span><span class="p">(</span><span class="nv">$sql</span><span class="p">)</span> <span class="k">or</span> <span class="k">die</span><span class="p">(</span><span class="s1">&#39;Failed to prepare SELECT TRIGGER query&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="k">while</span> <span class="p">(</span><span class="nv">$row</span> <span class="o">=</span> <span class="nv">$sth</span><span class="o">-&gt;</span><span class="na">fetch</span><span class="p">(</span><span class="nx">PDO</span><span class="o">::</span><span class="na">FETCH_ASSOC</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"><span class="o">...</span>
</span></span></code></pre></div><p>I am missing a</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="nv">$sth</span><span class="o">-&gt;</span><span class="na">execute</span><span class="p">();</span>
</span></span></code></pre></div><p>in between the prepare and the fetch. Easy fix. For reference I’m using a old version of PHP 5.1.6, and MySQL client 5.0.45.</p>
</description>
    </item>
    
    <item>
      <title>MD5 Digest Authorisation in SIP with PHP</title>
      <link>https://blog.bramp.net/post/2011/09/23/md5-digest-authorisation-in-sip-with-php/</link>
      <pubDate>Fri, 23 Sep 2011 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2011/09/23/md5-digest-authorisation-in-sip-with-php/</guid>
      <description><p>Today I needed to work out the MD5 Digest hash for SIP authorisation. A quick search on Google revealed <a href="http://alexkr.com/memos/66/digest-authorization-in-sip-with-md5/">instructions</a> on how to generate the hash, and then I made this simple PHP script.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="cl"><span class="nv">$username</span> <span class="o">=</span> <span class="s1">&#39;1234&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$realm</span>    <span class="o">=</span> <span class="s1">&#39;asterisk&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$password</span> <span class="o">=</span> <span class="s1">&#39;PASSWORD&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$uri</span>      <span class="o">=</span> <span class="s1">&#39;sip:1.2.3.4&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$nonce</span>    <span class="o">=</span> <span class="s1">&#39;abcdef01&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">$str1</span> <span class="o">=</span> <span class="nx">md5</span><span class="p">(</span><span class="s2">&#34;</span><span class="si">$username</span><span class="s2">:</span><span class="si">$realm</span><span class="s2">:</span><span class="si">$password</span><span class="s2">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nv">$str2</span> <span class="o">=</span> <span class="nx">md5</span><span class="p">(</span><span class="s2">&#34;REGISTER:</span><span class="si">$uri</span><span class="s2">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">echo</span> <span class="nx">md5</span><span class="p">(</span><span class="s2">&#34;</span><span class="si">$str1</span><span class="s2">:</span><span class="si">$nonce</span><span class="s2">:</span><span class="si">$str2</span><span class="s2">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="cp">?&gt;</span><span class="err">;
</span></span></span></code></pre></div><p>All of those variables can be pulled out of a packet capture of a <a href="http://tools.ietf.org/html/rfc3261#section-10.2">SIP REGISTER</a>, and the results can be useful for validating the password a device is sending, is what it is actually sending.</p>
</description>
    </item>
    
    <item>
      <title>Google DNS Benchmarked</title>
      <link>https://blog.bramp.net/post/2009/12/04/google-dns-benchmarked/</link>
      <pubDate>Fri, 04 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2009/12/04/google-dns-benchmarked/</guid>
      <description><p>Today <a href="http://googleblog.blogspot.com/2009/12/introducing-google-public-dns.html">Google announced</a> a public DNS service they are hosting. They claim that their DNS infrastructure is <a href="http://code.google.com/speed/public-dns/docs/performance.html">faster and more secure</a>, because their servers do some clever things. I wanted to test their performance claims, so I wrote a <a href="dns.php">little script</a> to measure a lookup times for different domains across a number of DNS servers.</p>
<h3 id="methodology">Methodology</h3>
<p>Firstly I found a <a href="http://www.quantcast.com/top-sites-1">list of the 1 million most popular sites</a>. I then picked a number of DNS servers to test against. I chose <a href="http://code.google.com/speed/public-dns/">Google</a>‘s, <a href="http://www.opendns.com/">OpenDNS</a>‘s, my ISP (<a href="http://broadband.sky.com/">Sky/Easynet</a>) and my old ISP’s (<a href="http://www.plus.net/">Plus.net</a>).</p>
<p>I decided I would query an <a href="http://en.wikipedia.org/wiki/List_of_DNS_record_types">A record</a> for each of the domains in the list, one at a time, starting with the most popular. I would query each server three times for the same domain name. The ordering was like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="k">foreach</span> <span class="p">(</span><span class="nx">domain</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">   <span class="k">for</span> <span class="p">(</span><span class="nx">i</span> <span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="nx">i</span><span class="o">&lt;</span><span class="mi">3</span><span class="p">;</span><span class="nx">i</span><span class="o">++</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">      <span class="k">foreach</span> <span class="p">(</span><span class="nx">server</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">         <span class="nx">query</span><span class="p">(</span><span class="nx">server</span><span class="p">,</span> <span class="nx">domain</span><span class="p">)</span>
</span></span></code></pre></div><p>I recorded the time it took for each query to be answered, and I also recorded the replies. I was curious to see if some servers replied with different answers, or if some returned more information, i.e. additional records.</p>
<p>I <a href="dns.php">wrote a script</a> in PHP 5.3, and ran it from the command line on my Windows Server 2008 machine. The script used PEAR&rsquo;s Net_DNS to craft and send the DNS questions. I was not using my operating system&rsquo;s resolver, and I was not using any form of client side caching. I ran the experiments from my home ADSL connection and as far as I know my ISP was not interfering with my DNS requests in any way. I live in the North West of the UK.</p>
<h3 id="results">Results</h3>
<p>After letting this run for a few hours, and querying roughly the top 10,000 domains, I have some preliminary results.</p>















<table class="table">
  <thead>
      <tr>
          <th>DNS Server</th>
          <th class="text- center">Min (ms)</th>
          <th class="text- center">Max (ms)</th>
          <th class="text- center">Median</th>
          <th class="text- center">Mean (ms)</th>
          <th class="text- center">Standard Dev (ms)</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Google A (8.8.8.8)</td>
          <td class="text- center">38.50</td>
          <td class="text- center">4932</td>
          <td class="text- center">42.45</td>
          <td class="text- center">122.8</td>
          <td class="text- center">181.6</td>
      </tr>
      <tr>
          <td>Google B (8.8.4.4)</td>
          <td class="text- center">38.65</td>
          <td class="text- center">4927</td>
          <td class="text- center">41.84</td>
          <td class="text- center">94.52</td>
          <td class="text- center">154.8</td>
      </tr>
      <tr>
          <td>OpenDNS A (208.67.222.222)</td>
          <td class="text- center">29.77</td>
          <td class="text- center">4035</td>
          <td class="text- center">31.87</td>
          <td class="text- center">74.37</td>
          <td class="text- center">115.4</td>
      </tr>
      <tr>
          <td>OpenDNS B (208.67.220.220)</td>
          <td class="text- center">29.76</td>
          <td class="text- center">1171</td>
          <td class="text- center">31.82</td>
          <td class="text- center">35.28</td>
          <td class="text- center">32.4</td>
      </tr>
      <tr>
          <td>Easynet A (90.207.238.97)</td>
          <td class="text- center">33.90</td>
          <td class="text- center">2578</td>
          <td class="text- center">61.29</td>
          <td class="text- center">105.2</td>
          <td class="text- center">103.7</td>
      </tr>
      <tr>
          <td>Easynet B (90.207.238.99)</td>
          <td class="text- center">33.65</td>
          <td class="text- center">4253</td>
          <td class="text- center">44.96</td>
          <td class="text- center">96.11</td>
          <td class="text- center">104.8</td>
      </tr>
      <tr>
          <td>Plusnet A (212.159.11.150)</td>
          <td class="text- center">43.78</td>
          <td class="text- center">4423</td>
          <td class="text- center">52.56</td>
          <td class="text- center">100.8</td>
          <td class="text- center">156.5</td>
      </tr>
      <tr>
          <td>Plusnet B (212.159.13.150)</td>
          <td class="text- center">38.87</td>
          <td class="text- center">4991</td>
          <td class="text- center">42.76</td>
          <td class="text- center">90.78</td>
          <td class="text- center">169.1</td>
      </tr>
  </tbody>
</table>

<p>From this table of results, we can see that Google&rsquo;s median response time is 41-42ms, however, OpenDNS performs much better with a result of ~31ms. Both my current ISP and my old ISP don&rsquo;t perform as well and each achieved a result between 42ms and 61ms. To get a better feel for the data I plotted an empirical CDF of the lookup times for each server.</p>
<p><a href="ecdf_overview.pdf"><figure><img src="/post/2009/12/04/google-dns-benchmarked/ecdf_overview.png" width="700" height="700"><figcaption>
      <h4>Click for a larger PDF version</h4>
    </figcaption>
</figure>
</a></p>
<p>The first impression I can make from this CDF is that OpenDNS serves far more of the queries faster than anyone else. Secondly the secondary DNS servers all seem to be faster than their primaries. I suspect this is because most hosts query the primary, and rarely query the secondary. I even read that <a href="https://www.isc.org/software/bind">BIND</a> (a popular DNS server) has/had <a href="http://homepages.tesco.net/J.deBoynePollard/FGA/dns-database-replication.html">a bug in it which favoured the primary DNS</a>.</p>
<p>The minimum lookup time for each pair of DNS servers seems to be the same, most likely caused by the network latency between me and the servers. Even so, if we normalise all the data by taking the servers&rsquo; minimum value away from each sample, we still find that OpenDNS performs better than Google, and Google performs slightly better than Plus.net and quite a bit better than my current ISP, Easynet.</p>
<p>Rather worryingly is that the latency to OpenDNS is smaller than the latency to my own ISP&rsquo;s DNS servers. This makes me wonder where the hell my ISP hosts their DNS servers. Also, the ~38ms minimum time with Google indicates that at least some of their DNS servers are hosted in Europe, and possibly the UK.</p>
<p>SInce I ran each lookup three times, I wanted to compare the lookup times for each request. This time I plotted the empirical CDF of each iteration of request.</p>
<p><a href="ecdf_requests.pdf"><figure><img src="/post/2009/12/04/google-dns-benchmarked/ecdf_requests.png" width="700" height="700"><figcaption>
      <h4>Click for a larger PDF version</h4>
    </figcaption>
</figure>
</a></p>
<p>This CDF seems to show that the 2nd and 3rd requests always get served quicker than the first. In most cases the 2nd and 3rd request have equal ranking, but the first is always slow. This could easily be attributed to the fact that the caching DNS server does not have the record in its cache, and thus must be fetched. The second time I request the domain name (only moments later), the server already has the query, and most likely has it stored in RAM or L1/L2 CPU cache.</p>
<p>OpenDNS_B seems to respond equally quick for the first, second and third request. This could be because I would always query OpenDNS_A first, then move on to B. If A and B were actually the same machine, it would be like sending 6 requests to the machine instead of 3. Therefore, B&rsquo;s 1st request is actually its second. Even if A and B were different machines, there could be some clever replication, or shared caching going on to cause this behaviour.</p>
<p>Finally, I&rsquo;m surprised that the 2nd and 3rd requests are slower, especially since I&rsquo;m requesting the most popular domain names. Surely others would have already requested the domain name, and thus the DNS server has no need to fetch it. Looking through the list of domain names I see that none of them have the www prefix. I personally never type the www and just hope the site works, but perhaps many users do. Maybe I should re-run the experiment with the www prefix.</p>
<h3 id="conclusion">Conclusion</h3>
<p>For now I would stick to using OpenDNS, as this is clearly the winner. However, the Google DNS service is very new, so perhaps the servers haven&rsquo;t had enough time to fill their caches, and their admins haven&rsquo;t had enough time to tweak them. I will perhaps rerun this experiment in a few weeks and see what happens.</p>
<h3 id="todo">TODO</h3>
<p>I still have some analysis to do, for example, looking at packet loss, the type of records returned, and anything else I can think of.</p>
</description>
    </item>
    
    <item>
      <title>Ordnance Survey Easting/Northing to Lat/Long</title>
      <link>https://blog.bramp.net/post/2008/06/04/ordnance-survey-easting-northing-to-lat-long/</link>
      <pubDate>Wed, 04 Jun 2008 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2008/06/04/ordnance-survey-easting-northing-to-lat-long/</guid>
      <description><p>Recently I had the need to convert Ordnance Survey East/North coordinates to Latitude and Longitude. By using the resources available on the OS site I wrote the following piece of PHP code:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="o">&amp;</span><span class="nx">lt</span><span class="p">;</span><span class="o">?</span><span class="nx">php</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Converts OS Easting/Northing to Lat/Long
</span></span></span><span class="line"><span class="cl"><span class="c1">// by bramp
</span></span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl"><span class="k">function</span> <span class="nf">Marc</span><span class="p">(</span><span class="nv">$bf0</span><span class="p">,</span> <span class="nv">$n</span><span class="p">,</span> <span class="nv">$PHI0</span><span class="p">,</span> <span class="nv">$PHI</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="cm">/*
</span></span></span><span class="line"><span class="cl"><span class="cm">	Compute meridional arc.
</span></span></span><span class="line"><span class="cl"><span class="cm">	Input: - 
</span></span></span><span class="line"><span class="cl"><span class="cm">	 ellipsoid semi major axis multiplied by central meridian scale factor (bf0) in meters; 
</span></span></span><span class="line"><span class="cl"><span class="cm">	 n (computed from a, b and f0); 
</span></span></span><span class="line"><span class="cl"><span class="cm">	 lat of false origin (PHI0) 
</span></span></span><span class="line"><span class="cl"><span class="cm">	 initial or final latitude of point (PHI) IN RADIANS.
</span></span></span><span class="line"><span class="cl"><span class="cm">	*/</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nv">$n2</span> <span class="o">=</span> <span class="nx">pow</span><span class="p">(</span><span class="nv">$n</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$n3</span> <span class="o">=</span> <span class="nx">pow</span><span class="p">(</span><span class="nv">$n</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nv">$ans</span>  <span class="o">=</span> <span class="p">((</span><span class="mi">1</span> <span class="o">+</span> <span class="nv">$n</span> <span class="o">+</span> <span class="p">((</span><span class="mi">5</span> <span class="o">/</span> <span class="mi">4</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="nv">$n2</span><span class="p">))</span> <span class="o">+</span> <span class="p">((</span><span class="mi">5</span> <span class="o">/</span> <span class="mi">4</span><span class="p">)</span> <span class="o">*</span> <span class="nv">$n3</span><span class="p">))</span> <span class="o">*</span> <span class="p">(</span><span class="nv">$PHI</span> <span class="o">-</span> <span class="nv">$PHI0</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$ans</span> <span class="o">-=</span> <span class="p">(((</span><span class="mi">3</span> <span class="o">*</span> <span class="nv">$n</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="mi">3</span> <span class="o">*</span> <span class="nv">$n2</span><span class="p">)</span> <span class="o">+</span> <span class="p">((</span><span class="mi">21</span> <span class="o">/</span> <span class="mi">8</span> <span class="p">)</span> <span class="o">*</span> <span class="nv">$n3</span><span class="p">))</span> <span class="o">*</span> <span class="p">(</span><span class="nx">sin</span><span class="p">(</span><span class="nv">$PHI</span> <span class="o">-</span> <span class="nv">$PHI0</span><span class="p">))</span> <span class="o">*</span> <span class="p">(</span><span class="nx">cos</span><span class="p">(</span><span class="nv">$PHI</span> <span class="o">+</span> <span class="nv">$PHI0</span><span class="p">)));</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$ans</span> <span class="o">+=</span> <span class="p">((((</span><span class="mi">15</span> <span class="o">/</span> <span class="mi">8</span> <span class="p">)</span> <span class="o">*</span> <span class="nv">$n2</span><span class="p">)</span> <span class="o">+</span> <span class="p">((</span><span class="mi">15</span> <span class="o">/</span> <span class="mi">8</span> <span class="p">)</span> <span class="o">*</span> <span class="nv">$n3</span><span class="p">))</span> <span class="o">*</span> <span class="p">(</span><span class="nx">sin</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="p">(</span><span class="nv">$PHI</span> <span class="o">-</span> <span class="nv">$PHI0</span><span class="p">)))</span> <span class="o">*</span> <span class="p">(</span><span class="nx">cos</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="p">(</span><span class="nv">$PHI</span> <span class="o">+</span> <span class="nv">$PHI0</span><span class="p">))));</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$ans</span> <span class="o">-=</span> <span class="p">(((</span><span class="mi">35</span> <span class="o">/</span> <span class="mi">24</span><span class="p">)</span> <span class="o">*</span> <span class="nv">$n3</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="nx">sin</span><span class="p">(</span><span class="mi">3</span> <span class="o">*</span> <span class="p">(</span><span class="nv">$PHI</span> <span class="o">-</span> <span class="nv">$PHI0</span><span class="p">)))</span> <span class="o">*</span> <span class="p">(</span><span class="nx">cos</span><span class="p">(</span><span class="mi">3</span> <span class="o">*</span> <span class="p">(</span><span class="nv">$PHI</span> <span class="o">+</span> <span class="nv">$PHI0</span><span class="p">))));</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nv">$bf0</span> <span class="o">*</span> <span class="nv">$ans</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl"><span class="k">function</span> <span class="nf">initialLat</span><span class="p">(</span><span class="nv">$North</span><span class="p">,</span> <span class="nv">$n0</span><span class="p">,</span> <span class="nv">$afo</span><span class="p">,</span> <span class="nv">$PHI0</span><span class="p">,</span> <span class="nv">$n</span><span class="p">,</span> <span class="nv">$bfo</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="cm">/*
</span></span></span><span class="line"><span class="cl"><span class="cm">	Compute initial value for Latitude (PHI) IN RADIANS.
</span></span></span><span class="line"><span class="cl"><span class="cm">	Input: - _
</span></span></span><span class="line"><span class="cl"><span class="cm">	northing of point (North) and northing of false origin (n0) in meters; 
</span></span></span><span class="line"><span class="cl"><span class="cm">	semi major axis multiplied by central meridian scale factor (af0) in meters; 
</span></span></span><span class="line"><span class="cl"><span class="cm">	latitude of false origin (PHI0) IN RADIANS;
</span></span></span><span class="line"><span class="cl"><span class="cm">	n (computed from a, b and f0) 
</span></span></span><span class="line"><span class="cl"><span class="cm">	ellipsoid semi major axis multiplied by central meridian scale factor (bf0) in meters.
</span></span></span><span class="line"><span class="cl"><span class="cm">	*/</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="c1">//First PHI value (PHI1)
</span></span></span><span class="line"><span class="cl">	<span class="nv">$PHI1</span> <span class="o">=</span> <span class="p">((</span><span class="nv">$North</span> <span class="o">-</span> <span class="nv">$n0</span><span class="p">)</span> <span class="o">/</span> <span class="nv">$afo</span><span class="p">)</span> <span class="o">+</span> <span class="nv">$PHI0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">//Calculate M
</span></span></span><span class="line"><span class="cl">	<span class="nv">$M</span> <span class="o">=</span> <span class="nx">Marc</span><span class="p">(</span><span class="nv">$bfo</span><span class="p">,</span> <span class="nv">$n</span><span class="p">,</span> <span class="nv">$PHI0</span><span class="p">,</span> <span class="nv">$PHI1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">//Calculate new PHI value (PHI2)
</span></span></span><span class="line"><span class="cl">	<span class="nv">$PHI2</span> <span class="o">=</span> <span class="p">((</span><span class="nv">$North</span> <span class="o">-</span> <span class="nv">$n0</span> <span class="o">-</span> <span class="nv">$M</span><span class="p">)</span> <span class="o">/</span> <span class="nv">$afo</span><span class="p">)</span> <span class="o">+</span> <span class="nv">$PHI1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="c1">//Iterate to get final value for InitialLat
</span></span></span><span class="line"><span class="cl">	<span class="k">while</span> <span class="p">(</span> <span class="nx">abs</span><span class="p">(</span><span class="nv">$North</span> <span class="o">-</span> <span class="nv">$n0</span> <span class="o">-</span> <span class="nv">$M</span><span class="p">)</span> <span class="o">&amp;</span><span class="nx">gt</span><span class="p">;</span> <span class="mf">0.00001</span> <span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nv">$PHI2</span> <span class="o">=</span> <span class="p">((</span><span class="nv">$North</span> <span class="o">-</span> <span class="nv">$n0</span> <span class="o">-</span> <span class="nv">$M</span><span class="p">)</span> <span class="o">/</span> <span class="nv">$afo</span><span class="p">)</span> <span class="o">+</span> <span class="nv">$PHI1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="nv">$M</span> <span class="o">=</span> <span class="nx">Marc</span><span class="p">(</span><span class="nv">$bfo</span><span class="p">,</span> <span class="nv">$n</span><span class="p">,</span> <span class="nv">$PHI0</span><span class="p">,</span> <span class="nv">$PHI2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="nv">$PHI1</span> <span class="o">=</span> <span class="nv">$PHI2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nv">$PHI2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">function</span> <span class="nf">E_N_to_Lat_Long</span><span class="p">(</span><span class="nv">$East</span><span class="p">,</span> <span class="nv">$North</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="nv">$a</span>  <span class="o">=</span> <span class="mf">6377563.396</span><span class="p">;</span> <span class="c1">// Semi-major axis, a
</span></span></span><span class="line"><span class="cl">	<span class="nv">$b</span>  <span class="o">=</span> <span class="mf">6356256.910</span><span class="p">;</span> <span class="c1">//Semi-minor axis, b
</span></span></span><span class="line"><span class="cl">	<span class="nv">$e0</span> <span class="o">=</span> <span class="mf">400000.000</span><span class="p">;</span> <span class="c1">//True origin Easting, E0	
</span></span></span><span class="line"><span class="cl">	<span class="nv">$n0</span> <span class="o">=</span> <span class="o">-</span><span class="mf">100000.000</span><span class="p">;</span> <span class="c1">//True origin Northing, N0	
</span></span></span><span class="line"><span class="cl">	<span class="nv">$f0</span> <span class="o">=</span> <span class="mf">0.999601271700</span><span class="p">;</span> <span class="c1">//Central Meridan Scale, F0
</span></span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="nv">$PHI0</span> <span class="o">=</span> <span class="mf">49.0</span><span class="p">;</span> <span class="c1">// True origin latitude, j0
</span></span></span><span class="line"><span class="cl">	<span class="nv">$LAM0</span> <span class="o">=</span> <span class="o">-</span><span class="mf">2.0</span><span class="p">;</span> <span class="c1">// True origin longitude, l0
</span></span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="c1">//Convert angle measures to radians
</span></span></span><span class="line"><span class="cl">	<span class="nv">$RadPHI0</span> <span class="o">=</span> <span class="nv">$PHI0</span> <span class="o">*</span> <span class="p">(</span><span class="nx">M_PI</span> <span class="o">/</span> <span class="mi">180</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$RadLAM0</span> <span class="o">=</span> <span class="nv">$LAM0</span> <span class="o">*</span> <span class="p">(</span><span class="nx">M_PI</span> <span class="o">/</span> <span class="mi">180</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">//Compute af0, bf0, e squared (e2), n and Et
</span></span></span><span class="line"><span class="cl">	<span class="nv">$af0</span> <span class="o">=</span> <span class="nv">$a</span> <span class="o">*</span> <span class="nv">$f0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$bf0</span> <span class="o">=</span> <span class="nv">$b</span> <span class="o">*</span> <span class="nv">$f0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$e2</span> <span class="o">=</span> <span class="p">(</span><span class="nv">$af0</span><span class="o">*</span><span class="nv">$af0</span> <span class="o">-</span> <span class="nv">$bf0</span><span class="o">*</span><span class="nv">$bf0</span> <span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="nv">$af0</span><span class="o">*</span><span class="nv">$af0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$n</span> <span class="o">=</span> <span class="p">(</span><span class="nv">$af0</span> <span class="o">-</span> <span class="nv">$bf0</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="nv">$af0</span> <span class="o">+</span> <span class="nv">$bf0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$Et</span> <span class="o">=</span> <span class="nv">$East</span> <span class="o">-</span> <span class="nv">$e0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">//Compute initial value for latitude (PHI) in radians
</span></span></span><span class="line"><span class="cl">	<span class="nv">$PHId</span> <span class="o">=</span> <span class="nx">InitialLat</span><span class="p">(</span><span class="nv">$North</span><span class="p">,</span> <span class="nv">$n0</span><span class="p">,</span> <span class="nv">$af0</span><span class="p">,</span> <span class="nv">$RadPHI0</span><span class="p">,</span> <span class="nv">$n</span><span class="p">,</span> <span class="nv">$bf0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nv">$sinPHId2</span> <span class="o">=</span> <span class="nx">pow</span><span class="p">(</span><span class="nx">sin</span><span class="p">(</span><span class="nv">$PHId</span><span class="p">),</span>  <span class="mi">2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$cosPHId</span>  <span class="o">=</span> <span class="nx">pow</span><span class="p">(</span><span class="nx">cos</span><span class="p">(</span><span class="nv">$PHId</span><span class="p">),</span> <span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="nv">$tanPHId</span>  <span class="o">=</span> <span class="nx">tan</span><span class="p">(</span><span class="nv">$PHId</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$tanPHId2</span> <span class="o">=</span> <span class="nx">pow</span><span class="p">(</span><span class="nv">$tanPHId</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$tanPHId4</span> <span class="o">=</span> <span class="nx">pow</span><span class="p">(</span><span class="nv">$tanPHId</span><span class="p">,</span> <span class="mi">4</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$tanPHId6</span> <span class="o">=</span> <span class="nx">pow</span><span class="p">(</span><span class="nv">$tanPHId</span><span class="p">,</span> <span class="mi">6</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">//Compute nu, rho and eta2 using value for PHId
</span></span></span><span class="line"><span class="cl">	<span class="nv">$nu</span> <span class="o">=</span> <span class="nv">$af0</span> <span class="o">/</span> <span class="p">(</span><span class="nx">sqrt</span><span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="p">(</span><span class="nv">$e2</span> <span class="o">*</span> <span class="nv">$sinPHId2</span><span class="p">)));</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$rho</span> <span class="o">=</span> <span class="p">(</span><span class="nv">$nu</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="nv">$e2</span><span class="p">))</span> <span class="o">/</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="nv">$e2</span> <span class="o">*</span> <span class="nv">$sinPHId2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$eta2</span> <span class="o">=</span> <span class="p">(</span><span class="nv">$nu</span> <span class="o">/</span> <span class="nv">$rho</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="c1">//Compute Longitude
</span></span></span><span class="line"><span class="cl">	<span class="nv">$X</span>    <span class="o">=</span> <span class="nv">$cosPHId</span> <span class="o">/</span> <span class="nv">$nu</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$XI</span>   <span class="o">=</span> <span class="nv">$cosPHId</span> <span class="o">/</span> <span class="p">(</span>   <span class="mi">6</span> <span class="o">*</span> <span class="nx">pow</span><span class="p">(</span><span class="nv">$nu</span><span class="p">,</span> <span class="mi">3</span><span class="p">))</span> <span class="o">*</span> <span class="p">((</span><span class="nv">$nu</span> <span class="o">/</span> <span class="nv">$rho</span><span class="p">)</span>         <span class="o">+</span>  <span class="mi">2</span> <span class="o">*</span> <span class="nv">$tanPHId2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$XII</span>  <span class="o">=</span> <span class="nv">$cosPHId</span> <span class="o">/</span> <span class="p">(</span> <span class="mi">120</span> <span class="o">*</span> <span class="nx">pow</span><span class="p">(</span><span class="nv">$nu</span><span class="p">,</span> <span class="mi">5</span><span class="p">))</span> <span class="o">*</span> <span class="p">(</span><span class="mi">5</span>  <span class="o">+</span> <span class="mi">28</span> <span class="o">*</span> <span class="nv">$tanPHId2</span>  <span class="o">+</span> <span class="mi">24</span> <span class="o">*</span> <span class="nv">$tanPHId4</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$XIIA</span> <span class="o">=</span> <span class="nv">$cosPHId</span> <span class="o">/</span> <span class="p">(</span><span class="mi">5040</span> <span class="o">*</span> <span class="nx">pow</span><span class="p">(</span><span class="nv">$nu</span><span class="p">,</span> <span class="mi">7</span><span class="p">))</span> <span class="o">*</span> <span class="p">(</span><span class="mi">61</span> <span class="o">+</span> <span class="mi">662</span> <span class="o">*</span> <span class="nv">$tanPHId2</span> <span class="o">+</span> <span class="mi">1320</span> <span class="o">*</span> <span class="nv">$tanPHId4</span> <span class="o">+</span> <span class="mi">720</span> <span class="o">*</span> <span class="nv">$tanPHId6</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nv">$VII</span>  <span class="o">=</span> <span class="nv">$tanPHId</span> <span class="o">/</span> <span class="p">(</span>  <span class="mi">2</span> <span class="o">*</span> <span class="nv">$rho</span> <span class="o">*</span> <span class="nv">$nu</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$VIII</span> <span class="o">=</span> <span class="nv">$tanPHId</span> <span class="o">/</span> <span class="p">(</span> <span class="mi">24</span> <span class="o">*</span> <span class="nv">$rho</span> <span class="o">*</span> <span class="nx">pow</span><span class="p">(</span><span class="nv">$nu</span><span class="p">,</span> <span class="mi">3</span><span class="p">))</span> <span class="o">*</span> <span class="p">(</span> <span class="mi">5</span> <span class="o">+</span>  <span class="mi">3</span> <span class="o">*</span> <span class="nv">$tanPHId2</span> <span class="o">+</span> <span class="nv">$eta2</span> <span class="o">-</span> <span class="mi">9</span> <span class="o">*</span> <span class="nv">$eta2</span> <span class="o">*</span> <span class="nv">$tanPHId2</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$IX</span>   <span class="o">=</span> <span class="nv">$tanPHId</span> <span class="o">/</span> <span class="p">(</span><span class="mi">720</span> <span class="o">*</span> <span class="nv">$rho</span> <span class="o">*</span> <span class="nx">pow</span><span class="p">(</span><span class="nv">$nu</span><span class="p">,</span> <span class="mi">5</span><span class="p">))</span> <span class="o">*</span> <span class="p">(</span><span class="mi">61</span> <span class="o">+</span> <span class="mi">90</span> <span class="o">*</span> <span class="nv">$tanPHId2</span> <span class="o">+</span> <span class="mi">45</span> <span class="o">*</span> <span class="nv">$tanPHId4</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nv">$long</span> <span class="o">=</span> <span class="p">(</span><span class="mi">180</span> <span class="o">/</span> <span class="nx">M_PI</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="nv">$RadLAM0</span> <span class="o">+</span> <span class="p">(</span><span class="nv">$Et</span> <span class="o">*</span> <span class="nv">$X</span><span class="p">)</span> <span class="o">-</span> <span class="nx">pow</span><span class="p">(</span><span class="nv">$Et</span><span class="p">,</span><span class="mi">3</span><span class="p">)</span> <span class="o">*</span> <span class="nv">$XI</span> <span class="o">+</span> <span class="nx">pow</span><span class="p">(</span><span class="nv">$Et</span><span class="p">,</span><span class="mi">5</span><span class="p">)</span> <span class="o">*</span> <span class="nv">$XII</span> <span class="o">-</span> <span class="nx">pow</span><span class="p">(</span><span class="nv">$Et</span><span class="p">,</span><span class="mi">7</span><span class="p">)</span> <span class="o">*</span> <span class="nv">$XIIA</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$lat</span>  <span class="o">=</span> <span class="p">(</span><span class="mi">180</span> <span class="o">/</span> <span class="nx">M_PI</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="nv">$PHId</span> <span class="o">-</span> <span class="p">(</span><span class="nx">pow</span><span class="p">(</span><span class="nv">$Et</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span> <span class="o">*</span> <span class="nv">$VII</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="nx">pow</span><span class="p">(</span><span class="nv">$Et</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span> <span class="o">*</span> <span class="nv">$VIII</span><span class="p">)</span> <span class="o">-</span> <span class="p">(</span><span class="nx">pow</span><span class="p">(</span><span class="nv">$Et</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> <span class="o">*</span> <span class="nv">$IX</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="k">array</span><span class="p">(</span><span class="nv">$lat</span><span class="p">,</span> <span class="nv">$long</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="o">?&amp;</span><span class="nx">gt</span><span class="p">;;</span>
</span></span></code></pre></div><p>it is used in the following way:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="nv">$e</span> <span class="o">=</span> <span class="mi">349000</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$n</span> <span class="o">=</span> <span class="mi">461000</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">print_r</span><span class="p">(</span> <span class="nx">E_N_to_Lat_Long</span><span class="p">(</span> <span class="nv">$e</span><span class="p">,</span> <span class="nv">$n</span><span class="p">)</span> <span class="p">);</span>
</span></span></code></pre></div><p>If you find a need to use this please place a link back to my site. thanks</p>
</description>
    </item>
    
  </channel>
</rss>
