“Virgin Media will become the exclusive distributor of TiVo services and technology in the United Kingdom. “
The full announcement is here
Virgin Media Selects TiVo For Next Generation TV Platform
PRNewswire
ALVISO, Calif., and LONDON
(NASDAQ-NMS:TIVO)
ALVISO, Calif., and LONDON, Nov. 24 /PRNewswire-FirstCall/ -- TiVo Inc. (NASDAQ: TIVO), a leader in the creation of television services and advertising solutions for digital video recorders (DVRs), and Virgin Media Inc. (NASDAQ: VMED) (LSE: VMED), the UK's leading entertainment and communications company, today announced they have entered into a strategic partnership under which TiVo will develop Virgin Media's next generation TV platform. Under the mutually exclusive agreement, TiVo will develop a converged television and broadband interactive interface to power Virgin Media's next generation, high definition set top boxes. The terms of the deal are not disclosed.
TiVo will become the exclusive provider of middleware and user interface software for Virgin Media's next generation set top boxes. Virgin Media will become the exclusive distributor of TiVo services and technology in the United Kingdom.
Neil Berkett, CEO of Virgin Media said, "TiVo's proven track record of innovation, strength of its patented technology and experience in developing best in class user environments, make it an ideal strategic partner for Virgin Media as we move aggressively to bring our next generation TV service to market. The superiority of our fibre optic network combined with TiVo's capabilities, will allow us to offer consumers the most significantly advanced and compelling TV service available in the UK, and we believe will do to the TV market what Virgin Media has done to the high speed broadband market."
The next generation platform will offer a superior television viewing experience which will allow Virgin Media customers to search and discover content through major advances in video-on-demand integration and broadband video delivery creating the ultimate one-stop-shop for in-home entertainment.
"This deal underscores TiVo's commitment to expanding its global footprint through strategic alliances with leading international media companies to help them deliver the best in-home entertainment experience for consumers," said Tom Rogers, president and CEO of TiVo Inc. "We are very excited about this new distribution relationship with the UK's most advanced pay television provider and are particularly proud to have been selected as Virgin Media's core software partner for its next generation DVR-enabled set top boxes and its next generation non-DVR set top boxes. Virgin Media is a true leader in the world of entertainment and their enthusiasm for building the next generation of pay television is an excellent opportunity to put all of TiVo's innovation to work in a product distributed by a world class partner. We believe this international deal affords us a significant subscriber growth opportunity."
Virgin Media currently anticipates its first TiVo co-branded product in 2010.
About TiVo Inc.
Founded in 1997, TiVo Inc. (NASDAQ: TIVO) developed the first commercially available digital video recorder (DVR). TiVo offers the TiVo service and TiVo DVRs directly to consumers online at www.tivo.com and through third-party retailers. TiVo also distributes its technology and services through solutions tailored for cable, satellite, and broadcasting companies. Since its founding, TiVo has evolved into the ultimate single solution media center by combining its patented DVR technologies and universal cable box capabilities with the ability to aggregate, search, and deliver millions of pieces of broadband, cable, and broadcast content directly to the television. An economical, one-stop-shop for in-home entertainment, TiVo's intuitive functionality and ease of use puts viewers in control by enabling them to effortlessly navigate the best digital entertainment content available through one box, with one remote, and one user interface, delivering the most dynamic user experience on the market today. TiVo also continues to weave itself into the fabric of the media industry by providing interactive advertising solutions and audience research and measurement ratings services to the television industry. www.tivo.com
TiVo, 'TiVo, TV your way.', Season Pass, WishList, TiVoToGo, Stop||Watch, Power||Watch, and the TiVo Logo are trademarks or registered trademarks of TiVo Inc. or its subsidiaries worldwide. © 2009 TiVo Inc. All rights reserved. All other trademarks are the property of their respective owners.
About Virgin Media
With almost 10 million customers, Virgin Media is the UK's first quad-play provider of broadband, TV, phone and mobile.
The company is one of the largest residential broadband providers in the UK, using a unique fibre optic cable network to deliver next generation ultrafast internet access of up to 50Mb to just over half of all homes. Combined with a high speed ADSL service and mobile broadband products, Virgin Media is able to offer broadband internet access to virtually the entire country.
Virgin Media has the UK's most advanced TV on demand service and is the only TV platform to carry BBC iPlayer. It is the second largest provider of pay TV, was the first to launch a high definition TV service and offers a high-specification, HD-ready V+ personal video recorder.
The company operates the most popular virtual mobile network in the UK which, when launched, was the world's first such mobile phone service. It is also one of the largest fixed-line home phone providers in the country.
Virgin Media also owns Virgin Media Television (VMtv) which runs seven entertainment channels, including Virgin1, LIVING, Bravo and Challenge. VMtv is a 50 per cent joint partner with BBC Worldwide in UKTV, which consists of ten channels including Dave, G.O.L.D., Watch and Alibi.
With operations based entirely in the UK, Virgin Media Inc. is listed on the NASDAQ Stock Market (VMED) and the London Stock Exchange (VMED).
For more information, go to www.virginmedia.com
Forward-Looking Statements
This release contains forward-looking statements within the meaning of the Private Securities Litigation Reform Act of 1995. These statements relate to, among other things, the future availability and timing and the expected features and functionality of the TiVo software, technology, and service to be deployed by Virgin Media to its customers and expected future TiVo subscriber growth from Virgin Media. Forward-looking statements generally can be identified by the use of forward- looking terminology such as, "believe," "expect," "may," "will," "intend," "estimate," "continue," or similar expressions or the negative of those terms or expressions. Such statements involve risks and uncertainties, which could cause actual results to vary materially from those expressed in or indicated by the forward-looking statements. Factors that may cause actual results to differ materially include delays in development, competitive service offerings and lack of market acceptance, as well as the other potential factors described under "Risk Factors" in each company's public reports filed with the Securities and Exchange Commission. Each company cautions you not to place undue reliance on forward-looking statements, which reflect an analysis only and speak only as of the date hereof. Each company disclaims any obligation to update these forward-looking statements.
SOURCE: TiVo Inc.
Web site: http://www.tivo.com/

