tag:blogger.com,1999:blog-42546116780064641532024-02-18T23:52:07.822-05:00Avi's BlogMy name is Avi Drissman. I am a rogue Mac developer. I break and repair things, preferably in that order.Avihttp://www.blogger.com/profile/03975339276582578985noreply@blogger.comBlogger5125tag:blogger.com,1999:blog-4254611678006464153.post-6785864850062558762020-10-04T20:21:00.004-04:002020-10-04T20:33:29.317-04:00Digital Projection Lightning 35HD: Recovering from a white screen<p>I volunteer at the <a href="https://loewsjersey.org/">old Loews Jersey theater</a> in Jersey City. Our main digital projector is a Digital Projection Lightning 35HD. It’s about 15 years old now, and had been working until it failed the other month.</p><p>If your 35HD has not yet failed, please read my other post about <a href="https://avi.drissman.com/2020/10/35hd-maintenance.html">important maintenance procedures you need to do while it’s still working</a>. Once you’ve done these procedures, then come back and learn more about the inner workings of the 35HD.</p><p>If your 35HD boots to a white touchscreen, what is likely the issue is that the CMOS battery has failed. Without valid CMOS contents, the computer inside the 35HD is paused after booting, waiting for you to use a keyboard to reset the CMOS state. Here’s how to handle it.</p><p>What you will need:</p><p></p><ol style="text-align: left;"><li>A new CMOS battery. I don’t know if all 35HDs are using the same motherboard, but it’s probably a 2032.</li><li>A keyboard with a PS/2 connection.</li><li>A way to connect the VGA video. The best way to handle this is to custom-wire an adapter. Any way that allows you to connect up individual pins on an IDC connector will do.</li></ol><div>To start, remove the computer module from the projector, move it to a desk, and remove the top cover. While you have the module removed, image the CF card. Directions are on the other post.</div><div><br /></div><div>You need to gain access to the motherboard, and to do that you will need to get the screen out of the way. Completely disconnecting it is too much of a pain, but you should be able to disconnect enough wires to make it mobile.</div><div><br /></div><div>Step 1: Remove the Orinoco Wifi card. Carefully unplug the antenna from the card, and then (optionally) use a thin device to press the eject button to get the card out. If you gently pull the card straight out without using the eject lever, that’s fine.</div><div><br /></div><div>Step 2: Remove the two RJ-45 plugs and the serial connection. The RJ-45s easily unplug from the rear of the sockets. The serial connection plugs into an IDC socket on the motherboard, but the plug isn’t keyed. It would probably be a good idea to mark the socket and plug so you reinsert it correctly. (We used a grease pencil that was lying around.)</div><div><br /></div><div>Step 3: Unplug the power to the LCD backlight:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMjF1lLvoPHtXkx9r4zG5tWzYTs3DaQKWNLYRv-VLwqhhVSdHfl0HibsJ3NKUcw0ohr2_cN0iQ5rnqbFkSV4WzXtZwn6qV2MSQ7XKoqsyUOvFlYnU09Y4MriegQWDfi17J8achvFISmItH/s2048/IMG_8569.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1536" data-original-width="2048" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMjF1lLvoPHtXkx9r4zG5tWzYTs3DaQKWNLYRv-VLwqhhVSdHfl0HibsJ3NKUcw0ohr2_cN0iQ5rnqbFkSV4WzXtZwn6qV2MSQ7XKoqsyUOvFlYnU09Y4MriegQWDfi17J8achvFISmItH/w640-h480/IMG_8569.JPG" width="640" /></a></div><div><br /></div><div>Step 4: Undo four screws holding the LCD on. Warning! There are four tiny standoffs made of white plastic that are <i>above</i> the metal plate that holds the LCD. If you tilt the plate with the LCD on it, you will shake those standoffs loose. That’s probably not the best idea. Remove the screws and slowly and gently twist the LCD out of the way.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK0_qcNS0b_4ccwx1r5o2C_x49oEopxVvd7s0lCZNROgmp3-VU6A7W568OGgbhnV8AeZLzr4gVMChmf3gq-HCHVmmmRnJe0iGgzF1WKJIhBLK9R7bLorPalBZsZy_gxcH4AjJajy3rh2lG/s2048/IMG_8567.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1536" data-original-width="2048" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK0_qcNS0b_4ccwx1r5o2C_x49oEopxVvd7s0lCZNROgmp3-VU6A7W568OGgbhnV8AeZLzr4gVMChmf3gq-HCHVmmmRnJe0iGgzF1WKJIhBLK9R7bLorPalBZsZy_gxcH4AjJajy3rh2lG/w640-h480/IMG_8567.jpg" width="640" /></a></div><p></p><p><br /></p><p>Step 5: Plug in the keyboard. You’ll find a PS/2-style keyboard connector near the RJ-45 jacks on the motherboard. This will be in the lower-left of the motherboard, as it was oriented originally while installed on the projector. The keyboard port will likely be blocked by one of the large standoffs. You can carefully unscrew the standoff, and that will allow you to reinstall it later.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKmQQtyMx4s1MR9zOj7k2uYEbDv52hEjEZ2xQD7qEWXtwG4h7l1J5O_us7KHMDhKgTbrrFBXLOLyVHi6UIbBdYptHIjnCxDh4dG2OFmOdgUKpt3lsh_ahM6qzjAGi65A0aco18wBKxOoKg/s2048/IMG_8568.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1076" data-original-width="2048" height="336" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKmQQtyMx4s1MR9zOj7k2uYEbDv52hEjEZ2xQD7qEWXtwG4h7l1J5O_us7KHMDhKgTbrrFBXLOLyVHi6UIbBdYptHIjnCxDh4dG2OFmOdgUKpt3lsh_ahM6qzjAGi65A0aco18wBKxOoKg/w640-h336/IMG_8568.jpg" width="640" /></a></div><p>Step 6: Install a VGA adapter. I wish I had pictures of this pin header on the motherboard, but I failed to capture it. </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIxUtwj7xulijFp4mXn6gb4GELSmjt-xiTfq642o8rJ9C1zTtRWclyEwRnK00aabsaT0oUoEv3rBSfjc-Mb0C1tpUjeib44YRWDBTA-JrmTDVcwllcP5J_9UaD2K4Br0Y3LYquFqa0J4a-/s2048/IMG_8573.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1165" data-original-width="2048" height="364" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIxUtwj7xulijFp4mXn6gb4GELSmjt-xiTfq642o8rJ9C1zTtRWclyEwRnK00aabsaT0oUoEv3rBSfjc-Mb0C1tpUjeib44YRWDBTA-JrmTDVcwllcP5J_9UaD2K4Br0Y3LYquFqa0J4a-/w640-h364/IMG_8573.jpg" width="640" /></a></div><p>In the very corner of the motherboard is a pin header labeled “TV1”. Right next to it is an IDC-10 socket labeled “VGA1”. If you have the time to create a custom cable, that’s preferred. If not, then use whatever random collection of jumper wires you have available to make the connection. (We used female to female jumper wires from the IDC socket, we wire-wrapped directly onto the pins of a VGA cable, and just bodged the wires together in the middle. That’s not really preferred, but you do you.)</p><p>IDC-10 “VGA1” pinout:<br /></p><ul style="text-align: left;"><li>Pin 1: Red. Connect to VGA pin 1.</li><li>Pin 3: Green. Connect to VGA pin 2.</li><li>Pin 5: Blue. Connect to VGA pin 3.</li><li>Pin 6: Ground. Connect to VGA pins 5, 6, 7, 8, 10. Or connect to just one of them, as your monitor will likely just have all those pins connected together anyway.</li><li>Pin 7: HSync. Connect to VGA pin 13.</li><li>Pin 9: VSync. Connect to VGA pin 14.</li></ul><div>For reference, the <a href="https://en.wikipedia.org/wiki/VGA_connector">VGA pinout</a>. Also for reference, an IDC-10 pinout:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiQgp_scsGntSJyHaWFU_tG6jTeWXVNlU9ZHdc_LCthw1KXt4grWsowYwQbuA6oTc3E8HRLG_FnJay5eK4whmWMofFX9qMAVC0uByLesOWRVqyTsbqarzwMmxmAptGtx8ZZ_GgmOGyPBDZ/s457/IDC10WAY-M+-+Layout03.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="167" data-original-width="457" height="146" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiQgp_scsGntSJyHaWFU_tG6jTeWXVNlU9ZHdc_LCthw1KXt4grWsowYwQbuA6oTc3E8HRLG_FnJay5eK4whmWMofFX9qMAVC0uByLesOWRVqyTsbqarzwMmxmAptGtx8ZZ_GgmOGyPBDZ/w400-h146/IDC10WAY-M+-+Layout03.jpg" width="400" /></a></div><br /><div>Step 7: Put in the new CMOS battery.</div><div><br /></div><div>Step 8: Reassemble the computer as best you can. Note: You are missing a large standoff from near the PS/2 keyboard port, which means that you cannot reinstall that screw, but that also means that you will need to carefully remove and save the small corresponding standoff from the LCD tray.</div><div><br /></div><div>Step 9: Return the computer module to the projector. You don’t need to screw it on, but you need to gently rest it vertically, and attach at least the two top connectors. Attach your monitor. Power on the projector. Cross your fingers. The projector will power up, and the computer will boot. The computer will drive the monitor, and show you a screen. Press F1 to go into setup:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp-2GlFmoNpP-Q0iFCDgGl-CaDYSjWGUvk4PC5G-KS72Lwxc_YYn5pF_a6smPa7e79NCS3ViU4leHg7c5wsIP4tFLNTKMJM9GDyA-cLkDsDjcvrZHHN0x0geZ4JgrABPUkxdak6HkLqJ9_/s1484/IMG_8579.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1404" data-original-width="1484" height="379" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp-2GlFmoNpP-Q0iFCDgGl-CaDYSjWGUvk4PC5G-KS72Lwxc_YYn5pF_a6smPa7e79NCS3ViU4leHg7c5wsIP4tFLNTKMJM9GDyA-cLkDsDjcvrZHHN0x0geZ4JgrABPUkxdak6HkLqJ9_/w400-h379/IMG_8579.JPG" width="400" /></a></div><br /><div>Step 10: Enter “PCI / Plug and Play Setup”. In “Boot Screen Select” select “CRT+LCD”. In “LCD Panel Type” select “640 x 480 TFT”. Save and continue to boot.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi83WoWE0PaFvyinfk6gfgqXlajvrcaxjmVygPRDa6ryS-0bAYal4OGTGeTJNfbgk1muIxKb6qiJh-RpsGQesv6OoQzZDJ85QwudeofMbbLQNGCsGByjizM0DZJIHKo-Kk7tADiKRAls5G-/s1483/2.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1165" data-original-width="1483" height="314" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi83WoWE0PaFvyinfk6gfgqXlajvrcaxjmVygPRDa6ryS-0bAYal4OGTGeTJNfbgk1muIxKb6qiJh-RpsGQesv6OoQzZDJ85QwudeofMbbLQNGCsGByjizM0DZJIHKo-Kk7tADiKRAls5G-/w400-h314/2.png" width="400" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUx7XAxGD5WW9MXKDllI3KYl-2Dig_HxiohPqbnIwiuOqAox9pXTNCr7o6pqV9g_hhHbW1QqC3U81r-0KcuW3dKYHu4foWByVMncyysEo-ZCp-hoEwJCQdUX2dlTdnK6LBmBoqi2Timm0G/s1633/1-2.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1279" data-original-width="1633" height="314" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUx7XAxGD5WW9MXKDllI3KYl-2Dig_HxiohPqbnIwiuOqAox9pXTNCr7o6pqV9g_hhHbW1QqC3U81r-0KcuW3dKYHu4foWByVMncyysEo-ZCp-hoEwJCQdUX2dlTdnK6LBmBoqi2Timm0G/w400-h314/1-2.jpg" width="400" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2CxdninsBtl4MDWap2k4xPj2M-PkiKOxc34CPiVrbGFs_z3cAAprETuLSLTvtNDEMFTB-SEcEG9H3J-w_YrjJtl3l5Y5buDHGDlIvquYKZdTCRA0smu85Q3sPsgT9mX9yC7G3zRK9HhOB/s1722/Pasted_Image_10_4_20__8_06_PM.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1433" data-original-width="1722" height="333" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2CxdninsBtl4MDWap2k4xPj2M-PkiKOxc34CPiVrbGFs_z3cAAprETuLSLTvtNDEMFTB-SEcEG9H3J-w_YrjJtl3l5Y5buDHGDlIvquYKZdTCRA0smu85Q3sPsgT9mX9yC7G3zRK9HhOB/w400-h333/Pasted_Image_10_4_20__8_06_PM.png" width="400" /></a></div><p>Step 11: Your projector should boot up and use the touchscreen. If you didn’t plug in all the cables, you’ll get some various warnings. That’s fine. Just verify that the touch screen shows an image and that its touch capability works.</p><p>Step 12. Power down the projector. Remove the computer module. Return to your desk, and disassemble the computer module enough so that you can remove the VGA adapter. Keep that adapter safe. Unplug the keyboard, and reinstall the standoff that you unscrewed. Carefully reassemble the computer module, replugging all the parts and reinstalling all the pieces and cards you removed. Screw the case together, reinstall the module onto the projector, and plug in all the cables.</p><div>You’re done; enjoy the use of your projector again! Make sure that every three years or so, you replace the 2032 CMOS battery. No reason to have to do that again.</div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><p></p>Avihttp://www.blogger.com/profile/03975339276582578985noreply@blogger.com0tag:blogger.com,1999:blog-4254611678006464153.post-16246677387483858512020-10-04T20:20:00.002-04:002020-10-04T20:31:36.967-04:00Digital Projection Lightning 35HD: Critical maintenance procedures<p>I volunteer at the <a href="https://loewsjersey.org/">old Loews Jersey theater</a> in Jersey City. Our main digital projector is a Digital Projection Lightning 35HD. It’s about 15 years old now, and had been working until it failed the other month.</p><p>I’ll talk in another post about <a href="https://avi.drissman.com/2020/10/35hd-white-screen-recovery.html">recovering from the white screen failure mode</a>, but if you’re not experiencing that failure mode, and your 35HD is working, there are two big things you need to do to make your life easier in the future.</p><p>First, you need to image the 35HD’s Compact Flash card.</p><p>The 35HD uses a 128MB CF card as a boot drive. Replacements for CF cards are easy to come by, but if it fails, the problem is that the information on the card would be lost. The tech staff at the Loews Jersey has an image of our 35HD’s card; contact us if you are suffering from this issue and we’ll try to help you as best we can.</p><p>How to image the card? The card is pretty easily accessible. Turn off and unplug the 35HD, and remove the computer module by removing the large screws on the module with the touchscreen. On the back right of the computer module is a small access hole covered by a plate. Remove the two screws covering the plate, and you’ll have access to the CF card. Remove the card and image it with the usual tools.</p><p>Second, you need to put in a new CMOS battery before the old one fails.</p><p>The CMOS battery used in the 35HD is a 2032. I don’t know how much the drain is and how long to expect it to last, but if it’s been more than 3–4 years since you last replaced it (or if you’ve never replaced it), you really need to replace it now. If the battery goes dead, the projector will fail and boot to a white screen. That is a recoverable state, but recovering from it is an incredible pain, so aggressively keeping a good battery in the 35HD is preferable.</p><p>To replace the battery: Unscrew the computer module and remove the shield to its left. Unplug all the cables. Move the computer module to a table, and place it screen up. Remove all the screws holding on the metal cover.</p><p>Inside the computer module is the motherboard. You don’t need to unplug or unscrew anything; the CMOS battery is at the edge of the motherboard. Carefully replace the battery and reassemble the projector the way you took it apart.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEite7YOoeJAbAV8p6vKRQ04lnxib_m7g7W-qhMOjbdi1Tg5U38ADqtZ6daTelhwtGQy9BntGMMafZU0AQrvqF93Q0unef1K9EZom-RQlUrnrrrnEU1FH1cwNk9tIh4_t5SCfe9hEv89oajb/s2598/Pasted_Image_10_4_20__7_12_PM.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1210" data-original-width="2598" height="298" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEite7YOoeJAbAV8p6vKRQ04lnxib_m7g7W-qhMOjbdi1Tg5U38ADqtZ6daTelhwtGQy9BntGMMafZU0AQrvqF93Q0unef1K9EZom-RQlUrnrrrnEU1FH1cwNk9tIh4_t5SCfe9hEv89oajb/w640-h298/Pasted_Image_10_4_20__7_12_PM.png" width="640" /></a></div><br /><p></p><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><br /><p></p><p><br /><br /></p><p><br /><br /></p>Avihttp://www.blogger.com/profile/03975339276582578985noreply@blogger.com0tag:blogger.com,1999:blog-4254611678006464153.post-23506199405054382962017-09-02T16:52:00.002-04:002017-09-02T16:55:49.180-04:00McDonald's doesn't care about bicyclistsOn Thursday, August 31, 2017, I was bicycling up 8th Avenue in Manhattan. 8th Avenue has a <a href="http://www.streetsblog.org/wp-content/uploads/2014/09/2014-09-03-bicycle-path-data-analysis.pdf">protected bicycle lane</a>, separated from traffic by a row of parked cars. Having been hit by a car door before and having woken up in the hospital, I appreciate having this protected lane.<br />
<br />
But after I passed 26th Street, I was forced to stop my bicycle, and walk it onto the sidewalk. The entirety of the protected bicycle lane was taken up by a <i>semi truck</i>. A McDonald's semi truck.<br />
<br />
I took some pictures.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvpmKHOyrOvoh2jkXg-gY4eeqEDqBb4uIKUmlAQLMfVd-Vepb4oTRz6O3R-WlhOxrwykbax-cBg5uos63XGRajUShTnpHu1bfJZRd8VYLmKS7nT1MbJabZDM5u0Qw1_xTcoQ2TC-CHxoXu/s1600/IMG_3216.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1200" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvpmKHOyrOvoh2jkXg-gY4eeqEDqBb4uIKUmlAQLMfVd-Vepb4oTRz6O3R-WlhOxrwykbax-cBg5uos63XGRajUShTnpHu1bfJZRd8VYLmKS7nT1MbJabZDM5u0Qw1_xTcoQ2TC-CHxoXu/s320/IMG_3216.JPG" width="240" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4JsVtWAGAlKwtPqjQATjGOmHiNvwdnXOparjaYqQytmmX-xCD4tu21RCHBBWOsUgGCvIo8IcBtklg-QkMwufZZ8-XTTJGLsSSEI3yBoS_VzOYwWEW-xSffsXHGCl_ergAv6-Z5SKngTAH/s1600/IMG_3219.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1200" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4JsVtWAGAlKwtPqjQATjGOmHiNvwdnXOparjaYqQytmmX-xCD4tu21RCHBBWOsUgGCvIo8IcBtklg-QkMwufZZ8-XTTJGLsSSEI3yBoS_VzOYwWEW-xSffsXHGCl_ergAv6-Z5SKngTAH/s320/IMG_3219.JPG" width="240" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPoYgvDoN_DS7Z8luj2rLys1-WtEmLeh-K2_QRLVSez9Qxzap3mX4dKb-NEZK9OJatpyOLTs3SV2dUQe7qjHvcoy2IAVMX4yg5kHsBIQsUuqkmYHPg1tZ24rJh2kKt3FY3omiZsdiUUbp6/s1600/IMG_3220.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPoYgvDoN_DS7Z8luj2rLys1-WtEmLeh-K2_QRLVSez9Qxzap3mX4dKb-NEZK9OJatpyOLTs3SV2dUQe7qjHvcoy2IAVMX4yg5kHsBIQsUuqkmYHPg1tZ24rJh2kKt3FY3omiZsdiUUbp6/s320/IMG_3220.JPG" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
And it was blocking a fire hydrant, while we're at it.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Having a semi truck in a protected bicycle lane is a hazard to bicyclists, and of course, illegal, a violation of RCNY Title 34, § 4-08(e)(9).</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
As I was about to leave, the driver entered the semi truck and proceeded to drive away, in the protected bicycle lane.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/lIi3ZF3UfTg/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/lIi3ZF3UfTg?feature=player_embedded" width="320"></iframe><br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
This again is illegal, a violation of RCNY Title 34, § 4-12(p)(2), and I'm sure you can see how hazardous it is.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
So I <a href="https://twitter.com/avidrissman/status/903307493958397952">tweeted about it</a>, and tagged McDonald's. They asked me to call an 800 number. I did.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
I waited and pressed various numbers, and eventually got to talk to Luciano. He asked me what happened, and I described it. He said he'd bring it up with the "owners", and was about to hang up on me when I asked if he even cared enough to take down the license number and other identifying details. I gave him the details.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
And that's all. I witnessed a McDonald's semi truck wildly violating the law and putting the lives of bicyclists in danger, and I have an apology from a call center employee who is <i>super sorry</i> and <i>assures</i> me that he understands how upset I am.</div>
Avihttp://www.blogger.com/profile/03975339276582578985noreply@blogger.com0tag:blogger.com,1999:blog-4254611678006464153.post-55892585999555247592014-07-29T10:42:00.001-04:002014-07-29T10:43:02.073-04:00<a href="http://slatestarcodex.com/2014/04/28/the-control-group-is-out-of-control/">"The Control Group is Out Of Control"</a><br />
<br />
(<a href="https://plus.google.com/+MikeyDickerson/posts/NR9DfiEN9hR">via Mikey D</a>, via Tim O'Reilly)Avihttp://www.blogger.com/profile/03975339276582578985noreply@blogger.com0tag:blogger.com,1999:blog-4254611678006464153.post-22433971726329690172014-02-01T18:12:00.003-05:002021-04-14T14:08:49.822-04:00Lobotomizing Quicken 2007I am an old-school Quicken user, back to the Apple II days. Intuit used to be OK, but as the Mac declined in the 90s, Intuit started ignoring it. Every year they would throw a few more features into Quicken that no one cared about, and everyone would upgrade.<br />
<br />
Bank connectivity was simple; you downloaded files from your bank in the <a href="http://en.wikipedia.org/wiki/Quicken_Interchange_Format">QIF format</a>, and you reconciled things. But QIF wasn't a great file format. There was an open file standard called <a href="http://en.wikipedia.org/wiki/Open_Financial_Exchange">OFX</a> that Microsoft Money used, but Intuit didn't see the appeal in that. Intuit took OFX, added a custom field to it called "INTU.BID", called the file format <a href="http://en.wikipedia.org/wiki/QFX_(file_format)">QFX</a>, and started charging banks to get a number to put into that field. And because Quicken now worked online, Intuit could <i>enforce</i> the payment from banks. If banks didn't pay, Quicken wouldn't know about their "INTU.BID", and Quicken wouldn't download their customers' data.<br />
<br />
I don't know if that's <i>legally</i> extortion, but I'm going to call it that. And so do lots of other <a href="http://boingboing.net/2005/01/29/quicken-disables-the.html">unhappy people</a>.<br />
<br />
<hr />
<br />
Meanwhile, Intuit continued to screw over Mac users. The last version of Quicken that Intuit released for the Mac was Quicken 2007. It was a PowerPC app. In 2009 they <a href="http://archive.is/HPLhh">announced</a> a new app, "Quicken Essentials for the Mac", which was released in February of 2010. It was an under-powered joke that didn't do things like track investments, so Intuit suggested that people who needed to do more than balance their checkbook keep using Quicken 2007.<br />
<br />
When Mac OS X Lion came out, and Quicken 2007 wouldn't run any more because it was a PowerPC app, Intuit acted swiftly. Lion came out in July of 2011, and <i>seven months later in March of 2012</i> Intuit released a crappy recompilation into x86.<br />
<br />
And that's it.<br />
<br />
<hr />
<br />
Why do I bring this up? Because I <i>hate</i> Intuit. I <i><b>despise them</b></i> because they have made it abundantly clear that they despise me and all of their customers.<br />
<br />
A few months ago, I signed up for the computer-driven investment manager <a href="https://www.wealthfront.com/">Wealthfront</a>, started by people who wanted to use high tech to bring quality investing to non-finance minded people (e.g. me). (I think they're cool enough to recommend; I'd like it if you were to sign up with <a href="http://wlth.fr/1gdXwcn">my referral link</a> so that both you and I save money, though it's your call and I won't mind it if you don't.)<br />
<br />
But Wealthfront uses <a href="http://www.apexclearing.com/">Apex Clearing</a> to hold their accounts, and while Apex paid their Intuit tax and offers QFX downloads, guess what? They paid for Windows but not Mac. And so Mac Quicken won't import their files.<br />
<br />
Now, ever since Intuit pulled the INTU.BID stunt with QFX, people have been trying to work around it. If you google around, you'll find the usual suggestion is to <a href="http://www.digital501.com/2006022124/hack-quicken-osx-qfx/">switch out the INTU.BID number</a> for one that works. I tried that, but couldn't get it to work.<br />
<br />
And then I asked myself, why don't I fix Quicken itself?<br />
<br />
When you open an unauthorized QFX file, you get the "unable to verify the Financial Institution information" dialog. So I took a stack trace, and that dialog is fired from:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">QApplication::OpenQuickenDoc(short, long, char*, unsigned long, long) + 225 [0x278b45]</span><br />
<span style="font-family: Courier New, Courier, monospace;">QApplication::OpenWebConnectFile(short, long, char*) + 186 [0x278a34]</span><br />
<span style="font-family: Courier New, Courier, monospace;">QMSession::ProcessWebConnectFile(char const*) + 306 [0x20e23e]</span><br />
<span style="font-family: Courier New, Courier, monospace;">QMSession::SendSessions(short&, StretchyString&) + 2392 [0x20ec4c]</span><br />
<span style="font-family: Courier New, Courier, monospace;">SessionMgr::StartLocalMsgSetSessions(unsigned short, EBVoidPtrArray*, SendQ*, short, unsigned long) + 180 [0x4813ca]</span><br />
<span style="font-family: Courier New, Courier, monospace;">MsgSetConnectionMgr::CreateLocalSessions(unsigned short, EBVoidPtrArray*, SessionList*) + 1227 [0x3fe969]</span><br />
<span style="font-family: Courier New, Courier, monospace;">QMSession::BeginMessageSet(unsigned short, OEMessageSetRs*, unsigned long, OEString const&) + 79 [0x20f19b]</span><br />
<span style="font-family: Courier New, Courier, monospace;">QImportOFXRs::PrepareForSession(OEString const&) + 722 [0x212f6e]</span><br />
<span style="font-family: Courier New, Courier, monospace;">DoErrorMsg(char*, char*, OpaqueWindowPtr*, AlertFunctor*) + 39 [0x38d7fc]</span><br />
<br />
Note that they ship their binary with symbols. Really. This made my job a million times easier.<br />
<br />
So I went to look at <span style="font-family: Courier New, Courier, monospace;">QImportOFXRs::PrepareForSession</span>. When I tossed Quicken into <a href="http://www.hopperapp.com/">Hopper</a> and went to that function, I saw:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVG2XBxJxFNttfiM8uC1njYuSwekplh84_5s3aVP5qx02LPejXrZbWsZdGYc0vTHItYp3TEv3MuUQnOwsyv2-3lqmy5X6ODq7jr5KKoovIls0LWud3D7zQ31BT8QWJQlUmVg82sNJoAPEJ/s1600/1.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="178" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVG2XBxJxFNttfiM8uC1njYuSwekplh84_5s3aVP5qx02LPejXrZbWsZdGYc0vTHItYp3TEv3MuUQnOwsyv2-3lqmy5X6ODq7jr5KKoovIls0LWud3D7zQ31BT8QWJQlUmVg82sNJoAPEJ/s1600/1.png" width="640" /></a></div>
<br />
Look at the call to <span style="font-family: Courier New, Courier, monospace;">EBCache::GetWebConnectInfoForFeature</span>. Quicken tests to make sure it has web connect info, and if it doesn't have that info it throws up the error dialog and dies.<br />
<br />
But what's interesting is that, at 212f73, it immediately overwrites <span style="font-family: Courier New, Courier, monospace;">eax</span>. In other words, Quicken tests to make sure it has web connect info for the bank, and then <i>immediately throws out</i> that information. So what happens if I <span style="font-family: Courier New, Courier, monospace;">NOP</span>-out that entire error block, so that Quicken always proceeds?<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4ERlDWvdVS93V4KWcscrsK3DLqLzPIYvEn1YH4TKew-HYLbPosFNFtYtKCnWgU7sanILSHy28pYAt8dCIb2vuje2m2ctR0_eW3mXC4OfpnoV83PzDRiJEg0CX99TQ2HZQ5k815W_zGPpL/s1600/2.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4ERlDWvdVS93V4KWcscrsK3DLqLzPIYvEn1YH4TKew-HYLbPosFNFtYtKCnWgU7sanILSHy28pYAt8dCIb2vuje2m2ctR0_eW3mXC4OfpnoV83PzDRiJEg0CX99TQ2HZQ5k815W_zGPpL/s1600/2.png" /></a></div>
<br />
It works. Quicken puts "FI needs update" as the bank name, but it allows you to proceed with the import.<br />
<br />
There is a problem, though. I experimented a bit, and found that if you do a partial import, and then try to go back to the "Download Transactions..." window, Quicken will say that you need to update your bank list. And if you allow it to do so, it realizes the tricks you've pulled, and disables your account from ever importing again.<br />
<br />
That particular dialog, the "you had an online account for a bank we don't know about any more, so we're going to disable it" one, comes from the stack trace:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">OldQuickenMenuGlue::DoCommandProcess(PPx::SysCarbonEvent&, HICommand, unsigned long, unsigned long) + 156 [0x1b2610]</span><br />
<span style="font-family: Courier New, Courier, monospace;">MenuManager::DoCommand(long) + 107 [0x1b1173]</span><br />
<span style="font-family: Courier New, Courier, monospace;">OnlineMenuHandler::DoCommand(short) + 75 [0x1b5503]</span><br />
<span style="font-family: Courier New, Courier, monospace;">needsToUpdateBankList() + 579 [0x1b5e07]</span><br />
<span style="font-family: Courier New, Courier, monospace;">DoAlert(short, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, short, short, short, OpaqueWindowPtr*, AlertFunctor*) + 898 [0xd6d51]</span><br />
<span style="font-family: Courier New, Courier, monospace;">DoAlert(short, __CFString const*, __CFString const*, __CFString const*, __CFString const*, __CFString const*, __CFString const*, __CFString const*, AlertButton, AlertButton, OpaqueWindowPtr*, AlertFunctor*) + 215 [0xd69c3]</span><br />
<br />
Looking, it seems like <span style="font-family: Courier New, Courier, monospace;">needsToUpdateBankList</span> is a bad function to ever be in. No. We should never want to update the bank list.<br />
<br />
Fortunately, that's easy.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoMRZ2C7tiswf8_6Hud43pxI9Po1HGcdjx9ZpcCMT_O8MMm_2QeHeNKAeVaKgZYz9M1NKyvsAh6NHS-hOYnznvNcj1Ghr_fEI0ZtqpRDCVdSVlMZuXfnjasL40QHds4Xfwd583fx5H3GtZ/s1600/3.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoMRZ2C7tiswf8_6Hud43pxI9Po1HGcdjx9ZpcCMT_O8MMm_2QeHeNKAeVaKgZYz9M1NKyvsAh6NHS-hOYnznvNcj1Ghr_fEI0ZtqpRDCVdSVlMZuXfnjasL40QHds4Xfwd583fx5H3GtZ/s1600/3.png" /></a></div>
<br />
I overwrote the first few bytes of the function with <span style="font-family: Courier New, Courier, monospace;">33C0C3</span> which is <span style="font-family: Courier New, Courier, monospace;">xor eax, eax; ret</span>.<br />
<br />
<hr />
<br />
I don't know if I'm done. Who knows what other subtle pitfalls I might need to disarm that I don't yet know about? But I have a working import:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBhXRKiLoTEd5Lp-uG7NWstJe8pTYmm3hJ4DQ8QjQP0ZT2PsDgvK9BT-xOD0TY_JUPvl0eq5XL70gux2oMMSD5NAU7-oMU9UUyAspbHAlc5zXzyhv1Yd-W3zL9QTPtp60ubt9c9DwsxZ0u/s1600/r.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBhXRKiLoTEd5Lp-uG7NWstJe8pTYmm3hJ4DQ8QjQP0ZT2PsDgvK9BT-xOD0TY_JUPvl0eq5XL70gux2oMMSD5NAU7-oMU9UUyAspbHAlc5zXzyhv1Yd-W3zL9QTPtp60ubt9c9DwsxZ0u/s1600/r.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
and right now that's all that matters.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
(Note: All offsets are as of Quicken 2007 version 16.1.4 (build 23.880.400). Your mileage may vary. This will probably void your warranty and possibly your EULA. Please take the usual precautions, including backing up your original application binary.)</div>
<br /><span><a name='more'></a></span><div><br /></div><div>2021 Edit: A friend Greg notes:</div><div><div></div><blockquote><div>Thanks for sharing the link with your spelunking adventures. It prompted me to perform surgery on my own copy of Q2007 (version 16.2.4 (25.886.100)), which, of course, has different offsets within the code for the surgical procedures. Just in case you wanted to update your page, the changes I made are:</div><div><br /></div><div>at offset 2177598 is the sequence 0x7543 (jne opcode with offset), which I changed to 0xEB43 (jmp opcode with offset). I did this rather than nop out the code block as you did, just because I feel that the fewer changes the better.</div><div><br /></div><div>at offset 1795460 is the sequence 0x5589E5, which I changed to 0x33C0C3 (as you did).</div><div><br /></div><div>So far, so good, although I admit that I haven't yet performed any testing. (It still runs, but I haven't tried to import any .QFX files.)</div></blockquote><div></div></div><div><br /></div>Avihttp://www.blogger.com/profile/03975339276582578985noreply@blogger.com0