<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Pierre Söderman &#187; Programmering</title>
	<atom:link href="http://www.pierresoderman.com/category/programmering/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.pierresoderman.com</link>
	<description>Om hur du kan livnära dig på att bygga websajter och frigöra dig från fysisk plats</description>
	<lastBuildDate>Sat, 21 Nov 2009 19:33:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Sökmotoroptimerade bilder och ett centraliserat publiceringsverktyg</title>
		<link>http://www.pierresoderman.com/alias-aliasmatch-htacces-och-tail/</link>
		<comments>http://www.pierresoderman.com/alias-aliasmatch-htacces-och-tail/#comments</comments>
		<pubDate>Sat, 04 Jul 2009 23:49:07 +0000</pubDate>
		<dc:creator>Pierre</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[apache2]]></category>
		<category><![CDATA[regular expression]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://www.pierresoderman.com/?p=141</guid>
		<description><![CDATA[Igår höll jag en längre stund på med att försöka få apache2, med PHP,  förstå att bilder, filer och stylesheets ligger i en mapp under DirectoryRoot (mappen som är root för en websajt). Anledning att jag ville få detta att fungera är för ett centraliserat publiceringsverktyg. Flera sajter delar samma serverscript och kan därmed [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Igår höll jag en längre stund på med att försöka få apache2, med PHP,  förstå att bilder, filer och stylesheets ligger i en mapp under DirectoryRoot (mappen som är root för en websajt). Anledning att jag ville få detta att fungera är för ett centraliserat publiceringsverktyg. Flera sajter delar samma serverscript och kan därmed även använda samma designtemplates(sajtens utseende) för publiceringsverktyget möjliggör att man kan byta utseende på sin sajt. Det har också den fördelen att uppgraderingar av systemet kommer till nytta för alla sajter på en gång. I den nuvarande versionen av detta verktyg är bildurl´erna för de olika sajterna den samma dvs serverns ipnummer. En bild i systemet kan ha url´en http://79.112.133.1/files/image/34333.jpg. För att ytterligare förbättra sökmotoroptimeringen vill jag kunna ha bildlänkar som är http://www.sajt.se/14-bild-namn.jpg</p>
<p>Denna första lösningen som jag hade tänkt var använda var en <a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html" target="_blank">RewriteRule</a> i .htaccess som fångade upp bilder och berättade att deras källa fanns i en mapp under DirectoryRoot. Men detta ville inte fungera, jag fick bara 404 eller 500 fel men inte mycket mer att gå på. Efter många försök och några tårar kom jag på att alla fel som blir på sajten loggas i en errorfil (som jag specificerat i sajtens <a rel="nofollow" href="http://httpd.apache.org/docs/2.0/vhosts/">VirtualHost</a> fil). Detta visste jag mycket väl om men den kunskapen pockade inte direkt på uppmärksamhet för tillfället. Av loggfilen gick tydligt att utläsa att det inte går att specificera mappar under DirectoryRoot. Apache2 tolkade alla mappdirektiv utifrån sajtensrot och efter ett tag gav jag upp detta.</p>
<p>När man löser problem blir det väldigt många sökningar på google och då dyker det upp mycket relaterade tips. Ett tänkbar lösning som dök upp var ett direktiv som heter Alias och går ut på att man helt flyttar var apache2 ska leta efter källan till de efterfrågade filerna. Vid detta lag var jag irriterad på att hela tiden på gå ut och in i loggfilen för att se den senaste felet. Då kom jag på en fiffig unix-funktion som jag använt tidigare, nämligen <a rel="nofollow" href="http://www.computerhope.com/unix/utail.htm" target="_blank">tail</a>. Det är en funktion som gör att man kan visa x antal rader av slutet av en fil. Men ännu fiffigare är det med blir det med flaggan -f (follow) vilket innebär att x antal rader av slutet automatiskt uppdateras i din ssh konsol (vanligtvis <a rel="nofollow" href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html" target="_blank">putty</a>).</p>
<p><fieldset style="background-color:#CEE1EF"><legend style="font-size:-1">tail exempel</legend>tail -f -n 10 /server_root/html_root/logs/sajt.se_error.log</fieldset>Tillbaka till Alias som jag snabbt kom fram till inte var en möjligt. Eftersom Alias gäller för en hel mapp inte enstaka filer eller filtyper. Plus ett annat generalfel som upptäckte senare.</p>
<p><fieldset style="background-color:#CEE1EF"><legend style="font-size:-1">Alias exempel</legend>Alias /images /server_root/central/common_image_folder</fieldset>Ovan direkt innebär att apache2 förväntar sig att källan till filer, som http://www.sajt.se/images/14-bildnamn.jpg, finns i mappen /server_root/central/common_image_folder på servern. Jag vill inte att bilderna ska ligga i en mapp utan direkt i webroten dvs http://www.sajt.se/14-bildnamn.jpg. Skulle jag köra ett Alias på webrooten så skulle det innebär att alla filer förväntas i målet för alias och det vill jag inte.</p>
<p>Nästa direktiv som jag då snubbla på var en släktning till Alias nämligen AliasMatch som nästan fungerar som RewriteRule fast fungerar även med mappar under webroten(DirectoryRoot). När jag väl testade detta så upptäckte jag i loggfilen att AliasMatch inte var tillåten .htaccess-filer och då inte heller Alias. Dessa måste ligga i apache2´s conf-filer eller i en VirtualHost specifikation. Eftersom jag har full kontroll över servern var det inga problem att specificera den där.</p>
<p><fieldset style="background-color:#CEE1EF"><legend style="font-size:-1">AliasMatch exempel</legend>AliasMatch (?i)^/([0-9]{1,})-.*?\.(jpg|jpeg|gif|png|bmp) /server_root/central/common_image_folder/$1.$2<br />
</fieldset><br />
Ovan är det regular expressions som gör susen och matchar endast bilder. (?i) betyder att matchningen inte ska vara versalkänsligt. Den andra delen i AliasMatch berättar i vilken mapp filerna finns i. $1.$2 är den första och den andra matchade parantesen i mönstret (pattern), och innebär att filen egentligen heter (en eller flera siffror) punkt (filändelse) tex 14-bildnamn.jpg blir till 14.jpg.</p>
<p>Samma lösning går givetvis att göra för vilka filer som helst som finns på en sajt. Jag behövde även ytterligare en lösning på detta problem som skulle användas för stylesheets som låg under centraliserade. Lösningen blev <a rel="nofollow" href="http://en.wikipedia.org/wiki/Symbolic_link">symlinks</a>. Det är en symbolisk genväg för något, en fil eller en mapp till exempel. En symbolisk länk är något man skapar på servern. För att apache2 ska följa symboliska länkar krävs direktivet FollowSymLinks.</p>
<p><fieldset style="background-color:#CEE1EF"><legend style="font-size:-1;margin-bottom:0px">FollowSymLinks i VirtualHost</legend>&lt;VirtualHost */&gt;<br />
DocumentRoot /server_root/html_root/sajt.se/<br />
ErrorLog  /server_root/html_root/logs/sajt.se_error.log<br />
&lt;Directory/&gt;<br />
<strong>FollowSymLinks</strong><br />
&lt;/Directory&gt;<br />
&#8212;&#8212;<em>Fler direktiv</em><br />
&lt;VirtualHost&gt;<br />
</fieldset><br />
Efter detta skapar man en symlink från DirectoryRoot, i detta fallet /server_root/html_root/sajt.se/ som pekar på en mapp någonstans på servern.</p>
<p><fieldset style="background-color:#CEE1EF"><legend style="font-size:-1;margin-bottom:0px">SymLink exempel</legend>ln -s /server_root/central/templates/template1/style.css /server_root/html_root/sajt.se/style.css<br />
</fieldset><br />
Oroa dig inte för att symlinken får 0777 som rättigheter eftersom det bara en symoblisk länk och det åndå målets rättigheter som gäller.  Det inte att andra rättigheter för en symlink. Fördelen är att du inte behöver tänka på ägarskapet dvs om www-data (användaren som apache2 identifierar sig som på server) för köra filen eller inte. När filen http://www.sajt.se/style.css efterfrågas av en webläsare använder apache2 filen /server_root/central/templates/template1/style.css.</p>
<p>Jag kommer att ändra och skapa symobliska länkar via PHP med funktionen exec. På sätt kan man kodmässigt enkelt ändra tex design för en sajt. Exemplet visar hur borttagandet/skapande sker för en stylesheet fil.<br />
<fieldset style="background-color:#CEE1EF"><legend style="font-size:-1;margin-bottom:0px">exec exempel</legend>exec(&#8221;rm /server_root/html_root/sajt.se/style.css&#8221;);<br />
exec(&#8221;ln -s /server_root/central/templates/template1/style.css  /server_root/html_root/sajt.se/style.css&#8221;);<br />
</fieldset><br />
Första direktivet tar bort(rm) eventuell symlink och det andra lägger till ett nytt.</p>
<p>Denna lösning gör att publiceringsverktyget kan hosta flera sajter med gemensamma serverscrpit och då ha fördelen att uppdateringar sker samtidigt för alla sajter samt att det är enkelt att kodmässigt byta designmallar för en sajt. En kanske självklar sak, men ändå skapade mig problem, var att Alias och AliasMatch inte kunde användas i .htaccess. Det står väldigt tydligt i dokumentationsfilerna för Apache2 var ett direktiv kan användas. Kolla faktarutan som står högst upp före alla direktiv, <strong>context</strong>. Där står det i vilket sammanhang det kan användas.</p>
<p>Som en liten parantes vill jag påpeka att http://www.sajt.se inte är en sajt som jag äger och har inget med detta exempel att göra.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.pierresoderman.com%2Falias-aliasmatch-htacces-och-tail%2F&amp;linkname=S%C3%B6kmotoroptimerade%20bilder%20och%20ett%20centraliserat%20publiceringsverktyg"><img src="http://www.pierresoderman.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.pierresoderman.com/alias-aliasmatch-htacces-och-tail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Streckad ram runt en länk</title>
		<link>http://www.pierresoderman.com/streckad-ram-runt-en-lank/</link>
		<comments>http://www.pierresoderman.com/streckad-ram-runt-en-lank/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 16:46:33 +0000</pubDate>
		<dc:creator>Pierre</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.pierresoderman.com/?p=126</guid>
		<description><![CDATA[Ibland dyker man på problem som man vet att man har stött på förut men glömt vad lösningen var. Tänkte att jag skulle skriva om några problemen och dess lösningar förhoppningsvis hjälper det någon förutom mig själv.
 Om man använder en a-tagg(ankare,anchor) för att aktivera ett javascript får man en irreterande streckad ram runt den [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Ibland dyker man på problem som man vet att man har stött på förut men glömt vad lösningen var. Tänkte att jag skulle skriva om några problemen och dess lösningar förhoppningsvis hjälper det någon förutom mig själv.</p>
<p><a href="http://www.pierresoderman.com/wp-content/uploads/2009/06/firefox_dotted_anchor.jpg"><img class="alignleft size-full wp-image-127" style="border:1px solid #CCC;margin-right:5px" title="firefox_dotted_anchor" src="http://www.pierresoderman.com/wp-content/uploads/2009/06/firefox_dotted_anchor.jpg" alt="" width="152" height="29" /></a> Om man använder en a-tagg(ankare,anchor) för att aktivera ett javascript får man en irreterande streckad ram runt den länkade texten. Men detta syns är bara problem i Firefox.  Detta är ingen bugg utan är användarvänlighet går det att läsa hos Firefox. Men jag gillar den inte om man använder en länk för att visa en bild. Lösningen är extremt enkel om man vill ta bort den.</p>
<p>Lösning<br />
<strong>style=&#8221;outline:0px&#8221; på a-taggen.</strong></p>
<p>Exempel<br />
&lt;a onclick=&#8221;javascript:aktiveraEnFunktion()&#8221; href=&#8221;#&#8221; <strong>style=&#8221;outline:0px&#8221;</strong>&gt;&lt;/a&gt;</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.pierresoderman.com%2Fstreckad-ram-runt-en-lank%2F&amp;linkname=Streckad%20ram%20runt%20en%20l%C3%A4nk"><img src="http://www.pierresoderman.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.pierresoderman.com/streckad-ram-runt-en-lank/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PDF med php</title>
		<link>http://www.pierresoderman.com/pdf-med-php/</link>
		<comments>http://www.pierresoderman.com/pdf-med-php/#comments</comments>
		<pubDate>Thu, 16 Oct 2008 15:26:06 +0000</pubDate>
		<dc:creator>Pierre</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.pierresoderman.com/?p=57</guid>
		<description><![CDATA[På jobbet har vi under en längre tid pratat om att skapa offerter och beställningar direkt på nätet. Dessa ska användas vid försäljning av produkter och tjänster. Självklart vill man kunna skicka en offert i pdf-format till en kund.
Vi beslutade att sätta igång med dett arbete igår. Så jag tänkte dela med mig av hur [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>På jobbet har vi under en längre tid pratat om att skapa offerter och beställningar direkt på nätet. Dessa ska användas vid försäljning av produkter och tjänster. Självklart vill man kunna skicka en offert i pdf-format till en kund.</p>
<p>Vi beslutade att sätta igång med dett arbete igår. Så jag tänkte dela med mig av hur man installerar detta på en debian server med php5.</p>
<p>Jag hittade två alternativ att med PHP dynamiskt skapa PDF-dokument. Den enklaste vägen är via <a href="http://fpdf.org/" target="_blank">FPDF</a> som är en PHP-class som man laddar upp på servern och sen inkluderar i sitt script.</p>
<blockquote><p>&lt;?php<br />
require(&#8217;fpdf.php&#8217;);</p>
<p>$pdf=new FPDF();<br />
$pdf-&gt;AddPage();<br />
$pdf-&gt;SetFont(&#8217;Arial&#8217;,'B&#8217;,16);<br />
$pdf-&gt;Cell(40,10,&#8217;Hello World!&#8217;);<br />
$pdf-&gt;Output();<br />
?&gt;</p></blockquote>
<p>Detta verkade lite för enkelt <img src='http://www.pierresoderman.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Näe om sanning ska fram så upptäckte jag efter några timmar att det var så lätt.</p>
<p>Jag började med att installera <a href="http://www.pdflib.com/" target="_blank">PDFLib</a> som är ett API som kan användas till flera olika språk, bla PHP. API-dokumentation för PDFLib-php är lite knaper och det var även PDFLib egna sida. Så efter mycket googlande och många olika installationsförsök lyckades jag installera.</p>
<p>För att få PDFLib att fungera för alla användare krävs root-rättigheter på servern.</p>
<ol>
<li>En C-kompilator behövs (apt-get install g++)</li>
<li>apt-get install php-pear</li>
<li>apt-get install php5-dev</li>
<li><a href="http://www.pdflib.com/download/pdflib-family/pdflib-7/" target="_blank">Ladda ner den senaste version av PDFLib</a>. I dagens läge är version 7 den senaste. Obs ladda ner C-version, inte PHP-version, för Linux.</li>
<li>Ladda upp tar-bollen till servern i lämplig katalog.</li>
<li>untar -zxvf PDFlib-Lite-7.0.x.tar.gz</li>
<li>cd PDFlib-Lite-7.0.x</li>
<li>./configure</li>
<li>make</li>
<li>make install</li>
<li>pecl install pdflib (På frågan install dir välj  /usr/local)</li>
</ol>
<p>Med dessa steg skapas det .so tillägg, i /usr/local/lib, för PHP så nu är det bara att lägga till den extension i php.ini . Sökvägen dit är vanligtvis <em>path</em>/php5/apache2/php.ini, se till att skapa en kopia innan du redigerar den filen. Jag brukar lägga till extensioner längst ner i filen</p>
<blockquote><p>extension=pdf.so</p></blockquote>
<p>Nu är det bara att reloada apachen</p>
<blockquote><p>/etc/init.d/apache2 reload</p></blockquote>
<p>Klart! Ivrigt laddade jag upp ett <a href="http://se2.php.net/manual/en/pdf.examples.php" target="_blank">php-pdf-exempel</a> för att se om det fungerade. Yes, inga problem, trodde jag. Jag testade även att lägga till en bild via ett <a href="http://se2.php.net/manual/en/function.pdf-load-image.php" target="_self">annat php-pdf-exempel</a>, inte heller detta exempel skapade några problem.</p>
<p>Det var när jag började skriva svenska tecken som det vart problem. Jag testade att ladda nya fonter, jag skapade nya fonter. Jag gav upp testade med FPDF istället. Men inget fungerade.</p>
<p>Ca 4 timmar senare innan jag hittade ett exempel som hade följande rader:</p>
<blockquote><p>$pdf-&gt;set_text_pos(100,100);<br />
$pdf-&gt;show(utf8_decode(&#8221;ÅÄÖåäö&#8221;));</p></blockquote>
<p>uft8_decode var lösningen. Detta borde jag givetvis ha testat först med det slog inte förrän jag visste lösningen.  Så encodingen winansi som anges i exemplen fungerar alldeles utmärkt.</p>
<p>Om någon undrar över att det i en del exempel står PDF_ framför en funktion och andra inte. Så kan detta API användas på två olika sätt.</p>
<blockquote><p>$pdf = new PDFLib();<br />
PDF_begin_page_ext($pdf,595,842,&#8221;");//A4-format</p></blockquote>
<p>Det andra sättet innebär ett snyggare och mer objekt-orienterat sätt (och snyggare).</p>
<blockquote><p>$pdf = new PDFLib();<br />
$pdf-&gt;begin_page_ext(595,842,&#8221;");//A4-format</p></blockquote>
<p>I exempelkoden ovan tar man bort $pdf-objektet som första argument till funktionen och har den framför istället.</p>
<p>Hoppas att detta hjälper någon.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.pierresoderman.com%2Fpdf-med-php%2F&amp;linkname=PDF%20med%20php"><img src="http://www.pierresoderman.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.pierresoderman.com/pdf-med-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