on my T-mobile G1. The update can be downloaded directly from Google’s servers if you don’t yet have it. The build number changes from CRB43 to CRC1. The update itself is only 2mb but there seems to be little information as to what it fixes, however, the largest patch is the recovery image at 1.4mb (line 43). I’ve extracted the update and below is a file listing of the contents for those that are interested. Incidentally my T-mobile G1 is actually running with an O2 SIM and still got the OTA update. The same should be the case if you’re using any other mobile network.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 | drwxr-xr-x 7 andypowell staff 238B 18 Jul 07:56 . drwxr-xr-x+ 128 andypowell staff 4.3K 18 Jul 07:55 .. drwxr-xr-x 6 andypowell staff 204B 18 Jul 07:55 META-INF -rw-r--r-- 1 andypowell staff 206K 1 Jan 2009 applypatch -rw-r--r-- 1 andypowell staff 0B 18 Jul 07:56 flist drwxr-xr-x 6 andypowell staff 204B 18 Jul 07:55 patch drwxr-xr-x 3 andypowell staff 102B 18 Jul 07:55 system ./META-INF: total 56 drwxr-xr-x 6 andypowell staff 204B 18 Jul 07:55 . drwxr-xr-x 7 andypowell staff 238B 18 Jul 07:56 .. -rw-r--r-- 1 andypowell staff 1.7K 20 Aug 2008 CERT.RSA -rw-r--r-- 1 andypowell staff 12K 20 Aug 2008 CERT.SF -rw-r--r-- 1 andypowell staff 12K 20 Aug 2008 MANIFEST.MF drwxr-xr-x 3 andypowell staff 102B 18 Jul 07:55 com ./META-INF/com: total 0 drwxr-xr-x 3 andypowell staff 102B 18 Jul 07:55 . drwxr-xr-x 6 andypowell staff 204B 18 Jul 07:55 .. drwxr-xr-x 3 andypowell staff 102B 18 Jul 07:55 google ./META-INF/com/google: total 0 drwxr-xr-x 3 andypowell staff 102B 18 Jul 07:55 . drwxr-xr-x 3 andypowell staff 102B 18 Jul 07:55 .. drwxr-xr-x 3 andypowell staff 102B 18 Jul 07:55 android ./META-INF/com/google/android: total 96 drwxr-xr-x 3 andypowell staff 102B 18 Jul 07:55 . drwxr-xr-x 3 andypowell staff 102B 18 Jul 07:55 .. -rw-r--r-- 1 andypowell staff 48K 1 Jan 2009 update-script ./patch: total 2832 drwxr-xr-x 6 andypowell staff 204B 18 Jul 07:55 . drwxr-xr-x 7 andypowell staff 238B 18 Jul 07:56 .. -rw-r--r-- 1 andypowell staff 966B 1 Jan 2009 boot.img.p -rw-r--r-- 1 andypowell staff 1.1K 1 Jan 2009 recovery.img.p0 -rw-r--r-- 1 andypowell staff 1.4M 1 Jan 2009 recovery.img.p1 drwxr-xr-x 8 andypowell staff 272B 18 Jul 07:55 system ./patch/system: total 8 drwxr-xr-x 8 andypowell staff 272B 18 Jul 07:55 . drwxr-xr-x 6 andypowell staff 204B 18 Jul 07:55 .. drwxr-xr-x 93 andypowell staff 3.1K 18 Jul 07:55 app drwxr-xr-x 3 andypowell staff 102B 18 Jul 07:55 bin -rw-r--r-- 1 andypowell staff 246B 1 Jan 2009 build.prop.p drwxr-xr-x 3 andypowell staff 102B 18 Jul 07:55 etc drwxr-xr-x 37 andypowell staff 1.2K 18 Jul 07:55 framework drwxr-xr-x 4 andypowell staff 136B 18 Jul 07:55 lib ./patch/system/app: total 976 drwxr-xr-x 93 andypowell staff 3.1K 18 Jul 07:55 . drwxr-xr-x 8 andypowell staff 272B 18 Jul 07:55 .. -rw-r--r-- 1 andypowell staff 3.9K 1 Jan 2009 AlarmClock.apk.p -rw-r--r-- 1 andypowell staff 200B 1 Jan 2009 AlarmClock.odex.p -rw-r--r-- 1 andypowell staff 7.4K 1 Jan 2009 Browser.apk.p -rw-r--r-- 1 andypowell staff 208B 1 Jan 2009 Browser.odex.p -rw-r--r-- 1 andypowell staff 157B 1 Jan 2009 BugReport.apk.p -rw-r--r-- 1 andypowell staff 199B 1 Jan 2009 BugReport.odex.p -rw-r--r-- 1 andypowell staff 2.2K 1 Jan 2009 Calculator.apk.p -rw-r--r-- 1 andypowell staff 202B 1 Jan 2009 Calculator.odex.p -rw-r--r-- 1 andypowell staff 5.7K 1 Jan 2009 Calendar.apk.p -rw-r--r-- 1 andypowell staff 202B 1 Jan 2009 Calendar.odex.p -rw-r--r-- 1 andypowell staff 1.8K 1 Jan 2009 CalendarProvider.apk.p -rw-r--r-- 1 andypowell staff 203B 1 Jan 2009 CalendarProvider.odex.p -rw-r--r-- 1 andypowell staff 11K 1 Jan 2009 Camera.apk.p -rw-r--r-- 1 andypowell staff 204B 1 Jan 2009 Camera.odex.p -rw-r--r-- 1 andypowell staff 10K 1 Jan 2009 Contacts.apk.p -rw-r--r-- 1 andypowell staff 199B 1 Jan 2009 Contacts.odex.p -rw-r--r-- 1 andypowell staff 174B 1 Jan 2009 DownloadProvider.apk.p -rw-r--r-- 1 andypowell staff 199B 1 Jan 2009 DownloadProvider.odex.p -rw-r--r-- 1 andypowell staff 165B 1 Jan 2009 DrmProvider.apk.p -rw-r--r-- 1 andypowell staff 199B 1 Jan 2009 DrmProvider.odex.p -rw-r--r-- 1 andypowell staff 6.8K 1 Jan 2009 Email.apk.p -rw-r--r-- 1 andypowell staff 213B 1 Jan 2009 Email.odex.p -rw-r--r-- 1 andypowell staff 2.8K 1 Jan 2009 FieldTest.apk.p -rw-r--r-- 1 andypowell staff 9.2K 1 Jan 2009 Gmail.apk.p -rw-r--r-- 1 andypowell staff 205B 1 Jan 2009 Gmail.odex.p -rw-r--r-- 1 andypowell staff 1.2K 1 Jan 2009 GmailProvider.apk.p -rw-r--r-- 1 andypowell staff 205B 1 Jan 2009 GmailProvider.odex.p -rw-r--r-- 1 andypowell staff 1.4K 1 Jan 2009 GoogleApps.apk.p -rw-r--r-- 1 andypowell staff 202B 1 Jan 2009 GoogleApps.odex.p -rw-r--r-- 1 andypowell staff 1.2K 1 Jan 2009 GoogleContactsProvider.apk.p -rw-r--r-- 1 andypowell staff 202B 1 Jan 2009 GoogleContactsProvider.odex.p -rw-r--r-- 1 andypowell staff 162B 1 Jan 2009 GooglePartnerSetup.apk.p -rw-r--r-- 1 andypowell staff 199B 1 Jan 2009 GooglePartnerSetup.odex.p -rw-r--r-- 1 andypowell staff 1.3K 1 Jan 2009 GoogleSearch.apk.p -rw-r--r-- 1 andypowell staff 199B 1 Jan 2009 GoogleSearch.odex.p -rw-r--r-- 1 andypowell staff 170B 1 Jan 2009 GoogleSettingsProvider.apk.p -rw-r--r-- 1 andypowell staff 200B 1 Jan 2009 GoogleSettingsProvider.odex.p -rw-r--r-- 1 andypowell staff 2.0K 1 Jan 2009 GoogleSubscribedFeedsProvider.apk.p -rw-r--r-- 1 andypowell staff 200B 1 Jan 2009 GoogleSubscribedFeedsProvider.odex.p -rw-r--r-- 1 andypowell staff 157B 1 Jan 2009 HTMLViewer.apk.p -rw-r--r-- 1 andypowell staff 197B 1 Jan 2009 HTMLViewer.odex.p -rw-r--r-- 1 andypowell staff 2.0K 1 Jan 2009 ImProvider.apk.p -rw-r--r-- 1 andypowell staff 202B 1 Jan 2009 ImProvider.odex.p -rw-r--r-- 1 andypowell staff 5.5K 1 Jan 2009 LatinIME.apk.p -rw-r--r-- 1 andypowell staff 200B 1 Jan 2009 LatinIME.odex.p -rw-r--r-- 1 andypowell staff 8.1K 1 Jan 2009 Launcher.apk.p -rw-r--r-- 1 andypowell staff 203B 1 Jan 2009 Launcher.odex.p -rw-r--r-- 1 andypowell staff 16K 1 Jan 2009 Maps.apk.p -rw-r--r-- 1 andypowell staff 1.4K 1 Jan 2009 MediaProvider.apk.p -rw-r--r-- 1 andypowell staff 200B 1 Jan 2009 MediaProvider.odex.p -rw-r--r-- 1 andypowell staff 2.7K 1 Jan 2009 MediaUploader.apk.p -rw-r--r-- 1 andypowell staff 7.1K 1 Jan 2009 Mms.apk.p -rw-r--r-- 1 andypowell staff 211B 1 Jan 2009 Mms.odex.p -rw-r--r-- 1 andypowell staff 7.3K 1 Jan 2009 Music.apk.p -rw-r--r-- 1 andypowell staff 206B 1 Jan 2009 Music.odex.p -rw-r--r-- 1 andypowell staff 159B 1 Jan 2009 NetworkLocation.apk.p -rw-r--r-- 1 andypowell staff 200B 1 Jan 2009 NetworkLocation.odex.p -rw-r--r-- 1 andypowell staff 1.8K 1 Jan 2009 PackageInstaller.apk.p -rw-r--r-- 1 andypowell staff 201B 1 Jan 2009 PackageInstaller.odex.p -rw-r--r-- 1 andypowell staff 11K 1 Jan 2009 Phone.apk.p -rw-r--r-- 1 andypowell staff 203B 1 Jan 2009 Phone.odex.p -rw-r--r-- 1 andypowell staff 21K 1 Jan 2009 Settings.apk.p -rw-r--r-- 1 andypowell staff 203B 1 Jan 2009 Settings.odex.p -rw-r--r-- 1 andypowell staff 168B 1 Jan 2009 SettingsProvider.apk.p -rw-r--r-- 1 andypowell staff 198B 1 Jan 2009 SettingsProvider.odex.p -rw-r--r-- 1 andypowell staff 17K 1 Jan 2009 SetupWizard.apk.p -rw-r--r-- 1 andypowell staff 199B 1 Jan 2009 SetupWizard.odex.p -rw-r--r-- 1 andypowell staff 1.9K 1 Jan 2009 SoundRecorder.apk.p -rw-r--r-- 1 andypowell staff 197B 1 Jan 2009 SoundRecorder.odex.p -rw-r--r-- 1 andypowell staff 1.9K 1 Jan 2009 Stk.apk.p -rw-r--r-- 1 andypowell staff 200B 1 Jan 2009 Stk.odex.p -rw-r--r-- 1 andypowell staff 2.0K 1 Jan 2009 Street.apk.p -rw-r--r-- 1 andypowell staff 203B 1 Jan 2009 Street.odex.p -rw-r--r-- 1 andypowell staff 1.7K 1 Jan 2009 SystemUpdater.apk.p -rw-r--r-- 1 andypowell staff 200B 1 Jan 2009 SystemUpdater.odex.p -rw-r--r-- 1 andypowell staff 6.8K 1 Jan 2009 Talk.apk.p -rw-r--r-- 1 andypowell staff 208B 1 Jan 2009 Talk.odex.p -rw-r--r-- 1 andypowell staff 1.2K 1 Jan 2009 TelephonyProvider.apk.p -rw-r--r-- 1 andypowell staff 200B 1 Jan 2009 TelephonyProvider.odex.p -rw-r--r-- 1 andypowell staff 159B 1 Jan 2009 UserDictionaryProvider.apk.p -rw-r--r-- 1 andypowell staff 195B 1 Jan 2009 UserDictionaryProvider.odex.p -rw-r--r-- 1 andypowell staff 7.2K 1 Jan 2009 Vending.apk.p -rw-r--r-- 1 andypowell staff 208B 1 Jan 2009 Vending.odex.p -rw-r--r-- 1 andypowell staff 1.3K 1 Jan 2009 Webnwalk.apk.p -rw-r--r-- 1 andypowell staff 196B 1 Jan 2009 Webnwalk.odex.p -rw-r--r-- 1 andypowell staff 4.7K 1 Jan 2009 YouTube.apk.p -rw-r--r-- 1 andypowell staff 208B 1 Jan 2009 YouTube.odex.p -rw-r--r-- 1 andypowell staff 157B 1 Jan 2009 checkin.apk.p -rw-r--r-- 1 andypowell staff 201B 1 Jan 2009 checkin.odex.p -rw-r--r-- 1 andypowell staff 1.7K 1 Jan 2009 gtalkservice.apk.p -rw-r--r-- 1 andypowell staff 208B 1 Jan 2009 gtalkservice.odex.p ./patch/system/bin: total 8 drwxr-xr-x 3 andypowell staff 102B 18 Jul 07:55 . drwxr-xr-x 8 andypowell staff 272B 18 Jul 07:55 .. -rw-r--r-- 1 andypowell staff 165B 1 Jan 2009 debuggerd.p ./patch/system/etc: total 0 drwxr-xr-x 3 andypowell staff 102B 18 Jul 07:55 . drwxr-xr-x 8 andypowell staff 272B 18 Jul 07:55 .. drwxr-xr-x 3 andypowell staff 102B 18 Jul 07:55 security ./patch/system/etc/security: total 8 drwxr-xr-x 3 andypowell staff 102B 18 Jul 07:55 . drwxr-xr-x 3 andypowell staff 102B 18 Jul 07:55 .. -rw-r--r-- 1 andypowell staff 171B 1 Jan 2009 otacerts.zip.p ./patch/system/framework: total 592 drwxr-xr-x 37 andypowell staff 1.2K 18 Jul 07:55 . drwxr-xr-x 8 andypowell staff 272B 18 Jul 07:55 .. -rw-r--r-- 1 andypowell staff 152B 1 Jan 2009 am.jar.p -rw-r--r-- 1 andypowell staff 195B 1 Jan 2009 am.odex.p -rw-r--r-- 1 andypowell staff 176B 1 Jan 2009 android.awt.jar.p -rw-r--r-- 1 andypowell staff 206B 1 Jan 2009 android.awt.odex.p -rw-r--r-- 1 andypowell staff 152B 1 Jan 2009 android.policy.jar.p -rw-r--r-- 1 andypowell staff 203B 1 Jan 2009 android.policy.odex.p -rw-r--r-- 1 andypowell staff 152B 1 Jan 2009 android.test.runner.jar.p -rw-r--r-- 1 andypowell staff 199B 1 Jan 2009 android.test.runner.odex.p -rw-r--r-- 1 andypowell staff 152B 1 Jan 2009 com.android.im.plugin.jar.p -rw-r--r-- 1 andypowell staff 199B 1 Jan 2009 com.android.im.plugin.odex.p -rw-r--r-- 1 andypowell staff 152B 1 Jan 2009 com.google.android.gtalkservice.jar.p -rw-r--r-- 1 andypowell staff 202B 1 Jan 2009 com.google.android.gtalkservice.odex.p -rw-r--r-- 1 andypowell staff 153B 1 Jan 2009 com.google.android.maps.jar.p -rw-r--r-- 1 andypowell staff 205B 1 Jan 2009 com.google.android.maps.odex.p -rw-r--r-- 1 andypowell staff 285B 1 Jan 2009 core.jar.p -rw-r--r-- 1 andypowell staff 165B 1 Jan 2009 core.odex.p -rw-r--r-- 1 andypowell staff 152B 1 Jan 2009 ext.jar.p -rw-r--r-- 1 andypowell staff 166B 1 Jan 2009 ext.odex.p -rw-r--r-- 1 andypowell staff 62K 1 Jan 2009 framework-res.apk.p -rw-r--r-- 1 andypowell staff 152B 1 Jan 2009 framework-tests.jar.p -rw-r--r-- 1 andypowell staff 201B 1 Jan 2009 framework-tests.odex.p -rw-r--r-- 1 andypowell staff 166B 1 Jan 2009 framework.jar.p -rw-r--r-- 1 andypowell staff 97K 1 Jan 2009 framework.odex.p -rw-r--r-- 1 andypowell staff 152B 1 Jan 2009 ime.jar.p -rw-r--r-- 1 andypowell staff 195B 1 Jan 2009 ime.odex.p -rw-r--r-- 1 andypowell staff 152B 1 Jan 2009 input.jar.p -rw-r--r-- 1 andypowell staff 195B 1 Jan 2009 input.odex.p -rw-r--r-- 1 andypowell staff 152B 1 Jan 2009 monkey.jar.p -rw-r--r-- 1 andypowell staff 200B 1 Jan 2009 monkey.odex.p -rw-r--r-- 1 andypowell staff 152B 1 Jan 2009 pm.jar.p -rw-r--r-- 1 andypowell staff 195B 1 Jan 2009 pm.odex.p -rw-r--r-- 1 andypowell staff 154B 1 Jan 2009 services.jar.p -rw-r--r-- 1 andypowell staff 211B 1 Jan 2009 services.odex.p -rw-r--r-- 1 andypowell staff 152B 1 Jan 2009 svc.jar.p -rw-r--r-- 1 andypowell staff 198B 1 Jan 2009 svc.odex.p ./patch/system/lib: total 16 drwxr-xr-x 4 andypowell staff 136B 18 Jul 07:55 . drwxr-xr-x 8 andypowell staff 272B 18 Jul 07:55 .. -rw-r--r-- 1 andypowell staff 3.3K 1 Jan 2009 libcameraservice.so.p -rw-r--r-- 1 andypowell staff 2.7K 1 Jan 2009 libmediaplayerservice.so.p ./system: total 0 drwxr-xr-x 3 andypowell staff 102B 18 Jul 07:55 . drwxr-xr-x 7 andypowell staff 238B 18 Jul 07:56 .. drwxr-xr-x 3 andypowell staff 102B 18 Jul 07:55 etc ./system/etc: total 104 drwxr-xr-x 3 andypowell staff 102B 18 Jul 07:55 . drwxr-xr-x 3 andypowell staff 102B 18 Jul 07:55 .. -rw-r--r-- 1 andypowell staff 49K 1 Jan 2009 NOTICE.html.gz |

