Installing the ssh2 PHP extension, with PHP 5.3
Posted by Adam in Fixing Errors, Linux, PHP, Programming on Sunday March 21, 2010
WARNING: Please read before continuing ▼
Difficulty: Moderate
Time: ~5 Minutes
Last Updated: 21st March 2010
Applies to: *NIX
Currently, due to an API change ssh2 will not install via pecl. Despite being a one-line fix, and 5.3 being out for some months now, the maintainers have neglected to make their extension compatible with PHP 5.3
If you recieve an error similar to:
1 2 | /tmp/pear/download/ssh2-0.11.0/ssh2.c:52: error: duplicate "static" /tmp/pear/download/ssh2-0.11.0/ssh2.c: In function "zif_ssh2_methods_negotiated": |
Then you are affected. To fix this, you need to download and extract the ssh2 package:
1 2 | pecl download channel://pecl.php.net/ssh2-<version> tar xvf ssh-<version>.tar |
Open up ssh2-<version>/ssh2.c and look for the following block around line 50:
1 2 3 4 5 6 7 8 | #ifdef ZEND_ENGINE_2 static ZEND_BEGIN_ARG_INFO(php_ssh2_first_arg_force_ref, 0) ZEND_ARG_PASS_INFO(1) ZEND_END_ARG_INFO() #else static unsigned char php_ssh2_first_arg_force_ref[] = { 1, BYREF_FORCE }; #endif |
From that block, you need to remove the first “static” so it looks like this:
1 2 3 4 5 6 7 | #ifdef ZEND_ENGINE_2 ZEND_BEGIN_ARG_INFO(php_ssh2_first_arg_force_ref, 0) ZEND_ARG_PASS_INFO(1) ZEND_END_ARG_INFO() #else static unsigned char php_ssh2_first_arg_force_ref[] = { 1, BYREF_FORCE }; #endif |
After you’ve done this, simply repackage and install:
1 2 | pecl package package.xml pecl install -f ssh2-<version>.tgz |
Software Engineering: Munificent’s ghetto guide to Big-O notation:
Posted by Adam in Programming, Software Engineering on Thursday December 3, 2009
The basic idea is that you want a simple formula that converts the number of items you have to process to how long you can expect that to take. So, if you have 20 items and your Big-O is O(n^2), then it’ll take about 400 (of some unspecified unit of time/work) to process.
The actual number doesn’t matter, what matters is how quickly it grows as the number of items grows. Growing slower is better, of course. Because the actual number doesn’t matter, constants are discarded, and lower powers are discarded. O(2n^4 + 3n + 5) is just O(n^4).
Here’s how to roughly estimate the Big-O for your code:
Fixed work
Any random chunk of code that does something once (like, say, printing something to the screen, or initializing a variable) is O(1).
Binary search
If you hunt through the items using a binary search, where at each step you cut your search space in half, that’s O(log n). (That log there is base 2, not 10.) So, finding a number in a sorted array is O(log n). Most algorithms involving binary trees will have a “log” in their Big-O.
Loops
If you loop through all of the items, that’s O(n). So, finding the biggest value in an array of numbers (naïvely) is O(n).
Permutations
If you’re going through every permutation of your items, that’s O(n!). For example, if you’re doing a naïve algorithm to find anagrams using a given set of letters by trying every possible combination, you’re permutating.
Exponentials
The last common Big-O type is O(2^n). The only simple example I can think of is if you need to create a filled binary tree of depth n, then that’ll have O(2^n). There are some other algorithms that have this, but, thankfully, you shouldn’t run into it much.
So those are the basic types in order from best (fastest) to worst. Once you hit O(n!) or O(2^n), you’re in the range of algorithms where your code will very likely be too damn slow. This is why it’s good to know the Big-O of your code.
The question now is, how are these individual parts combined in a big chunk of code?
Sequential
If your code does one thing and then another, then the Big-O of those two parts are added. So, if you do some fixed work and then loop through your items, it’s O(1 + n). Since we discard any lower terms, what this really means is if you do one thing then another, take the bigger Big-O of the two (O(n) in our example).
Nesting
If your code does one thing inside another, then the Big-O of those two parts are multiplied. So, if you loop through all of the items and the loop through them again inside that loop, that’s O(n * n) or just O(n^2). This is the one you’ll need to pay attention to. If your code is calling some function within a loop that also loops through the items, you can end up with worse complexity than you realize.
Another example: if you iterate through each item in the list, and for each item, you do a binary search, that’s O(n * log n), or just O(n log n). Most sorting algorithms are around here. It’s better than O(n^2), but worse than O(n).
Recursion
This is a tricky one. If your code calls itself, it may be the same as nesting, or it could be better, or much worse. It all depends on your exit condition and how the input set is reduced at each recursive step. A recursive binary search only gives you O(log n) because each recursive call cuts n in half. If the recursion reduces the input size by only one each time, you’ve got O(n!).
A computer scientist would probably say this isn’t rigorous at all, but this should be good enough for an engineer. The goal here is to be able to quickly scan your code and get an idea of if it’s going to blow up and take forever or not.
Source: http://www.reddit.com/r/programming/comments/a940e/how_i_hire_programmers/c0gfm6g
Opening an elevated command prompt
Posted by Adam in Changing Settings, Linux, OS X, Windows on Sunday November 29, 2009
WARNING: Please read before continuing ▼
Difficulty: Easy
Time: varies
Last Updated: 29th November 2009
Applies to: OS X, Windows, *NIX
Often when performing system administration, you will come across a command that needs to be run as a more priviliged user. Depending on what operating system you use, the procedure for opening an elevated command prompt varies. Read the rest of this entry »
Comparing the contents of 2 directories
Posted by Adam in Fixing Errors, Linux, OS X, Uncategorized on Monday November 9, 2009
WARNING: Please read before continuing ▼
Difficulty: Easy
Time: Varies
Last Updated: 9th November 2009
Applies to: OS X, and Linux
Sometimes, you can end up with multiple copies of a directory from different times. If the number of files is small, then comparing the contents is easy. With large directories, telling the difference between them can be nearly impossible.
Resetting Windows product activation notices
Posted by Adam in Setting Up, Uncategorized, Windows on Thursday November 5, 2009
WARNING: Please read before continuing ▼
Difficulty: Easy
Time: ~1 Minute
Last Updated: 5th November 2009
Applies to: Windows
Since Windows XP, Microsoft has required that all CD keys are validated with them at install time, to combat piracy. Whilst this generally has little impact, if you have misplaced your CD key, or are waiting for one to arrive, you can end up locked out of your own computer.
Read the rest of this entry »
Clearing cached DNS entries
Posted by Adam in Fixing Errors, Linux, OS X, Uncategorized, Windows on Sunday November 1, 2009
WARNING: Please read before continuing ▼
Difficulty: Expert
Time: ~1 Minute
Last Updated: 1st November 2009
Applies to: Windows, OS X, and Linux
Sometimes, when messing around with domain names (the DNS system), you’ll mis-type an address, and be unable to access your site for a significant length of time. Assuming that the incorrect entry has not been cached on another DNS server somewhere between you and your host, you can clear the list of cached addresses on your own machine to resolve the problem.
Utilities: Filename Randomiser
Posted by Adam in Programming, Windows on Wednesday October 28, 2009
Program Information:
This is a small program to change the filenames of all files in the target folder to something random and uniform. This may be useful for, as an example, a number of photos in a directory that are displayed in filename order.
It should go without saying that if you run this on a directory it will rename everything in that directory, so take care.
Remotely controlling OS-X via a web page
Posted by Adam in OS X, Programming on Saturday October 24, 2009
WARNING: Please read before continuing ▼
Difficulty: Expert
Time: varies
Last Updated: 24th October 2009
Applies to: OS X
Applescript is a scripting language provided by OS X that has the ability to automate significant portions of the system.
PHP has the ability to, given the right configuration, make arbitrary system calls, including applescript.
Using the two together, one can remotely control a number of functions on an OS X system via a web page.
Mixing C++ and Objective-C code using XCode
Posted by Adam in OS X, Programming on Tuesday October 20, 2009
WARNING: Please read before continuing ▼
Difficulty: Expert
Time: varies
Last Updated: 20th October 2009
Applies to: Objective-C
With the release of the iPhone SDK and the growing popularity of OS X, Objective-C is becoming the language of choice for a significant amount of projects.
One inescapable fact in the programming world is the existence of legacy code. Moving to a new language typically means porting or rewriting existing code entirely in the new language. In the case of Objective-C, most existing C and C++ code can be used directly.
Renaming the admin user on a WordPress 2.8+ blog
Posted by Adam in Improving Security on Friday October 16, 2009
WARNING: Please read before continuing ▼
Difficulty: Easy
Time: ~5 Minutes
Last Updated: 16th October 2009
Applies to: WordPress
By default, WordPress uses “admin” as the log in name for the first user. With this information, a prospective cracker is only a password away from your wordpress admin account. By changing the admin user name, the minimum amount of information required for any miscreant to access the account is increased.