<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6982322852741466803</id><updated>2011-09-21T21:14:34.951-07:00</updated><category term='JSON'/><title type='text'>Niels Sandholt Busch blog...</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://nielsbusch.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6982322852741466803/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://nielsbusch.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Niels Sandholt Busch</name><uri>http://www.blogger.com/profile/11680379292332377454</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_RWKv0ifaMUA/SVcYDvWCNcI/AAAAAAAAB-k/JThvDJy_XCI/S220/niels.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>3</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6982322852741466803.post-13991037803818640</id><published>2010-12-25T05:48:00.001-08:00</published><updated>2010-12-25T05:48:50.929-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><title type='text'>How to (safely) embed JSON in a script tag</title><content type='html'>&lt;div class='posterous_autopost'&gt;&lt;p&gt;If you embed JSON in a web page, you must make sure you are not vulnerable to XSS (Cross-site scripting) attacks. Usually you would just HTML escape your content, but that corrupts your JSON.&lt;/p&gt;  &lt;p&gt;instead escape the script start and end characters and the ampersand character with their unicode encodings. This will prevent XSS but still allow for valid JSON&lt;/p&gt;  &lt;p&gt;&lt;code&gt;    json  += json.replace('&amp;amp;', '\\u0026')    json += json.replace('&amp;lt;', '\\u003c')    json += json.replace('&amp;gt;', '\\u003e')    &lt;/code&gt;&lt;/p&gt;  &lt;p&gt;If you use simplejson for generating JSON, the newest version has a&amp;nbsp;&lt;span style=""&gt;JSONEncoderForHTML that does exactly this.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://blog.nielsbusch.dk/how-to-safely-embed-json-in-a-script-tag"&gt;Yet another blog...&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6982322852741466803-13991037803818640?l=nielsbusch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nielsbusch.blogspot.com/feeds/13991037803818640/comments/default' title='Kommentarer til indlægget'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6982322852741466803&amp;postID=13991037803818640' title='0 kommentarer'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6982322852741466803/posts/default/13991037803818640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6982322852741466803/posts/default/13991037803818640'/><link rel='alternate' type='text/html' href='http://nielsbusch.blogspot.com/2010/12/how-to-safely-embed-json-in-script-tag.html' title='How to (safely) embed JSON in a script tag'/><author><name>Niels Sandholt Busch</name><uri>http://www.blogger.com/profile/11680379292332377454</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_RWKv0ifaMUA/SVcYDvWCNcI/AAAAAAAAB-k/JThvDJy_XCI/S220/niels.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6982322852741466803.post-7883109754989805887</id><published>2009-11-07T12:29:00.001-08:00</published><updated>2009-11-07T12:29:45.336-08:00</updated><title type='text'>Migrating trac from SQLite to MySQL</title><content type='html'>&lt;p&gt;A little while ago I was tasked with migrating about hundred trac instances from SQLite to MySQL. Unfortunately SQLites schema definitions is not compatible with MySQL. So I had to wrote some scripts to handle it. After a little bit of experimenting everything worked perfectly.&lt;/p&gt;  &lt;p&gt;The Strategy I employed was like this:&lt;/p&gt;  &lt;ol&gt;  &lt;li&gt;Make a dump of a default MySQL trac db schema.&lt;/li&gt;  &lt;li&gt;Make a dump of the trac SQLite database&lt;/li&gt;  &lt;li&gt;Remove db schema definitions from the SQLite dump&lt;/li&gt;  &lt;li&gt;Concatenate the MySQL and SQLite dumps&lt;/li&gt;  &lt;li&gt;Load data into MySQL&lt;/li&gt;  &lt;li&gt;Edit Trac's database settings to use MySQL&lt;/li&gt;  &lt;li&gt;Do a trac-admin upgrade&lt;/li&gt;  &lt;/ol&gt;  &lt;p&gt;MYSQL_USER=username&lt;br /&gt;MYSQL_PSWD=password&lt;p /&gt;SQLITECMD=sqlite3&lt;br /&gt;TRACBASE=/path/to/tracreps&lt;/p&gt;  &lt;p&gt;# loop through all trac instances in tracreps&lt;br /&gt;for d in $( ls $TRACBASE )&lt;br /&gt;do&lt;br /&gt;if [ -d "$TRACBASE/$d" ]; then&lt;br /&gt;echo $d&lt;br /&gt;TRACNAME=$d&lt;p /&gt;# create database in mysql&lt;br /&gt;echo "creating database for $TRACNAME..."&lt;br /&gt;mysqladmin --user $MYSQL_USER -p$MYSQL_PSWD create $TRACNAME&lt;p /&gt;# dump sqlite db structure + data&lt;br /&gt;echo "dumping data from sqlite..."&lt;br /&gt;$SQLITECMD $TRACBASE/$TRACNAME/db/trac.db .dump &amp;gt; trac.sqlite.sql&lt;p /&gt;# remove database definitions from dump using a custom python script&lt;br /&gt;echo "cleaning database definition from dump..."&lt;br /&gt;`./cleansql.py &amp;lt; trac.sqlite.sql &amp;gt; trac.sqlite.sql.dataonly`&lt;p /&gt;# concatenate mysql database definitions and sqlite data&lt;br /&gt;cat trac.mysql.sql trac.sqlite.sql.dataonly &amp;gt; trac.sql&lt;p /&gt;echo "loading data into mysql..."&lt;br /&gt;mysql --user $MYSQL_USER -p$MYSQL_PSWD --default_character_set utf8 $TRACNAME &amp;lt; trac.sql&lt;p /&gt;# edit database connection string in trac.ini&lt;br /&gt;sed -i "s?sqlite:db/trac.db?mysql://$MYSQL_USER:$MYSQL_PSWD@localhost:3306/$TRACNAME?" $TRACBASE/$TRACNAME/conf/trac.ini&lt;p /&gt;echo "upgrading mysql database..."&lt;br /&gt;trac-admin $TRACBASE/$TRACNAME upgrade --no-backup&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;To remove schema definitions from the sqlite dump and fix some incompatibilities I made this python script referenced above as cleansql.py:&lt;/p&gt;  &lt;p&gt;#!/usr/bin/env python&lt;p /&gt;import sys&lt;br /&gt;import re&lt;p /&gt;file = sys.stdin.read()&lt;br /&gt;file = re.sub(r'(CREATE (TABLE|INDEX)[^;]*|COMMIT|BEGIN TRANSACTION);', '', file)&lt;br /&gt;file = re.sub(r'INSERT INTO "([^"]+)"', lambda m: 'INSERT INTO `%s`' % m.groups(1), file)&lt;br /&gt;# fix sql for reports&lt;br /&gt;file = re.sub(r'CAST\((.+) AS int\)', lambda m: 'CAST(%s AS signed)' % m.groups(1), file)&lt;p /&gt;sys.stdout.write(file)&lt;/p&gt;  &lt;p&gt;And that's it. I hope this will benefit someone tasked with the same job.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via web&lt;/a&gt;  from &lt;a href="http://blog.nielsbusch.dk/migrating-trac-from-sqlite-to-mysql"&gt;Yet another blog...&lt;/a&gt; &lt;/p&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6982322852741466803-7883109754989805887?l=nielsbusch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nielsbusch.blogspot.com/feeds/7883109754989805887/comments/default' title='Kommentarer til indlægget'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6982322852741466803&amp;postID=7883109754989805887' title='0 kommentarer'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6982322852741466803/posts/default/7883109754989805887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6982322852741466803/posts/default/7883109754989805887'/><link rel='alternate' type='text/html' href='http://nielsbusch.blogspot.com/2009/11/migrating-trac-from-sqlite-to-mysql.html' title='Migrating trac from SQLite to MySQL'/><author><name>Niels Sandholt Busch</name><uri>http://www.blogger.com/profile/11680379292332377454</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_RWKv0ifaMUA/SVcYDvWCNcI/AAAAAAAAB-k/JThvDJy_XCI/S220/niels.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6982322852741466803.post-5268118075851000492</id><published>2008-12-01T15:14:00.000-08:00</published><updated>2009-08-02T07:16:46.004-07:00</updated><title type='text'>Widget test</title><content type='html'>&lt;div id="testwidget"&gt;&lt;/div&gt;&lt;br /&gt;&lt;script src="http://niels.signupbox.dk/test/widget/"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6982322852741466803-5268118075851000492?l=nielsbusch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nielsbusch.blogspot.com/feeds/5268118075851000492/comments/default' title='Kommentarer til indlægget'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6982322852741466803&amp;postID=5268118075851000492' title='0 kommentarer'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6982322852741466803/posts/default/5268118075851000492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6982322852741466803/posts/default/5268118075851000492'/><link rel='alternate' type='text/html' href='http://nielsbusch.blogspot.com/2008/12/hejsa.html' title='Widget test'/><author><name>Niels Sandholt Busch</name><uri>http://www.blogger.com/profile/11680379292332377454</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_RWKv0ifaMUA/SVcYDvWCNcI/AAAAAAAAB-k/JThvDJy_XCI/S220/niels.jpg'/></author><thr:total>0</thr:total></entry></feed>