As ever Nick is uploading pictures to Picasa so you can get some idea of what’s about. As the days progress Nick will update the images, but it is a slow, slow process. Keep your eyes peeled for the rest of the week – and make sure you’re not looking at last years’ pictures by mistake Update 1: More pictures are available.
Update 2: Pictures from day 3 are available now.
Update 3: Pictures from day 4 are available now. There are also some shots of Taipei


I have been unable to find anything that mentions what the fix was for, I guess it’s a little early for that information to be floating around. I’ve got my log from the G1 and will be taking a look to see if there’s anything interesting there.
Shame that this fix didn’t include making Latitude available for UK users – Google seems to be coming up with excuses that don’t really wash for that. Considering Latitude is available to pretty much every other smart phone out there and that it’s even on the G2.
If you want to get a copy of the update, you can download it direct from Google’s servers
Update:
I’ve extracted the update and here’s a list of the contents, the largest patch is in Maps (at 291KB) and the second largest is in framework.odex (at 271KB), then “MediaUploader” which is likely to be the YouTube and Picasa uploading service (at 166KB).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 | total 3496 drwxr-xr-x 6 andypowell staff 204B 23 May 11:24 META-INF -rwxr-xr-x 1 andypowell staff 141K 20 May 10:03 applypatch -rwxr-xr-x 1 andypowell staff 1.6M 20 May 10:03 boot.img drwxr-xr-x 4 andypowell staff 136B 23 May 11:25 patch drwxr-xr-x 3 andypowell staff 102B 23 May 11:24 system ./META-INF: total 56 -rwxr-xr-x 1 andypowell staff 1.7K 20 Aug 2008 CERT.RSA -rwxr-xr-x 1 andypowell staff 12K 20 Aug 2008 CERT.SF -rwxr-xr-x 1 andypowell staff 12K 20 Aug 2008 MANIFEST.MF drwxr-xr-x 3 andypowell staff 102B 23 May 11:24 com ./META-INF/com: total 0 drwxr-xr-x 3 andypowell staff 102B 23 May 11:24 google ./META-INF/com/google: total 0 drwxr-xr-x 3 andypowell staff 102B 23 May 11:24 android ./META-INF/com/google/android: total 96 -rwxr-xr-x 1 andypowell staff 47K 20 May 10:03 update-script ./patch: total 0 drwxr-xr-x 9 andypowell staff 306B 23 May 11:25 system ./patch/system: total 8 drwxr-xr-x 93 andypowell staff 3.1K 23 May 11:24 app drwxr-xr-x 3 andypowell staff 102B 23 May 11:24 bin -rwxr-xr-x 1 andypowell staff 236B 20 May 10:03 build.prop.p drwxr-xr-x 6 andypowell staff 204B 23 May 11:26 etc drwxr-xr-x 37 andypowell staff 1.2K 23 May 11:24 framework drwxr-xr-x 5 andypowell staff 170B 23 May 11:25 lib ./patch/system/app: total 1896 -rwxr-xr-x 1 andypowell staff 324B 20 May 10:02 AlarmClock.apk.p -rwxr-xr-x 1 andypowell staff 262B 20 May 10:02 AlarmClock.odex.p -rwxr-xr-x 1 andypowell staff 582B 20 May 10:02 Browser.apk.p -rwxr-xr-x 1 andypowell staff 312B 20 May 10:02 Browser.odex.p -rwxr-xr-x 1 andypowell staff 156B 20 May 10:02 BugReport.apk.p -rwxr-xr-x 1 andypowell staff 266B 20 May 10:02 BugReport.odex.p -rwxr-xr-x 1 andypowell staff 223B 20 May 10:02 Calculator.apk.p -rwxr-xr-x 1 andypowell staff 266B 20 May 10:02 Calculator.odex.p -rwxr-xr-x 1 andypowell staff 402B 20 May 10:02 Calendar.apk.p -rwxr-xr-x 1 andypowell staff 262B 20 May 10:03 Calendar.odex.p -rwxr-xr-x 1 andypowell staff 205B 20 May 10:03 CalendarProvider.apk.p -rwxr-xr-x 1 andypowell staff 263B 20 May 10:03 CalendarProvider.odex.p -rwxr-xr-x 1 andypowell staff 566B 20 May 10:03 Camera.apk.p -rwxr-xr-x 1 andypowell staff 268B 20 May 10:03 Camera.odex.p -rwxr-xr-x 1 andypowell staff 11K 20 May 10:03 Contacts.apk.p -rwxr-xr-x 1 andypowell staff 260B 20 May 10:03 Contacts.odex.p -rwxr-xr-x 1 andypowell staff 174B 20 May 10:03 DownloadProvider.apk.p -rwxr-xr-x 1 andypowell staff 263B 20 May 10:03 DownloadProvider.odex.p -rwxr-xr-x 1 andypowell staff 165B 20 May 10:03 DrmProvider.apk.p -rwxr-xr-x 1 andypowell staff 257B 20 May 10:03 DrmProvider.odex.p -rwxr-xr-x 1 andypowell staff 455B 20 May 10:03 Email.apk.p -rwxr-xr-x 1 andypowell staff 270B 20 May 10:03 Email.odex.p -rwxr-xr-x 1 andypowell staff 1.6K 20 May 10:03 FieldTest.apk.p -rwxr-xr-x 1 andypowell staff 631B 20 May 10:03 Gmail.apk.p -rwxr-xr-x 1 andypowell staff 267B 20 May 10:03 Gmail.odex.p -rwxr-xr-x 1 andypowell staff 176B 20 May 10:03 GmailProvider.apk.p -rwxr-xr-x 1 andypowell staff 263B 20 May 10:03 GmailProvider.odex.p -rwxr-xr-x 1 andypowell staff 191B 20 May 10:03 GoogleApps.apk.p -rwxr-xr-x 1 andypowell staff 264B 20 May 10:03 GoogleApps.odex.p -rwxr-xr-x 1 andypowell staff 170B 20 May 10:03 GoogleContactsProvider.apk.p -rwxr-xr-x 1 andypowell staff 264B 20 May 10:03 GoogleContactsProvider.odex.p -rwxr-xr-x 1 andypowell staff 162B 20 May 10:03 GooglePartnerSetup.apk.p -rwxr-xr-x 1 andypowell staff 261B 20 May 10:03 GooglePartnerSetup.odex.p -rwxr-xr-x 1 andypowell staff 174B 20 May 10:03 GoogleSearch.apk.p -rwxr-xr-x 1 andypowell staff 258B 20 May 10:03 GoogleSearch.odex.p -rwxr-xr-x 1 andypowell staff 172B 20 May 10:03 GoogleSettingsProvider.apk.p -rwxr-xr-x 1 andypowell staff 266B 20 May 10:03 GoogleSettingsProvider.odex.p -rwxr-xr-x 1 andypowell staff 206B 20 May 10:03 GoogleSubscribedFeedsProvider.apk.p -rwxr-xr-x 1 andypowell staff 265B 20 May 10:03 GoogleSubscribedFeedsProvider.odex.p -rwxr-xr-x 1 andypowell staff 154B 20 May 10:03 HTMLViewer.apk.p -rwxr-xr-x 1 andypowell staff 258B 20 May 10:03 HTMLViewer.odex.p -rwxr-xr-x 1 andypowell staff 208B 20 May 10:03 ImProvider.apk.p -rwxr-xr-x 1 andypowell staff 263B 20 May 10:03 ImProvider.odex.p -rwxr-xr-x 1 andypowell staff 443B 20 May 10:03 LatinIME.apk.p -rwxr-xr-x 1 andypowell staff 264B 20 May 10:03 LatinIME.odex.p -rwxr-xr-x 1 andypowell staff 37K 20 May 10:03 Launcher.apk.p -rwxr-xr-x 1 andypowell staff 3.3K 20 May 10:03 Launcher.odex.p -rwxr-xr-x 1 andypowell staff 290K 20 May 10:03 Maps.apk.p -rwxr-xr-x 1 andypowell staff 180B 20 May 10:03 MediaProvider.apk.p -rwxr-xr-x 1 andypowell staff 264B 20 May 10:03 MediaProvider.odex.p -rwxr-xr-x 1 andypowell staff 165K 20 May 10:03 MediaUploader.apk.p -rwxr-xr-x 1 andypowell staff 459B 20 May 10:03 Mms.apk.p -rwxr-xr-x 1 andypowell staff 263B 20 May 10:03 Mms.odex.p -rwxr-xr-x 1 andypowell staff 7.6K 20 May 10:03 Music.apk.p -rwxr-xr-x 1 andypowell staff 265B 20 May 10:03 Music.odex.p -rwxr-xr-x 1 andypowell staff 155B 20 May 10:03 NetworkLocation.apk.p -rwxr-xr-x 1 andypowell staff 1.9K 20 May 10:03 NetworkLocation.odex.p -rwxr-xr-x 1 andypowell staff 198B 20 May 10:03 PackageInstaller.apk.p -rwxr-xr-x 1 andypowell staff 264B 20 May 10:03 PackageInstaller.odex.p -rwxr-xr-x 1 andypowell staff 29K 20 May 10:03 Phone.apk.p -rwxr-xr-x 1 andypowell staff 23K 20 May 10:03 Phone.odex.p -rwxr-xr-x 1 andypowell staff 23K 20 May 10:03 Settings.apk.p -rwxr-xr-x 1 andypowell staff 266B 20 May 10:03 Settings.odex.p -rwxr-xr-x 1 andypowell staff 168B 20 May 10:03 SettingsProvider.apk.p -rwxr-xr-x 1 andypowell staff 262B 20 May 10:03 SettingsProvider.odex.p -rwxr-xr-x 1 andypowell staff 18K 20 May 10:03 SetupWizard.apk.p -rwxr-xr-x 1 andypowell staff 264B 20 May 10:03 SetupWizard.odex.p -rwxr-xr-x 1 andypowell staff 215B 20 May 10:03 SoundRecorder.apk.p -rwxr-xr-x 1 andypowell staff 261B 20 May 10:03 SoundRecorder.odex.p -rwxr-xr-x 1 andypowell staff 206B 20 May 10:03 Stk.apk.p -rwxr-xr-x 1 andypowell staff 262B 20 May 10:03 Stk.odex.p -rwxr-xr-x 1 andypowell staff 212B 20 May 10:03 Street.apk.p -rwxr-xr-x 1 andypowell staff 265B 20 May 10:03 Street.odex.p -rwxr-xr-x 1 andypowell staff 195B 20 May 10:03 SystemUpdater.apk.p -rwxr-xr-x 1 andypowell staff 263B 20 May 10:03 SystemUpdater.odex.p -rwxr-xr-x 1 andypowell staff 450B 20 May 10:03 Talk.apk.p -rwxr-xr-x 1 andypowell staff 265B 20 May 10:03 Talk.odex.p -rwxr-xr-x 1 andypowell staff 170B 20 May 10:03 TelephonyProvider.apk.p -rwxr-xr-x 1 andypowell staff 263B 20 May 10:03 TelephonyProvider.odex.p -rwxr-xr-x 1 andypowell staff 155B 20 May 10:03 UserDictionaryProvider.apk.p -rwxr-xr-x 1 andypowell staff 252B 20 May 10:03 UserDictionaryProvider.odex.p -rwxr-xr-x 1 andypowell staff 421B 20 May 10:03 Vending.apk.p -rwxr-xr-x 1 andypowell staff 269B 20 May 10:03 Vending.odex.p -rwxr-xr-x 1 andypowell staff 174B 20 May 10:03 Webnwalk.apk.p -rwxr-xr-x 1 andypowell staff 255B 20 May 10:03 Webnwalk.odex.p -rwxr-xr-x 1 andypowell staff 359B 20 May 10:03 YouTube.apk.p -rwxr-xr-x 1 andypowell staff 264B 20 May 10:03 YouTube.odex.p -rwxr-xr-x 1 andypowell staff 155B 20 May 10:03 checkin.apk.p -rwxr-xr-x 1 andypowell staff 264B 20 May 10:03 checkin.odex.p -rwxr-xr-x 1 andypowell staff 196B 20 May 10:03 gtalkservice.apk.p -rwxr-xr-x 1 andypowell staff 261B 20 May 10:03 gtalkservice.odex.p ./patch/system/bin: total 8 -rwxr-xr-x 1 andypowell staff 160B 20 May 10:03 debuggerd.p ./patch/system/etc: total 96 -rwxr-xr-x 1 andypowell staff 42K 20 May 10:03 NOTICE.html.gz.p -rwxr-xr-x 1 andypowell staff 153B 20 May 10:03 contributors.html.p drwxr-xr-x 3 andypowell staff 102B 23 May 11:24 security ./patch/system/etc/security: total 8 -rwxr-xr-x@ 1 andypowell staff 175B 20 May 10:03 otacerts.zip.p ./patch/system/framework: total 1040 -rwxr-xr-x 1 andypowell staff 155B 20 May 10:03 am.jar.p -rwxr-xr-x 1 andypowell staff 257B 20 May 10:03 am.odex.p -rwxr-xr-x 1 andypowell staff 176B 20 May 10:03 android.awt.jar.p -rwxr-xr-x 1 andypowell staff 270B 20 May 10:03 android.awt.odex.p -rwxr-xr-x 1 andypowell staff 153B 20 May 10:03 android.policy.jar.p -rwxr-xr-x 1 andypowell staff 234B 20 May 10:03 android.policy.odex.p -rwxr-xr-x 1 andypowell staff 155B 20 May 10:03 android.test.runner.jar.p -rwxr-xr-x 1 andypowell staff 6.9K 20 May 10:03 android.test.runner.odex.p -rwxr-xr-x 1 andypowell staff 153B 20 May 10:03 com.android.im.plugin.jar.p -rwxr-xr-x 1 andypowell staff 264B 20 May 10:03 com.android.im.plugin.odex.p -rwxr-xr-x 1 andypowell staff 152B 20 May 10:03 com.google.android.gtalkservice.jar.p -rwxr-xr-x 1 andypowell staff 266B 20 May 10:03 com.google.android.gtalkservice.odex.p -rwxr-xr-x 1 andypowell staff 155B 20 May 10:03 com.google.android.maps.jar.p -rwxr-xr-x 1 andypowell staff 263B 20 May 10:03 com.google.android.maps.odex.p -rwxr-xr-x 1 andypowell staff 285B 20 May 10:03 core.jar.p -rwxr-xr-x 1 andypowell staff 46K 20 May 10:03 core.odex.p -rwxr-xr-x 1 andypowell staff 155B 20 May 10:03 ext.jar.p -rwxr-xr-x 1 andypowell staff 211B 20 May 10:03 ext.odex.p -rwxr-xr-x 1 andypowell staff 63K 20 May 10:03 framework-res.apk.p -rwxr-xr-x 1 andypowell staff 153B 20 May 10:03 framework-tests.jar.p -rwxr-xr-x 1 andypowell staff 262B 20 May 10:03 framework-tests.odex.p -rwxr-xr-x 1 andypowell staff 168B 20 May 10:03 framework.jar.p -rwxr-xr-x 1 andypowell staff 270K 20 May 10:03 framework.odex.p -rwxr-xr-x 1 andypowell staff 153B 20 May 10:03 ime.jar.p -rwxr-xr-x 1 andypowell staff 252B 20 May 10:03 ime.odex.p -rwxr-xr-x 1 andypowell staff 153B 20 May 10:03 input.jar.p -rwxr-xr-x 1 andypowell staff 249B 20 May 10:03 input.odex.p -rwxr-xr-x 1 andypowell staff 153B 20 May 10:03 monkey.jar.p -rwxr-xr-x 1 andypowell staff 267B 20 May 10:03 monkey.odex.p -rwxr-xr-x 1 andypowell staff 153B 20 May 10:03 pm.jar.p -rwxr-xr-x 1 andypowell staff 263B 20 May 10:03 pm.odex.p -rwxr-xr-x 1 andypowell staff 153B 20 May 10:03 services.jar.p -rwxr-xr-x 1 andypowell staff 4.6K 20 May 10:03 services.odex.p -rwxr-xr-x 1 andypowell staff 153B 20 May 10:03 svc.jar.p -rwxr-xr-x 1 andypowell staff 255B 20 May 10:03 svc.odex.p ./patch/system/lib: total 16 -rwxr-xr-x 1 andypowell staff 4.7K 20 May 10:03 libicudata.so.p drwxr-xr-x 3 andypowell staff 102B 23 May 11:24 modules ./patch/system/lib/modules: total 8 -rwxr-xr-x 1 andypowell staff 618B 20 May 10:03 wlan.ko.p ./system: total 3672 -rwxr-xr-x 1 andypowell staff 1.8M 20 May 10:03 recovery.img |

