Thursday, May 24, 2012

Updating a jailbroken ATV2 to iOS 5

I recently updated my ATV2 to iOS 5 (w/ tethered jailbreak, - tethered meaning you need to connect the ATV2 to your computer each time to re-power or else the ATV2 won't boot-up).  Updating is easy as cheese if it's not jailbroken, but since mine was the experience definitely brings to mind the saying "if it works, don't touch it".  The good news it that it eventually worked!

So why did I touch it?  I learned about the new AirPlay feature on the iPhone 4s, after a visit to the Apple store, and wanted to try this out.  Unfortunately, my jailbroken ATV2 was stuck at iOS 4, which doesn't support this new feature.

So here's how it went:

First I followed this video: http://www.youtube.com/watch?v=dX1bsSL9bUw, which I found on the wiki.xbmc.org site.  Unfortunately, each attempt to use SeasOnPass to re-jailbreak the ATV2 resulted in an error from iTunes (error 21) and the jailbreak ultimately failing, leaving the ATV2 in a useless state.

Google searches for the error 21 come up with suggestions like: try a different cable, try again (and again, and again), restart computer, first make sure a standard restore works from iTunes.

Unfortunately a standard restore through iTunes always resulted in the same error.  And no luck with several re-tries or restarts.  Great, did I brick my ATV2?  With each re-try I have to restart SeasOnPass, which for some reason takes 5+ minutes to load, so I gave up for now...

Well, as it turns out, re-try (again and again) was the answer.  Came back a week later and tried again (may have used a different USB port) and it worked the first try when using SeasOnPass.

From here on, things went relatively smoothly.  Here are the basics steps after getting SeasOnPass loaded.

  1. Used the NitoTV installer downloaded from here: http://i0sen.dyndns.org/jailbreak-Tools.html
  2. Under ATV2 settings, set sleep to NEVER.
  3.  Followed instruction at XBMC to install latest unofficial Eden version for iOS 5 as given in this post: http://forum.xbmc.org/showthread.php?tid=127369
  4. Re-load backed-up XBMC folder (assuming you followed the YouTube instructions)
 I haven't actually tried step 4 yet, but I'll find out soon how it goes.

Hope this helps somebody.

"...original item for "Shares" cannot be found." when sharing PC to Mac

I tried to share an external drive from my WinXP box to a Mac (MBP) and always got the following error:

"The operation cannot be completed because the original item for "Shares" cannot be found."

Searches on Google came up with plenty of solutions for this error, but none of which worked in my case.  So in case it helps somebody in the future, here's how I resolved it.

A little investigation revealed that I could share other folders and access them fine from the MBP, just not the external drive.  I eventually figured out that I just couldn't share things that were large.  Since my external drive was 500 GB, it easily fell into this category.

This size restraint on sharing was fixed by following instructions here:

http://support.microsoft.com/kb/106167

Basically, there's some parameter (on the WinXP machine) you have to adjust to allow larger things to be shared.  The parameter is adjusted/added using regedit.  I changed it to the max value of 0xC (12), and that worked fine.

Tuesday, March 6, 2012

Use of PHP functions within Smarty code

Can standard PHP functions be used directly within Smarty code?  The answer is yes, but the proper syntax depends on where you use it!  For example, the syntax is different for 'assign' statements than for conditional statements.  See the examples below for getting a count from an array variable named 'aArray'.

Assignment syntax:

[{assign var="iCnt" value=$aArray|@count }]

Condition statement:

[{if count($aArray) == 0 }]DO WHATEVER[{/if}]

So in the case of assignments, a variable modifier must be used.  But within condition statements the function can be called directly.

Monday, February 13, 2012

Old Photo Effect With A Touch Of Colour

Here's the result of trying to simulate and old photo feel, but with some added colour. I used the following photo as a basis for what old looks like.

Taking note of the following characteristics:
  • Blurred edges
  • Grainy print
  • Stained edges
I went ahead and shopped the following:
  • Used Artistic > Film Grain filter
  • Gaussian blur masked by a radial gradient with the start of the gradient offset by 50%
  • Black & White adjustment layer with tint, and manually adjusted to best bring out pattern of shirt in photo.
  • Added mask to B&W adjustment layer and used grey to to partially expose some original colors.
  • Slightly reduced opacity of B&W layer to give a little overall color.
  • Added a radial gradient to the border with a tan colour and gave it Multiply blend mode.
Result is shown below.  Overall I'm pretty happy with it.  However, I wish I could have reproduced the randomness of the stained border in the true old photo, rather than just using a radial gradient.

BEFORE:
AFTER:

Wednesday, January 11, 2012

PayPal Website Payments Standard vs PayPal Express Checkout

Just a quick explanation of the difference between the PayPal services Website Payments Standard and PayPal Express Checkout and why you would choose one versus the other. I've found myself asking this question more than once now, so next time I can just recall what I wrote here.

Website Payments Standard is a completely FREE* PayPal service that can process credit cards without requiring a PayPal user account. The disadvantage is that all processing takes place off-site. That is, the integration with the retail site is limited to just re-directing the user to PayPal for checkout. After this happens, there's no guarantee the user will ever return to your site which makes having a consistent confirmation page impossible. But beggars can't be choosers and this service is, after all, free.

Express Checkout is also FREE* and offers better integration with your site. It works by directing users to the PayPal site just to enter payment info, and then returning to the retail site to complete the order. All in all this seems like a better solution, allowing complete control over the final stages of checkout, including payment processing and confirmation. Additionally, recurring payments (a.k.a. billing agreements) can also be setup and even combined with regular one-time purchases. The down side is that the API programming is more complex and the amount of user interaction required to complete an order can increase (a possible negative impact on conversion rates). But if you're comfortable with the free API (PayPal NVP) then I'd say the benefits far outweigh the disadvantages. Note that PayPal also offers a SOAP interface, but I believe use of this requires a paid account.

Either way, if you choose to integrate a FREE* PayPal service expect many headaches on the way. My experience with PayPal places it as #1 in the Worst Software Integration Experiences. Their developer/sandbox tools are more flare than function, their documentation is selective or just out-of-date (not sure which, but probably both), and their technical support is utterly useless. But what alternative do we have? For smaller volumes of sales, it's still (by-far) the cheapest credit card processing service on the planet. Have fun!

*NOTE: The word FREE here refers to no monthly service charges. All merchant gateways charge transaction fees with PayPal on the high-end.

Thursday, October 20, 2011

Customize Terminal for Mac OS X Snow Leopard

Wanted to permanently change the default prompt used in the Mac Terminal as well as add other customizations to Terminal behaviour. Found mixed recommendations on the web for how to do this, but none of which worked for me on a MBP with OS X 10.6. In the end I just guessed at a few things at eventually did the following:

- Edit the file /etc/bashrc (that's right, not '.bashrc' but simply 'bashrc').
- Append the desired value for $PS1, which overrides the definition already present in the file.

For example, to customize my prompt and have all 'ls' commands become 'ls -al' I appended the following:

PS1='\u: \w\$ '
alias "ls"="ls -al"

Thursday, October 13, 2011

Notes on Installing Lighty (lightTPD) + PHP on Mac OS X

Although, in general, a relatively easy process when done as described here, it still wasn't w/o issues for me. The two main articles I based the install off of are as follows:

1. Install PHP5, lighttpd and Imagick on Mac OS X Leopard
2. Symfony flying with Lighttpd on Mac OS X 10.6

In my case I was using Snow Leopard (10.6) and didn't care about Imagick or Symfony so simply ignored those parts. My system is also already a running MAMP (Mac+Apache+Mysql+Php) so in the end I configure Lighty to run on port 81 and, for the sake of this blog, I'm not bothered with installing MySQL because I already have it. If you need to install MySQL, however, there's now a self-installing package for Mac OS X so it should be a breeze.

I found the following useful for if things go wrong:

- Check if lighttpd was loaded AND enabled using the terminal command "sudo launchctl list".
- Open up the ever-handy Console utility (Applications>Utilities>Console) and view the Console Message or system.log. If Lighty is trying to start but failing it should show a message about every 10 seconds explaining why it failed.

INSTALLING LIGHTY

In my case, the main reason the default installation didn't work is because of the following default Lighty configuration:

server.network-backend = "linux-sendfile"

Which results in the following error: "server.network-backend has a unknown value: linux-sendfile"

Not sure what the 'best' value should be on a Mac, but simply changing this to:

server.network-backend = "writev"

worked for me.

I also tripped on the following, so watch out! The modules.conf file says "at least mod_access and mod_accesslog should be loaded" and then the server.modules variable shows only "mod_access" by default. So I added "mod_accesslog" but this only stopped Lighty from loading. So don't do this! Later realized that the accesslog module is already included in the master lighttpd.conf file.

Also, you do NOT need to add modules to the server.modules variable if there's already a predefined .conf file in the conf.d directory. Simply un-comment the line in modules.conf that includes the appropriate file. This is because the include file does this for you.

INSTALLING PHP

Again, mostly just followed the instructions. Below are things that varied for my install or selections I made when instructions differed.

1. The install command in the Imagick instructions is out-dated and will not install MySQL. The command in the 'Symfony' instructions look more up-to-date but still didn't work for me. I had to instal several extensions separately. The commands I used were

"sudo port install php5 +fastcgi +pear"
"sudo port install php5-mysql"
"sudo port install php5-xsl"
"sudo port install php5-gd"
"sudo port install php5-mbstring"
"sudo port install php5-iconv"
"sudo port install php5-curl"
"sudo port install php5-openssl"
"sudo port install php5-soap"

Installation of php5-mysql output the message "To use mysqlnd with a local MySQL server, edit /opt/local/etc/php5/php.ini and set mysql.default_socket, mysqli.default_socket and pdo_mysql.default_socket to /opt/local/var/run/mysql5/mysqld.sock" but I just ignored this (tried doing it, as well as making the appropriate directory with group permission for mysql user, but then Lighty connections to MySQL started failing).

2. Config files were located at /opt/local/etc/php5 and I copied from the dev default file since that's what I'll be using Lighty for.

3. Didn't bother with changing the extension_dir variable.

4. My install came with a hierarchical .conf file structure so enabling PHP involved multiple .conf files as opposed to a single lighttpd.conf file. This involved...
- un-comment the line "include "conf.d/fastcgi.conf" in modules.conf
- adding the following to the end of the fastcgi.conf file:

fastcgi.server = ( ".php" =>
( "localhost" =>
(
"socket" => socket_dir + "/php-fastcgi.socket",
"bin-path" => "/opt/local/bin/php-cgi"
)
)
)

- Note that the socket directory uses a pre-defined variable, unlike the fixed
paths given in the referenced instructions.

5. Setup ownerships and permission mostly according to the 'Symfony' instructions, but my paths were based on variables defined in lighttpd.conf. For example, the pid file path was
server.pid-file = state_dir + "/lighttpd.pid",
which was equivalent to
"/opt/local/var/run/lighttpd/lighttpd.pid".
As a result, the folders and location of files I needed to give www ownership to varied from those in the 'Symfony' instructions.

6. Note that my install had no lighttpd.wrapper file, so they start/restart command were not applicable. I had to start/restart using load/unload with the launchctl command. For example:
"sudo launchctl load /opt/local/etc/LaunchDaemons/org.macports.lighttpd/org.macports.lighttpd.plist"

ADDING VHOSTS
For this I used the simple_vhost module.

1. Un-comment the following line in modules.conf

include "conf.d/simple_vhost.conf"

2. Edit simple_vhosts.conf accordingly. For example,

simple-vhost.server-root = vhosts_dir + "/"
simple-vhost.default-host = "lighty.anotherlocalhost"
simple-vhost.document-root = "/anotherlocalhost/"

In this example above, the path

vhosts_dir + "/lighty.anotherlocalhost/anotherlocalhost/"

MUST exist. That is, the path to the doc-root includes a directory named after the default-host variable.

3. Add an entry for lighty.anotherlocalhost into you hosts file (/etc/hosts) and clear the cache for this (terminal command: "dscacheutil -flushcache").