Options saved.

'; } $checked = ''; if($ping == 1) $checked = 'checked="checked"'; echo '

URIs to Ping

The following services will automatically be pinged/notified when you publish posts. Not when you edit previously published posts, as WordPress does by default.

NB: this list is synchronized with the original update services list.

Separate multiple service URIs with line breaks:

Ping log

These are the lastest actions performed by the plugin.


'; } # telling WordPress to ping if the post is new, but not if it's just been edited function SUP_ping_if_new($id) { global $wpdb, $post_title; if(get_option('SUP_ping') == 1 and get_option('ping_sites') != "") { # fetches data directly from database; the function "get_post" is cached, # and using it here will get the post as is was before the last save $row = mysql_fetch_array(mysql_query( "SELECT post_date,post_modified FROM $wpdb->posts WHERE id=$id")); # if time when created equals time when modified it is a new post, # otherwise the author has edited/modified it if($row["post_date"] == $row["post_modified"]) { if($post_title) SUP_log("Pinging services (new post: “".$post_title."”) ..."); else SUP_log("Pinging services (new post) ..."); SUP_ping_services(); # Try commenting the line above, and uncommenting this line below # if pinging seems to be out of order. Please notify the author if it helps! # generic_ping(); } else { if($post_title) SUP_log("NOT pinging services (“".$post_title."” was edited)"); else SUP_log("NOT pinging services (a post was edited)"); } } else SUP_log("NOT pinging services (disabled by administrator)"); } # More or less a copy of WP's "generic_ping" from functions.php, # but uses another function to send the actual XML-RPC messages. function SUP_ping_services() { $services = get_settings('ping_sites'); $services = preg_replace("|(\s)+|", '$1', $services); // Kill dupe lines $services = trim($services); if ( '' != $services ) { $services = explode("\n", $services); foreach ($services as $service) SUP_send_xmlrpc($service); } } # A slightly modified version of the WordPress built-in ping functionality ("weblog_ping" in functions.php). # This one uses correct extendedPing format (WP does not), and logs response from service. function SUP_send_xmlrpc($server = '', $path = '') { global $wp_version; include_once (ABSPATH . WPINC . '/class-IXR.php'); // using a timeout of 3 seconds should be enough to cover slow servers $client = new IXR_Client($server, ((!strlen(trim($path)) || ('/' == $path)) ? false : $path)); $client->timeout = 3; $client->useragent .= ' -- WordPress/'.$wp_version; // when set to true, this outputs debug messages by itself $client->debug = false; $home = trailingslashit( get_option('home') ); # the extendedPing format should be "blog name", "blog url", "check url" (whatever that is), and "feed url", # but it would seem as if the standard has been mixed up. it's therefore best to repeat the feed url. if($client->query('weblogUpdates.extendedPing', get_settings('blogname'), $home, get_bloginfo('rss2_url'), get_bloginfo('rss2_url'))) { SUP_log("- ".$server." was successfully pinged (extended format)"); } else { # pinging was unsuccessful, trying regular ping format if($client->query('weblogUpdates.ping', get_settings('blogname'), $home)) { SUP_log("- ".$server." was successfully pinged"); } else { SUP_log("- ".$server." could not be pinged. Error message: “".$client->error->message."”"); } } } $post_title = ""; # Receives the title of the post from a filter below function SUP_post_title($title) { global $post_title; $post_title = $title; return $title; } # ----- # Log stuff $logfile = ABSPATH."wp-content/smart-update-pinger.log"; # for debugging function SUP_log($line) { global $logfile; $fh = @fopen($logfile, "a"); @fwrite($fh, strftime("%D %T")."\t$line\n"); @fclose($fh); } function SUP_get_last_log_entries($num) { global $logfile; $lines = @file($logfile); if($lines === false) return "Error reading log file (".$logfile."). This could mean that the wp-content directory is write-protected and no log data can be saved, that you have manually removed the log file, or that you have recently upgraded the plugin."; else { $lines = array_slice($lines, count($lines) - $num); $msg = ""; foreach($lines as $line) $msg .= trim($line)."
"; return $msg; } } # ----- # adds a filter to receive the title of the post before publishing add_filter("title_save_pre", "SUP_post_title"); # adds some hooks # shows the options in the administration panel add_action("admin_menu", "SUP_add_options_page"); # calls SUP_ping whenever a post is published add_action("publish_post", "SUP_ping_if_new"); # calls SUP_ping_draft when changing the status from private/draft to published # add_action("private_to_published', 'SUP_ping_draft'); # removes the "WordPress official" pinging hook remove_action("publish_post", "generic_ping"); # activates pinging if setting doesn't exist in database yet # (before the user has changed the settings the first time) if(get_option("SUP_ping") === false) { update_option("SUP_ping", 1); } ?> Clean Xcode project directories with Synx | .: Blog.FlashGen.Com :: Mike Jones - Creative Technologist :.


Clean Xcode project directories with Synx

I’ve been writing code for a very long time now, using different IDEs and a varied array of languages. My current jam is developing iOS applications, or more specifically, writing Swift. However, one thing that is a constant for me – regardless of what language / glorified text editor I’m using is… keeping my file system neat and tidy.
I suppose you could say I was a bit obsessive compulsive in that way – although I warrant that most people who use a computer for more than email and Facebook probably spend a good amount of time making sure everything is organised on their hard disk (or am I truly the only one…). Anyway before I go off on a tangent I should bring this back to the core point of this article – neat and organised code on my file system.
Now anyone who’s used Xcode for any amount of time will know all about its concept of groups. Groups to Xcode are a conceptual way of organising your application within the project overview, but unfortunately have nothing to do with how your files are organised on your hard drive. Now for a lot of us this may not be an issue as a lot of iOS apps have a handful of classes, view controllers and storyboards; so keeping them organised isn’t a big deal (well not to normal people but I still see the issue :p).
The problem of ‘virtual’ grouping and file system organisation raises its ugly head when you work on a more complex and broader application that may have several hundred classes, view controllers or storyboards etc. and being able to quickly jump to one of the files from outside of Xcode can become problematic. If it does you can approach this in a couple of ways:
  1. Ignore it and accept this is how it should be
  2. Manually create folders in your actual app folder to replicate the virtual groups in Xcode and organise your code the same way
  3. Use something like Synx
So let’s go through my non-exhaustive list of options one-by-one and see which may be useful, if like me, you feel it needs more thought.
First up we have Option 1 – the head in the sand approach. It’s the way it is and so it shall remain. To be honest, I have no issue with this if it works for you. It doesn’t work for me so I’m more interested in options 2 and 3.
Option 2 – manually recreate the groups as actual folders and move the files in to the same structure as Xcode groups. This works but is very manual and will likely not work on the first pass. This is generally because you have to remove all of the compile sources, linked binaries and bundle resource entries in the Build Phase of your project because they will now all be pointing to the wrong location. Plus all of the entries in your actual project will now have probably turned red as Xcode can no longer find the files. The fix for this is to remove all the file references and add them back to the project based on their new location on your hard drive. That’ll fix it but as you can see it’s a bit brittle. Oh and don’t forget your info.plist files will need resetting in the project overview for each target you have set.
Not the end of the world, but still a bit “manual” and time consuming. Which leads us to Synx (which is obviously the focus of this article any way :D).
Option 3 – Synx. OK, so what is Synx? Synx is a simple command line tool that reads your .xcodeproj or .xcworkspace and recreates the folder structure based on your Xcode groups and moves the files in to these newly created folders. Yay! It does all the manual stuff and quicker than I can. FTW!
Whoa there horsey! There are a few things you need to know before cracking out the Playstation controller and kicking back. Firstly you need to have Ruby on your Mac (not a big ask as most modern Macs come with a version of Ruby installed by default). Next you need to install the Ruby Gem:
If you’re using the built in version of Ruby you’ll likely need to sudo the previous command, (and you should really consider using RVM).
Next via Terminal locate the root directory of your Xcode project, and once there use the following command to get Synx to rebuild your folder structure. WARNING – Make sure you have back up your project to Git or a separate location before doing this!
(obviously replacing the path with that of your actual project)
If you’re using Cocoapods it may have moved some bits around, which will likely confuse Cocoapods – so to be safe run pod install to recreate your Cocoapods repository again.
If you’d like to try it out or know more, head over to the Synx repo on Github: https://github.com/venmo/synx


No comments for “Clean Xcode project directories with Synx”

Post a comment