everything you need to know when unlocking, particularly useful is the info on setting up a new APN which you’ll need to do if you aren’t using T-Mobile as your carrier. My O2 PAYG SIM from my iPhone worked fine and soon the G1 was syncing happily with gmail. One of the things that struck me about the G1 was all the negative comment on it’s size and feel that I’d read in various blogs and reviews. Personally I couldn’t see and issue with either the thickness of the device or the the look and feel of it and I wasn’t alone in that. I really don’t see what all the ‘complaints’ were about.
One of the things I had heard though, that I can confirm, is the poor battery life. Without installing any extra software the only real control over the G1′s power management seems limited to turning off the GPS or WiFi. However, there is a ray of light. After installing Power Manager things improved immensely but it still wasn’t enough. The solution I settled on was to buy an extended, 2400mAh, battery which came with a replacement back. The battery is physically 2 or 3 times the thickness of the original, which is why you get a replacement and the end result is a device that’s about as thick as a NOKIA N95.
So why didn’t I wait for a G2? Simple really. The G1 has a wonderful physical keyboard. I really can’t stand on screen keyboards, perhaps I’m a minority.
Of course the other reason that I wont be getting a G2 is that Vodafone are capping both daily and monthly usage when you sign up – 15mb / day and 500mb a month. Perhaps everyone at Vodafone still uses a 6310? Maybe they just don’t like the G2 or Android. Who knows?
Update (Sunday 10th May) : G1 Running cupcake has been running for 3 days with the extended battery and no charging!

