I had a need to add ACL rules to entities at the repository level.
My biggest struggle was getting dependancy injection working.
This is what I finally came up with after a fresh mind and an instant coffee:
Mini rants, mostly about Linux admin and PHP code
I had a need to add ACL rules to entities at the repository level.
My biggest struggle was getting dependancy injection working.
This is what I finally came up with after a fresh mind and an instant coffee:
Sadly, this isn’t really documented (at time of writing).
Adding new protected variables to your User.php entity will not actually create database entries when you try to do a doctrine:schema:update.
While one still needs to have the protected variables in this entity class, along with getters and setters, the actual creation work is within UserBundle/Resources/config/doctrine/User.orm.xml
Here is an example for adding a foreign key:
If, like me, you can’t wait for Ubuntu 12.04.1 to be released, you can force an upgrade of your favourite OS OS.
sudo apt-get update; sudo do-release-upgrade -d
If you are going from the previous LTS 10.04, then the -d is important. Otherwise there would be no upgrade to offer.
The upgrade process should go smoothly enough. Except for when it comes to the kernel.
Bytemark VM’s make use of kernels that sit outside of the VM itself.
I didn’t realise this until I tried to fix syslog doing this:
Jun 26 10:30:01 banana kernel: Cannot read proc file system: 1 - Operation not permitted. Jun 26 10:31:02 banana kernel: last message repeated 1745888 times Jun 26 10:32:03 banana kernel: last message repeated 1722636 times Jun 26 10:33:04 banana kernel: last message repeated 1621724 times Jun 26 10:34:05 banana kernel: last message repeated 1761707 times
Even if you update grub, it’ll be ignored. Instead, follow the instructions here: http://www.bytemark.co.uk/support/technical_documents/kernelchange?tags=VirtualMachine
At the time of writing, I chose 3.2.0-kvm-i386-20110111 as it’s fairly close to the kernel being used by other Ubuntu 12.04 machines I have.
Your mileage may vary, but I hope this helps somebody else with the same trouble.
Further to my original quick db update queries, I found the need for a more in-depth approach.
A WordPress site my father works on has weekly backups, but he wanted to see that they actually worked.
To do so, I set up a subdomain vhost on my bytemark server and set about getting the back to work with it.
One of the most annoying/lazy/strange things about WordPress is that it uses serialised arrays within database fields. This makes a simple search and replace fail if you need to do anything more than update the two fields here.
This script works for the database set-up for my father. It may require further tweaks if additional plugins store absolute paths or URLs.
It also could do with a heavy dose of refactoring, but it works for my needs at this point in time 🙂
'wp3/wp-config.php'); if (!isset($argv[1])) { die("Please tell me where wp-config.php isn"); } $oldURL = 'http://oldDomainName.com'; $newURL = 'http://backup.of.my.wordpress.site.com'; $oldPath = '/home/chem9598/public_html/'; $newPath = '/var/www/backup_wordpres_site/codebase/htdocs/'; $configFile = $argv[1]; include_once($configFile); $db = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD); /* * 1.1) wp_options - simple options */ echo "
1.1) wp_options - simple options: "; $updateOptionsSql = "UPDATE wp_options SET option_value = REPLACE(option_value, '" . $oldURL . "', '" . $newURL . "') WHERE option_name IN ('siteurl', 'home');"; $updateOptionsRes = mysql_query($updateOptionsSql, $db); if (!$updateOptionsRes) echo mysql_error($db) . "
"; else echo mysql_affected_rows ($db) . " rows affected
"; /* * 1.2) wp_options - serialised array options */ echo "
1.2) wp_options - serialised array options: "; $selectOptionsSql = 'SELECT * FROM wp_options WHERE option_value LIKE "%' . $oldURL . '%"'; $selectOptionsRes = mysql_query($selectOptionsSql, $db); if (!$selectOptionsRes) echo mysql_error($db) . "
"; $options = array(); while($selectOptionsRes && $row = mysql_fetch_assoc($selectOptionsRes)) { $options[] = $row; } foreach ($options as $option) { if (substr($option['option_value'], 0, 2) == 'a:') { $optionValue = unserialize($option['option_value']); updateArray($optionValue, $oldURL, $newURL); $option['option_value'] = serialize($optionValue); $updateOptionsSql = "UPDATE wp_options SET option_value = '" . mysql_escape_string($option['option_value']) . "' WHERE option_id = " . $option['option_id']; $updateOptionsRes = mysql_query($updateOptionsSql, $db); if (!$updateOptionsRes) echo mysql_error($db) . "
"; else echo "."; } } echo "
"; /* * 1.3) wp_options - file path */ echo "
1.3) wp_options - file path: "; $selectOptionsSql = 'SELECT * FROM wp_options WHERE option_value LIKE "%' . $oldPath . '%"'; $selectOptionsRes = mysql_query($selectOptionsSql, $db); if (!$selectOptionsRes) echo mysql_error($db) . "
"; $options = array(); while($selectOptionsRes && $row = mysql_fetch_assoc($selectOptionsRes)) { $options[] = $row; } foreach ($options as $option) { if (substr($option['option_value'], 0, 2) == 'a:') { $optionValue = unserialize($option['option_value']); updateArray($optionValue, $oldPath, $newPath); $option['option_value'] = serialize($optionValue); $updateOptionsSql = "UPDATE wp_options SET option_value = '" . mysql_escape_string($option['option_value']) . "' WHERE option_id = " . $option['option_id']; $updateOptionsRes = mysql_query($updateOptionsSql, $db); if (!$updateOptionsRes) echo mysql_error($db) . "
"; else echo "."; } } echo "
"; /* * 2.1) wp_posts - guid */ echo "
2.1) wp_posts - guid: "; $updatePostsSql = "UPDATE wp_posts SET guid = REPLACE(guid, '" . $oldURL . "', '" . $newURL . "');"; $updatePostsRes = mysql_query($updatePostsSql, $db); if (!$updatePostsRes) echo mysql_error($db) . "
"; else echo mysql_affected_rows ($db) . " rows affected
"; /* * 2.2) wp_posts - post_content */ echo "
2.2) wp_posts - post_content: "; $updatePostsSql = "UPDATE wp_posts SET post_content = REPLACE(post_content, '" . $oldURL . "', '" . $newURL . "');"; $updatePostsRes = mysql_query($updatePostsSql, $db); if (!$updatePostsRes) echo mysql_error($db) . "
"; else echo mysql_affected_rows ($db) . " rows affected
"; function debug($var) { echo "<" . "pre>"; print_r($var); echo "<" . "/pre>"; } function updateArray(&$array, $find, $replace) { foreach ($array as $key => &$value) { if (is_array($value)) { updateArray($value, $find, $replace); } else { $array[$key] = str_replace($find, $replace, $value); } } }
Current project requires a couple of VPN tunnels to be set up. An IPsec and a PPTP.
The IPsec will wait for another day, the PPTP is set up and ready to go.
One thing that wasn’t quite right with the tunnel though, is the static route created by PPTP missed out a large chunk of the server’s network.
Starting the tunnel sets up the routing rule of 192.168.100.111 to be sent to the tunnel.
This meant that if I wanted to get to 100.10, it wasn’t being sent.
The way around this was to add a new route: route add -host 192.168.100.10 dev ppp0
Works great from the CLI, nothing happens when added to /etc/network/interfaces or /etc/network/if-up.d/foobar.
Found out (trial and error) that it was trying to add the route as soon as the tunnel was created. This doesn’t work as the tunnel takes a few seconds to wake up.
Work around was to add a ‘sleep 5’ to /etc/network/if-up.d/foobar before the route command line.
Creating race conditions isn’t nice, but it works 🙁
Web server: Linux (Ubuntu on my dev setup), Apache, PHP 5.3, Symfony 1.4, Doctrine 1.2.
Database server: Microsoft Windows 2008 Server, MS SQL Server
Trying to get Symfony to talk to the database server has been a painful experience for the last few days. But perseverance has paid off.
Lots of Googling with trial & error has resulted in actually achieving a development setup that will mirror the eventual production setup.
Short version:
all: doctrine: class: sfDoctrineDatabase param: dsn: dblib:dbname=datasourcename;host=sqlserver; username: ### password: ###
In the above snippit, replace ‘datasourcename’ with whatever you used in /etc/odbc.ini and replace ‘sqlserver’ with the name used in /etc/freetds/freetds.conf & /etc/odbc.ini
It’s late and I’ve been struggling to get this working for some time. I may expand this entry in the future if required.
References and insperation:
1) http://blog.acjacinto.com/2011/11/compiling-php-with-mssql-servers-native.html
2) http://www.microsoft.com/download/en/details.aspx?id=28160
3) http://jamesrossiter.wordpress.com/2011/03/08/connecting-to-microsoft-sql-server-using-odbc-from-ubuntu-server/
4) http://trac.symfony-project.org/wiki/HowToConnectToMSSQLServer
Via the Ubuntu Software Centre:
One of the biggest complaints that web developers have is their lack of control over end users.
When will we be able to tell them a) not to paste Micosoft Word or b) if you must, paste it into something that doesn’t do formatting 1st.
It has a nasty habit of converting quotes into “smart” quotes as well as messing up characters such as the euro symbol €.
This is the fix I came up with that allows end users to continue to paste from such programs and bring their weird charset issues with them:
function fixChars($text) { $chars = array( "/xe2x82xac/" => "€", "/xe2x80x99/" => "'", "/xe2x80x9c/" => "“", // open quotes "/xe2x80x9d/" => "”", // close quotes "/xe2x80x93/" => "—", "/x80/" => "€", "/x92/" => "'", "/x93/" => "“", // open quotes "/x94/" => "”", // close quotes "/x96/" => "—", "/xa3/" => "£", ); $find = array_keys($chars); $replace = array_values($chars); return preg_replace($find, $replace, $text); }
[Update 21st Aug 2013
Post code replaced with a Github GIST.
Please fork and help improve this script 🙂
[Updated 7th Feb 2012
Changes:
+ file names are now as they would be if you downloaded via web browser
+ Playlist is now in reverse date uploaded order]
I like to have music while I’m coding. It breaks the silence while working alone at home.
When I have music playing, it’s best if I don’t have to think about setting up playlists, which is why I used to listen to the radio. The radio has it’s limits though, not enough Ninja Tune I think.
Speaking of Ninja Tune, I <3 their SolidSteel mixes http://soundcloud.com/ninja-tune/sets/solid-steel-radio-shows/
What I don’t like is having to listen via my web browser and their music player in Flash. A recourse hog and not great if you want their music on a device disconnected from the ‘net.
Thankfully, with SoundCloud tracks, you can download any file you wish. The downside to it is that there’s a lot to download. What if you want a whole playlist? A playlist of (currently) 151 tracks for instance?
The script below will download all of the tracks in a set to a directory and create a .m3u playlist at the same time.
Please excuse the justified text and syntax-highlighting gone wrong. View plain, or copy to clipboard and it’ll be fine.
In my last post I raved about the excellent plugin wp-blocks by Keir Whitaker and then went on to extend it a little.
Time to extend it a little further, this time by adding a shortcode.
Shortcodes are the handy square bracketed code snippets which conjure up more content and functionality direct from a page or post content.
The wp-blocks plugin is currently intended to work with the theme template files in PHP. Unfortunately (or fortunately?) PHP does not get parsed within the content areas. This does stop malicious code from being included, but it does limit things when you know what you’re doing.
The following code will give you a short code to work with which looks similar to the PHP code snippit you would include in your theme template file.
/** * Gets the block data by 'name' and returns it for use in a content shortcode * Requires http://wordpress.org/extend/plugins/wp-blocks/ * * @param string $name * @return string * @author Iain Cuthbertson */ function get_wp_block_shortcode( $atts ) { extract( shortcode_atts( array( 'name' => '', ), $atts ) ); global $wpdb; $block_slug = trim($name); $data = (array)$wpdb->get_row("SELECT * FROM {$wpdb->prefix}wpb_content WHERE name = '{$name}' AND active = TRUE"); if($data) return get_wrapped_block_content($data); } add_shortcode('get_wp_block', 'get_wp_block_shortcode');
Add that to your theme’s functions.php file and then you will be able to add blocks to your content with, for example:
[get_wp_block name="foo"]