Having the weather on your lock screen is nothing particularly new, there are enough Winterboard themes that allow you to do this. However, this is slightly different. I’ve never really understood why you’d only ever want to know what the weather was like in your home town. What does it matter? That is of course unless you never actually go anywhere. Why not have the weather for where you are? Yes I know you could just look out of the window or actually go outside but that’s beside the point. What I wanted was to have the weather for where I actually am right now. So, as part of my iPhone tracking system I added the ability for the weather to follow me too. The implementation is rather simple.
Since I’m already sending my location and retrieving the wallpaper image I’m also getting an override (overRide.js) for my weather configureMe.js. The overRide.js contains a single line, the location – as per the configureMe.js format:
var locale="Lelystad,NL"
So each time the wallpaper is updated, so is this file. One of the key things you need to do to accomplish this for yourself is what is called reverse geocoding. That is, getting the name of your location from your GPS coordinates.
Now, the best way I’ve found of doing this so far is by using geonames this is a fantastic site that allows you to do the reverse geocoding without even blinking. For example, calling geonames using the url
http://ws.geonames.org/findNearbyPlaceName?lat=50.455&lng=-3
would result in the following xml being returned
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <geonames> <geoname> <name>Seaton</name> <lat>50.7049382166946</lat> <lng>-3.06999206542969</lng> <geonameId>2638278</geonameId> <countryCode>GB</countryCode> <countryName>United Kingdom</countryName> <fcl>P</fcl> <fcode>PPL</fcode> <distance>28.2265</distance> </geoname> </geonames> </xml>
This gives you pretty much everything you could possibly want and for free too. Note the inclusion of your distance between your coordinates and the the coordinates returned (nearest named location).
Now I know what you’re thinking. Why would I retrieve a file with the data in it from my server, why not parse the xml in the javascript on the lock screen. You’re right, I could and you, possibly, should. I don’t because I keep all my GPS data in a database on that server so I update the database with the actual locations too. I don’t parse the xml on the iPhone because I don’t need to.
Of course I haven’t yet tested being in some obscure location that the weather provider doesn’t know about. Incidentally, geonames is so freaking good that, if you want to, you can download a daily dump of the database.

Update Added the ability to de-wiggle the value needle, and then fixed a bug in the wiggle.

ASP but you’ll need to do that yourself. For this example I’m also using a Pachube account to grab the data. My feed, the one for my gauge on the top right, is 1498 but you will want to create your own account and start updating your own data. Using the gauge is as simple as a simple thing.
There are a number of things we need to get this simple display working,
We’ll come to that at the very end of the article.
Open your favourite text editor and cut and paste the following into it.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <HTML> <BODY bgcolor="#FFFFFF"> <OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" WIDTH="200" HEIGHT="100" id="gauge"> <PARAM NAME="movie" VALUE="/data/gauge.swf?xml_source=/getdata.php" /> <PARAM NAME="quality" VALUE="high" /> <param name="wmode" value="transparent"> <param name="allowScriptAccess" value="sameDomain" /> <EMBED src="/data/gauge.swf?xml_source=/getdata.php" quality="high" wmode="transparent" WIDTH="200" HEIGHT="100" NAME="gauge" allowScriptAccess="sameDomain" swLiveConnect="true" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"> </EMBED> </OBJECT> </BODY> </HTML> |
Save the file as gauge.html.
Start a new document and cut and paste the following. Before you save the file as getdata.php make sure you change the $myFeedId and $myFeedStream values to match your Pachube feed.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | <? $myFeedId=1498; $myFeedStream=1; $myURLPath='/getdata.php'; $url = "http://www.pachube.com/feeds/$myFeedId/datastreams/$myFeedStream/history.csv"; $now = gmdate('Y-m-d').'T'.gmdate('H:i:s').'Z'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST , false ); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER , false ); curl_setopt($ch, CURLOPT_HEADER, 0); ob_start(); $result = curl_exec($ch); $resultStr = ob_get_contents(); ob_end_clean(); curl_close($ch); if ($result) { $readings = split(",",$resultStr); $last=(($readings[count($readings)-1])/40); $prev=-90+(($readings[count($readings)-2])/40); $mval = (max($readings)/40); $tval=-90; header("Content-Type: text/xml\n\n"); ?> <gauge> <update url='<?=$myURLPath;?>?m=<?=$mval?>' delay='909' delay_type='1' timeout='30' retry='9' /> <? RadialTicks( 100, 75, 60, 15, -90, -45, 12, 3, "33ff33" ); RadialTicks( 100, 75, 60, 15, -45, 0, 12, 3, "efe415" ); RadialTicks( 100, 75, 60, 15, 0, 45, 12, 3, "ef8b15" ); RadialTicks( 100, 75, 60, 15, 45, 94, 12, 3, "ff3333" ); ?> <text x='40' y='50' width='220' align='left' size='10' color='000000' alpha='20'><?=$now;?></text> <text x='150' y='100' width='120' align='center' size='24' color='000000' alpha='100'>Watts (W)</text> <rotate x='100' y='75' start='-90' span='<?=$mval?>' step='3' shake_frequency='0' shake_span='3' shadow_alpha='15'> <polygon fill_color='ff0000' fill_alpha='90' line_alpha='0'> <point x='97' y='5' /> <point x='101' y='5' /> <point x='102' y='63' /> <point x='96' y='63' /> </polygon> <rect x='94' y='87' width='10' height='10' fill_color='ff0000' fill_alpha='90' line_alpha='50' /> </rotate> <rotate x='100' y='75' start='<?=$prev?>' span='<?=$last?>' step='1' shake_frequency='95' shake_span='3' shadow_alpha='15'> <polygon fill_color='000000' fill_alpha='90' line_alpha='0'> <point x='100' y='10' /> <point x='101' y='10' /> <point x='101' y='63' /> <point x='96' y='63' /> </polygon> <rect x='94' y='87' width='10' height='20' fill_color='000000' fill_alpha='90' line_alpha='50' /> </rotate> <circle x='100' y='75' radius='14' fill_color='000000' fill_alpha='50' line_alpha='0' /> </gauge><? } function RadialTicks ( $x_center, $y_center, $radius, $length, $start_angle, $end_angle, $ticks_count, $thickness, $color ) { for ( $i = $start_angle; $i <= $end_angle; $i += ($end_angle-$start_angle)/($ticks_count-1) ) { echo " <line x1='".($x_center+sin(deg2rad($i))*$radius). "' y1='".($y_center-cos(deg2rad($i))*$radius)."' x2='" .($x_center+sin(deg2rad($i))*($radius+$length))."' y2='" .($y_center-cos(deg2rad($i))*($radius+$length)) ."' thickness='".$thickness."' color='".$color."' />\n"; } } ?> |
Copy the .swf file that you downloaded from the XML/SWF Gauge site and put it on your web server along with your gauge.html and getdata.php files. Point your browser at your website and the gauge.html page and bask in your glorious meter display.
I should point out that this is using the historic feed data from pachube which has a 15 minute lag. The reason for this is simply because it does not require authentication with the pachube servers. If you want to use your live feed you will need to change the url used and the management of the data returned as well as adding
1 | curl_setopt($curl, CURLOPT_USERPWD, "username:password"); |
just before the ob_start(); on line 16. Replace username:password with your actual username and password, don’t forget the colon in between. When changing the url you might want to use the secure https rather than just http.


Continuing with my sudden graphing fetish, as well as using a Current Cost unit I have dotted a number of little devices I’ve built with Xbee and Arduinos to measure temperatures (and other things) around the house. More information on those will come out later, but it’s an interesting project too.
Since I have the data for those it’d be rude not to graph them too, there’s a sample in the thumbnails below.
Not content with graphing them locally I picked up a Pachube invite and started graphing data there too. The process is simple really and as you can see on the right hand side of this page under ‘Graphy Stuff’, graph images can be embedded in your own or other sites. The really interesting thing about Pachube is that you can share your data with people who may be interested. The data they get to see is delayed by approximately 15 minutes. If you output your data in the eeml format then you can specify your own tags too.

At first I tried to be smart with reading from the serial port, as that seems to be a bit unreliable I fell back on the old tried and tested method. I also decided from the outset that I was going to parse the XML that the the CC128 spat out rather than just filter the bits needed with regexp.
You will need to make sure you have the perl modules Device::SerialPort and XML::Simple installed. If you don’t have them then as root on your linux box do the following:
perl -MCPAN -e shell
then install each module, for example Device::SerialPort,
install Device::SerialPort
and here’s the script which is also available for download.Updated to make it more reliable.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | #!/usr/bin/perl use Device::SerialPort qw( :PARAM :STAT 0.07 ); use XML::Simple; $port = "/dev/ttyUSB0"; $ob = Device::SerialPort->new($port) or die "Can not open port $port\n"; $ob->baudrate(57600); $ob->write_settings; $ob->close; # using XML::Parser speeds xml parsing up lots! $backend = 'XML::Parser'; $ENV{XML_SIMPLE_PREFERRED_PARSER} = $backend; # we use this to only do 1 iteration (or not) $escape=0; open(SERIAL, "<$port"); while($escape <= 0) { sleep(2); while ($line = <SERIAL>) { # for debug #print $line; $isValid = (index($line,"<msg>") != -1); if (!$isValid) { last; } print "This data is".($isValid==1?"":" not")." valid\n"; # force XML::Simple to see this as a string not as a file # since XML::Simple is stupid and needs to be shot $line = "<fakeTag>$line</fakeTag>"; $isHistoric = (index($line,"<hist>") != -1); $nref = XMLin($line,forcearray => 0); $ref = $nref->{msg}; # just for reference, show if data is historic or not print "This data is".($isHistoric==1?"":" not")." historic\n"; if (!$isHistoric) { $dsb = 0 + $ref->{dsb}; $recordTime = $ref->{time}; $ccname = $ref->{src}; $temp = $ref->{tmpr}; $ch1watts = 0 + $ref->{ch1}->{watts}; $sensor = 0 + $ref->{sensor}; $id = $ref->{id}; $type = 0 + $ref->{type}; if (defined $ref->{whatever}) { # do something based on whatever } print "This $ccname was born $dsb days ago as at $recordTime - temperature is: $temp :: Current Watts in use on channel 1 are $ch1watts :: Sensor is $sensor, with an id of $id and a type of $type\n"; # for cacti you'd probably just want to output CC_Temperature:$temp CC_Watts1:$ch1watts # insert data into db # if you want to exit after a 'good' iteration set this to 1 otherwise set it to 0 (or don't change it to 1 :) ); $escape=1; } else { #process or ignore historic data } } } close(SERIAL); |
and here’s some example output, remember that I haven’t actually connected the loop around my electrical cable as yet.
This data is not historic This CC128-v0.11 was born 1 days ago as at 21:16:44 - temperature is: 23.7 :: Watts used on channel 1 are 0 :: Sensor is 0, with an id of 02835 and a type of 1
Historic data isn’t processed at the moment but it would be trivial to do. I’m not processing it since I don’t really see the point if you’re going to store the results in a database.


Please note that this is the corrected circuit, previously the VDD was not tied to ground. While the circuit would work it would only give reliable results on very short runs. This circuit allows longer runs to the sensor.
Coding this up is also made extremely easy with the OneWire library. I’ve put together a little application below that will read all of the 1-wire devices on a bus. If you press L in the Arduino IDE serial monitor it will list all the 1-Wire device id’s and if you press T you’ll get the id and temperature reading.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | /* Simple 1-wire device reading Pass T over serial to get temperatures Pass L to list 1-wire devices */ #include <OneWire.h> #include <stdio.h> #define CONVERT 0x44 #define READSCRATCH 0xBE #define SKIP_ROM 0xCC #define MATCH_ROM 0x55 OneWire ds(10); // The DS18S20 is connected on pin 10 int ledPin = 13; // flash an led on 13 - we all like flashing lights void setup(void) { // initialize inputs/outputs // start serial port Serial.begin(9600); pinMode(ledPin, OUTPUT); //we'll use the led to output a heartbeat } void loop(void) { int incomingByte = 0; if (Serial.available() > 0) { // read the incoming byte: incomingByte = Serial.read(); // say what you got: //Serial.print("I received: "); //Serial.println(incomingByte, DEC); if (incomingByte == 84) { getStuff(); Serial.print("\r\n^"); } else if (incomingByte == 76) { listDevices(); } } } void listDevices(void) { byte addr[8]; ds.reset_search(); while(ds.search(addr)) { digitalWrite(ledPin, HIGH); // sets the LED on if ( OneWire::crc8( addr, 7) == addr[7]) { if ( addr[0] == 0x10) { // Make sure it is a DS18S20 device char buffer[512]; sprintf(buffer,"Id:%02x%02x%02x%02x%02x%02x%02x%02x\r\n", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5], addr[6], addr[7]); Serial.print(buffer); } } } Serial.print('^'); } void getStuff(void) { byte i; byte present = 0; byte data[12]; byte addr[8]; char buff[15]; float real_temp; float temp_count; float read_temp; ds.reset_search(); while(ds.search(addr)) { digitalWrite(ledPin, HIGH); // sets the LED on if ( OneWire::crc8( addr, 7) != addr[7]) { // Check CRC is valid Serial.print("CRC is not valid"); } if ( addr[0] != 0x10) { // Make sure it is a DS18x20 device Serial.print("Device is not a DS18x20 family device."); } ds.reset(); // Reset device ds.select(addr); // Select device ds.write(CONVERT,1); // Issue Convert command delay(1000); // maybe 750ms is enough, maybe not digitalWrite(ledPin, LOW); // sets the LED off present = ds.reset(); // Reset device ds.select(addr); // Select device ds.write(READSCRATCH); // Read Scratchpad for ( i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); } if(OneWire::crc8( data, 8) == data[8]) { // Check CRC is valid // CRC is ok // Divide the temperature by 2 - note the » and // « need to be replaced with double < and > // wordpress kills the server when you try to // save otherwise. read_temp=((data[1]«8) | data[0]) » 1 ; // Convert to real temperature temp_count=float(data[7] - data[6])/(float)data[7]; real_temp = ((float)read_temp-0.25)+temp_count; // Convert float to ascii tempToAscii(real_temp,buff); char buffer[512]; sprintf(buffer,"%02x%02x%02x%02x%02x%02x%02x%02x %s\r\n", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5], addr[6], addr[7], buff); Serial.print(buffer); } else { Serial.println("CRC Failed"); } } void tempToAscii(double temp, char *buff) { int frac; //get three numbers to the right of the decimal point frac=(unsigned int)(temp*1000)%1000; itoa((int)temp,buff,10); strcat(buff,"."); //put the frac after the decimal itoa(frac,&buff[strlen(buff)],10); } |
There’s also a copy of the .pde file that you can download if you feel more inclined. It’s not an exact copy, I removed the commented out xml for the above version. It’s worth pointing out that this circuit is using what is called parasitic power, which means your cable run should be shortish. If you want to use an external power supply then pin 3 (VDD) on the DS18S20 should go to your external supply. This would allow for much longer runs of cable. Below is an example graph generated by cacti with 2 DS1820′s connected the the arduino. As you can see the temperatures aren’t exactly the same but this is to be expected since the accuracy of the DS1820 is +/- 0.5 ° C

The breaks in the graph were caused my me removing the USB plug from the PC it was connected to so that I could make some minor alterations to the circuit.
Josh asked how I was getting the input for Cacti, here’s the perl script I use
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #!/usr/bin/perl $output = `echo -en "T" >>/dev/ttyUSB0 && cat /dev/ttyUSB0`; @lines = split(/\r\n/,$output); $t=1; foreach $line (@lines) { @spl = split(/\s+/,$line); $lc = @spl; if ($lc gt 1) { $node=$spl[0]; $val=$spl[1]; print "Temperature_$node:$val "; } $t++; } |
This outputs Temperature_x:n where x is the 1-Wire id and n is the temperature. It could probably do with tidying up and if you wanted to you could pass the 1-Wire id to the script to and only output the temperature for that particular 1-Wire device. A copy of the exported Cacti template can be downloaded, I’m hoping that you just need to import that into your Cacti after placing the script in the scripts directory. Just remember, under linux, if you unplug and replug in your Arduino you may need to set the tty port speed to 9600 (or whatever you put in your Serial.begin(); ). You can use the following command for that;
1 2 3 | stty -F /dev/ttyUSB0 cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts |
Make sure that ttyUSB0 is what your Arduino is connected to first. If not you will need to change it in the perl script and on the line above.

Tweetbacks are saved in the comments table and can be displayed however you like for example, in my comment loop I have:
<?php if (strtolower($comment->comment_type) == 'tweetback') { $avatarurl = str_replace( "twitter:", "http://s3.amazonaws.com/twitter_production/profile_images/", $comment->comment_author_email ); echo "<img align=middle" ." src='$avatarurl' border=none" ." width=40 height=40 alt=''>"; } ?>
A word or two of caution about the plugin. Personally I’ve removed the bit.ly url shortening link parsing because it just didn’t work properly – I ended up with bogus tweetbacks until I did. The other issue is with the date saving from the tweetback, it doesn’t work properly either giving dates in the 1970′s!!!


Expansys Pricing for LG Viewty pre VAT change

Expansys Pricing for LG Viewty post VAT change
Thankfully some online retailers, like LinITX.com where I work, haven’t pulled this sort of trick on customers.

1. Start Xcode and pick one of the templates.
2. Load up the AppDelegate code and skip to ‘applicationDidFinishLaunching’.
3. Type ‘application.’ (note the full stop after the word application)
4. Hit escape and you’ll get a list, scroll down to items starting with P
5. Oh look there it is…
For those without Xcode here’s a picture.

Oh, that must be the non-public public api...
For those that want to see the what the documentation says
proximitySensingEnabled
A Boolean value that determines whether proximity sensing is enabled.
@property(nonatomic, getter=isProximitySensingEnabled) BOOL proximitySensingEnabled
Discussion
YES if proximity sensing is enabled; otherwise NO. Enabling proximity sensing tells iPhone OS that it may need to blank the screen if the user’s face is near it. Proximity sensing is disabled by default.
Availability
Available in iPhone OS 2.0 and later.
Declared In
UIApplication.h
Unfortuneately once some people grab hold of false information no facts will get in their way. Anyone that knows me will tell you that I’m really not fond of either Google or Apple, but let’s just get stuff right shall we.
Update: I’ve had some discussion on irc and it was felt that I should point out that proximityStateChanged is used and following some additonal chatter on IRC with UncleBob who pointed out that “It’s not private in the OBjC sense just the Apple documented SDK sense. ” he then went on to say “the whole thing is definately a peanut-gallery cockfest” which sums it all up really.

reads data from an sqlite database and then displays information on the product. The buy now button currently just jumps to the product url at Linitx.com.
Update: Added a screenshot when rotated. The iPhone SDK handles the rotation automatically, all you need to do is specify which parts of which objects move or resize. All that can be done from Interface Builder. Easy as pie. Also note the changed title bar colour, in keeping with LinITX, and the title text. The shop title (LinITX) and shop base product URL are read from a plist file. I suppose they could be read from the sqlite db but I am experimenting so learning how to read a plist file is useful too.
Update 2: Spent ages last night trying to work out why some of the text descriptions for products came out of the database as null. Discovered that when importing the data file it wasn’t using UTF8 encoding, which is apparently all sqlite deals with. Loading up the source data file into TextEdit under OSX and saving it as UTF8 then reimporting solved the problem. I also modified how things are displayed. The image and text are inserted into a UIWebView so are now scaleable by the user. The images are also base64 encoded and in the database. This increases the database size but means the application can still be used offline. Before none of the pictures would display if there was no network connectivity.
Update 3: Added the ability to search the list. The search bar appears when the search button is pressed and hides again when the search is complete.


The JO is available with the neoprene in one of 7 colours, the base frame is always black but the colour range is varied enough for most tastes.
If you’re looking for a passive holder for your phone or music player then for the money the JO series suit. One thing I did notice when looking at the pricing on their site compared to Amazon was that although the x castro site and Amazon prices matched (after shipping), there seemed to be no way to select the free shipping for the UK. The 3 options in the dropdown box all added more to the price.


For me Free World Dialup represented what should have been happening in the world of VoIP. While everyone else acted like money grabbing whores Free World Dialup weren’t out to make a fast buck. It was the ultimate social network – Where else could you phone complete strangers for help and end up being good friends. Community members offered support to those just getting started with VoIP. It was a wonderful time. Sadly this is no longer true.
The unfortunate thing about Free World Dialup now charging is that there are so many other services that offer the same thing for nothing. To me it seems a rather odd decision particularly as it was held in such high regard buy its users and supporters.
Jeff Pulver has commented on this on his blog but I still find it difficult to understand. As far as I am concerned Jeff is one of those totally awesome people you sometimes get to meet. He’s like an ideas factory. I have nothing but respect for him but this is almost like finding out your favourite uncle dresses up as a woman and heads down the docks at the weekend.
So I guess it’s goodbye Free World Dialup…

been second class citizens without access to the really interesting features. To add insult to injury web applications lost a large chunk of screen real estate to the top and bottom Safari toolbars.
Well, now they don’t need to. For users with firmware 2.1, if you add the following lines to the <head> section of your web application page then, when someone adds your web application to their home screen and then uses it all they will see is the standard bar showing carrier name, signal and battery level. As ever the pictures should make it much clearer. Notice that there is no address bar or lower toolbar at all, even when scrolling.
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=1;" /> <meta name="apple-mobile-web-app-capable" content="yes" /> <meta names="apple-mobile-web-app-status-bar-style" content="black-translucent" />
One thing I should point out is that, if you already have a link to a particular web application on your home screen, you will need to delete it and recreate it after the above lines have been added.

2. Open the tray
3. Press the ‘setup’ key
4. Press the fast forward key ( ‘>>’ )
5. Type 9735 on the keypad
6. In the top right corner you will see a ’2′ this is your current region. Use the left and right arrow keys to change the region. If you make this ’0′ (zero) your player will be region free.
7. Press ‘setup’ to exit the setup menu.
8. Play your DVD’s
This is a sticky fix, meaning that if you power the player off and then back on it will still be set to the region (or freeness) prior to the power off.
