tag:blogger.com,1999:blog-12993959487767495962024-03-18T03:28:27.088-07:00Fuery Solutions<a href="http://fuery.com">Fuery Solutions</a> is a software solutions company that provides technology support, custom software development, and product management for emerging and small businesses. Our premiere product, <a href="https://meruscase.com">MerusCase</a>, is a complete Practice Management solution for attorneys.Anonymoushttp://www.blogger.com/profile/04935401188654725995noreply@blogger.comBlogger21125tag:blogger.com,1999:blog-1299395948776749596.post-34218569336668221162010-12-27T14:02:00.000-08:002010-12-27T14:34:43.562-08:00Securing the Redmine_S3 pluginWe run redmine internally here at <a href="http://fuery.com/">Fuery Solutions</a>. Redmine is a fantastic tool for managing software development projects.<br />
<br />
One of the unfortunate "features" redmine has is the habit of storing uploaded files without any security, regardless of whether the system itself is password protected or not. The <a href="https://github.com/tigrish/redmine_s3">redmine s3 plugin</a> echoes this habit, setting all uploaded documents to readable by the entire internet. Obviously, the URLs are somewhat obscure, but as the cliche goes, obscurity is not security.<br />
<br />
Here are instructions for altering the plugin to use temporary authorized URLs. This effectively offloads the security requirements to Amazon's formidable infrastructure.<br />
<br />
These instructions apply to:<br />
<br />
<ul><li>Redmine 1.0.x</li>
<li>Redmine_S3 v 0.03</li>
</ul><div>Files you'll be editing (where "redmine" is your rails application root):</div><div><ol><li>redmine/vendor/plugins/redmine_s3/lib/redmine_s3/attachment_patch.rb</li>
<li>redmine/vendor/plugins/redmine_s3/lib/redmine_s3/attachments_controller_patch.rb</li>
<li>redmine/vendor/plugins/redmine_s3/lib/redmine_s3/connection.rb</li>
</ol><div>First, we need to disable the "set newly uploaded files to be readable" command. This entails commenting a single line in attachment_patch.rb, on line 24:</div><div><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><br />
</span></div><div><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">#Private (not readable by everyone) is the default.</span></div><div><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">#RedmineS3::Connection.publicly_readable!(path_to_file)</span></div></div><br />
This handles newly created files. Next, we need to add the capability to retrieve a URI with the AWS temporary authorization keys. The S3 lib the plugin uses actually contains theses goodies already, so we just need a wrapper function in connection.rb that uses the QueryStringAuthGenerator class. This function isn't as clean as it could be, but we threw this together in an hour. Add this function to the Connection class in connection.rb:<br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">def self.private_uri(filepath)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> load_options unless @@access_key_id && @@secret_acces_key</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> @@qs_conn = S3::QueryStringAuthGenerator.new(@@access_key_id, @@secret_acces_key, false) unless @@qs_conn</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> @@qs_conn.get(bucket, filepath)</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">end</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: inherit;">I added this on line 37, between the bucket and uri functions. You'll also, of course, need to initialize @@qs_conn by adding this at the beginning of the file (line 7 or so):</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">@@qs_conn = nil</span><br />
<br />
Finally, we need to adjust the controller function that handles the response to the attachment GET requests themselves. Adjust attachments_controller_path.rb on line 23:<br />
<br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">#Comment the current line 23.</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">#redirect_to("#{RedmineS3::Connection.uri/#{@attachment.path_to_file}") </span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">#New code</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">redirect_to("#{RedmineS3::Connection.private_uri(@attachment.path_to_file)}") </span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><br />
</span><br />
Don't forget to restart your application after performing these changes. You'll also, of course, need to adjust the file settings in AWS for previously uploaded files. Although this new code works for viewing those files, the security settings ("visible to everyone") need to be reset manually.<br />
<div><br />
</div><div><br />
</div>Anonymoushttp://www.blogger.com/profile/04935401188654725995noreply@blogger.com100tag:blogger.com,1999:blog-1299395948776749596.post-62044309800390186452010-11-02T01:41:00.000-07:002010-11-02T01:43:03.387-07:00At a Glance To-do List for Running Rails 2 and Rails 3 on the Same Linux ServerThis is geeky. You've been warned.<br />
<div><br />
</div><div>Environment: Rails 2.3.5 app - <a href="http://redmine.org/">redmine</a>,our internal project management tool, in our case - running on Ubuntu 10.04.</div><div>Requirement: Install a Rails 3 app - our new corp web site in this case. Goodbye, Wordpress, hello home-grown RoR happiness.</div><div><br />
</div><div>Note: this will down your rails 2.3.5 app briefly.</div><div><br />
</div><div><ol><li>Make sure your core libs are up to date:</li>
<ol><li> apt-get install libyaml-ruby</li>
<li> apt-get install libzlib-ruby</li>
</ol><li>Update rubygems. Ubuntu won't let you using "gem install rubygems", so do this instead:</li>
<ol><li>gem install rubygems-update</li>
<li>rubygems-update</li>
</ol><li>Install bundler</li>
<ol><li>gem install bundler</li>
</ol><li>Install Rails 3. This will take a few minutes.</li>
<ol><li>gem install rails</li>
</ol><li>Go to your Rails 3 app directory and run:</li>
<ol><li>bundle install</li>
</ol><li>Reload apache (optional)</li>
<ol><li>/etc/init.d/apache2 reload OR service apache2 reload</li>
</ol><li>Your old Rails 2 app will now be down and your new Rails 3 app is running. Now we reinstall Rails 2. Bundler lets these coexist peacefully:</li>
<ol><li>gem install rails -v=2.3.5</li>
</ol><li>Reload apache. </li>
<ol><li>/etc/init.d/apache2 reload OR service apache2 reload</li>
</ol></ol><div>Check your work by accessing both of your applications. Voila!</div></div>Anonymoushttp://www.blogger.com/profile/04935401188654725995noreply@blogger.com190tag:blogger.com,1999:blog-1299395948776749596.post-79260453616251341772010-05-24T16:34:00.000-07:002010-05-24T16:38:39.510-07:00Migrating and Cracking Tritek Legal Case ManagementIn my development of the MerusCase module that does a data migration from Tritek to MerusCase, I have thoroughly decoded their database schema. What a mess! I had to develop contact 'de-duping' software using what we call 'fuzzy matching' via a <a href="http://en.wikipedia.org/wiki/Levenshtein_distance">Levenshtein metric</a>. That was really intriguing to develop.<br />
<br />
However, in order to properly map data from their system to ours, I needed a working copy of the software to reference from and see how that data was being stored in their archaic dBase (Microsoft FoxPro) format. It's funny that Microsoft has officially announced the death of FoxPro, i.e. they have announced the dates after which they will no longer support the product. It's even funnier that if Tritek has any chance of keeping up with technology they will have to start their app from scratch. Anyone who as ever used the program realizes how shoddy the user interface is -- irritating to navigate, an eyesore to look at (no taste for aesthetics whatsoever!), and a counter-intuitive approach to UI design.<br />
<br />
Apparently Tritek's tampering check is easy to crack. First off, if you rename the xmgmt.exe file with a .txt extension and open it up in TextPad, you'll see that all the FoxPro code is embedded in plain text. That is, you can see exactly what the developers wrote that make the application run and do what it does. If you do a search for 'tampered' or 'exempt' you will find the dialog box that tells you to buy a license, and you will also find the code that does the security check.<br />
<br />
All it does is do a 'dir x: > WORK\vsno.txt' on the drive that your data sits on, saves the output into the WORK folder, looks for 'Volume Serial Number' in that text file, because it grabs the 9-char s/n for your drive. It then hashes it and computes the corresponding 8 to 11 digit integer using a built-in FoxPro hash function <a href="http://msdn.microsoft.com/en-us/library/65zx7k19%28VS.80%29.aspx">(SYS 2007)</a>. That integer is compared to the value contained in serno.dbf file, located in your data folder. There are 'backdoors' aka Tritek Maintenance logins hard-coded too (see code snippet below). I could run a brute force attack on those codes using a utility like MDCrack to find out the universal volume-s/n they use...<br />
<br />
Fortunately, there is a simple command-line utility that allows you to change your drive's serial number. This has no effect to anything else, so far as I can think of. Nothing uses HDD serial numbers except for the occasional 15-year old p.o.s. software (Tritek for one!). Download volumeid.exe from <a href="http://technet.microsoft.com/en-us/sysinternals/bb897436.aspx">Microsoft Technet </a>(it's free) or <a href="http://merus-blog.s3.amazonaws.com/Volumeid.exe">from here</a>. It's usage is simple: <span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span class="Apple-style-span" style="border-collapse: collapse; color: #333333; font-family: 'Segoe UI','Lucida Grande',Verdana,Arial,Helvetica,sans-serif; font-size: 13px; line-height: 16px;"><span style="border-width: 0px; font-family: inherit; font-style: inherit; margin: 0px; outline-width: 0px; padding: 0px;">volumeid <driveletter:> xxxx-xxxx. </span><span style="border-width: 0px; font-family: inherit; font-style: inherit; margin: 0px; outline-width: 0px; padding: 0px;"></span><b style="border-width: 0px; font-family: inherit; font-style: inherit; font-weight: normal; margin: 0px; outline-width: 0px; padding: 0px;"> You'll have to reboot for changes to take effect.</b></span></span><br />
<br />
<span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span class="Apple-style-span" style="border-collapse: collapse; color: #333333; font-family: 'Segoe UI','Lucida Grande',Verdana,Arial,Helvetica,sans-serif; font-size: 13px; line-height: 16px;"><b style="border-width: 0px; font-family: inherit; font-style: inherit; font-weight: bold; margin: 0px; outline-width: 0px; padding: 0px;">Maybe if I have time in the future, I'll throw together a little script that will disable or patch tritek to completely bypass security checks altogether. In the world of cracking, a bypass may be as simple as converting a machine code instruction 'jump if equal (je)' to 'jump if not equal (jne)'. =) </b></span></span><br />
<br />
<br />
<pre>a="dir "+xdata+" >"+xwork+"\vsno.txt"
RUN &a
b=xwork+"\vsno.txt"
a=FILETOSTR(b)
c="Volume Serial Number is "
L=LEN(c)
d=AT(c,a)
d=d+L
z=SUBSTR(a,d,9)
a=SYS(2007,z,0,1)
b=a
a=a+a
L=LEN(a)
SELECT serno
vtampered=.f.
z=ALLTRIM(vsno)
LL=LEN(SYS(2007,z,0,1))
IF (b="446519453" .or. b="487413866" .or. b="1505040575" .or. ;
b="3629040784" .or. b="659246687" .or. b="140427344" .or. ;
b="3772951423")
*!* IF (b="446519453" .or. b="487413866" .or. b="1505040575" .or. ;
*!* b="3629040784" .or. b="659246687")
usesmsg="TRITEK MAINTENANCE LOGIN"
thisform.uses1.visible=.t.
xe=0
</pre>Anonymoushttp://www.blogger.com/profile/04935401188654725995noreply@blogger.com25tag:blogger.com,1999:blog-1299395948776749596.post-71782351796597463062010-04-07T23:35:00.000-07:002010-04-07T23:35:19.275-07:00How to Record Help Videos Using Open Source Tools and Youtube<span class="Apple-style-span" style="font-family: inherit;">We've just begin using this method for recording How-To videos for the </span><a href="http://help.meruscase.com/"><span class="Apple-style-span" style="font-family: inherit;">MerusCase Knowledge Base</span></a><span class="Apple-style-span" style="font-family: inherit;">. It's a little involved, but sometimes nothing works better than "show me how".</span><br />
<br />
<ol><li><span class="Apple-style-span" style="font-family: inherit;">Download and install </span><a href="http://camstudio.org/"><span class="Apple-style-span" style="font-family: inherit;">CamStudio</span></a><span class="Apple-style-span" style="font-family: inherit;">, open source Screen Recording software. </span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">Most of us here use a dual-monitor setup. This is an ideal situation because you can record one entire screen. Set your screen resolution to a video-friendlier size, like 800x600. You'll also need to set your primary monitor to the screen that you want to record.</span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">In CamStudio, set the "Region" to "Full Screen". I also like to set the View to "Buttons View" in case the CamStudio control panel ends up in a portion of your video.</span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">Sanitize your desktop and whatever you'll be recording. That means the profanely named files on your desktop will have to be stowed somewhere else for now. Close extraneous applications, too.</span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">Record your video. Don't worry about mistakes, just get good footage.</span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">Download </span><a href="http://www.virtualdub.org/"><span class="Apple-style-span" style="font-family: inherit;">VirtualDub</span></a><span class="Apple-style-span" style="font-family: inherit;">. "Install" this by downloading and extracting the zip file. Run auxsetup.exe to perform some basic setup. Then create a shortcut for "VirtualDub.exe" and place it somewhere convenient. </span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">You'll need an MP4 encoder if you want to finish uploading to YouTube before strange hair starts growing out of your ears. You may already have one -- the Windows DLL required is </span><span class="Apple-style-span" style="font-family: inherit;">mpg4c32.dll</span><span class="Apple-style-span" style="font-family: inherit;">. I had a hard time naviagating the Windows Media download site at Microsoft's site, but I found what I needed by running the installer at </span><span class="Apple-style-span" style="font-family: inherit;">http://www.freepctech.net/files001/wmtools-comp.zip</span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">Open the video file generated during your CamStudio session.</span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">Use VirtualDub to delete sections of the video as needed. "Set selection start" and "Set selection end" under the edit menu are your friends here.</span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">Set your compression to mpeg 4 in Video->Video Compression.</span></li>
<li>File -> Save As AVI to finish up.</li>
</ol>Anonymoushttp://www.blogger.com/profile/04935401188654725995noreply@blogger.com183tag:blogger.com,1999:blog-1299395948776749596.post-23568638035367333772010-04-02T03:16:00.000-07:002010-04-02T03:18:14.031-07:00Basing the Business on Cloud ComputingSometime in late 2008, the team here at Fuery Solutions made the decision to base the future of our business on software-as-a-service products targeted at legal professionals.<br />
<div><br />
</div><div><a href="https://meruscase.com/">MerusCase</a>, the first of what may become a suite of products, is focused on Workers Compensation attorenys in California. For a variety of reasons, MerusCase is a web-based, "<a href="http://en.wikipedia.org/wiki/Software_as_a_service">software as a service</a>" (SaaS) application running entirely on the infrastructure provided by Amazon Web Services. Our salespeople and partners like to refer to this as "operating in the cloud" because the concept of "cloud computing" is mentioned every 12 seconds on MSNBC these days.</div><div><br />
</div><div>That's all true, and indeed, my recent post on <a href="http://blog.fuery.com/2009/12/eating-our-own-dog-food-moving.html">practicing what we preach</a> with regard to moving our own infrastructure, data, and operations to web-based services (the "cloud") echoes this online-centric paradigm. (I should note, with all due respect, this is quite a bit harder for us as developers and data crunchers -- we have to deal with a wide variety of platforms, disparate customer data, and other such hassles. It would be such a relief to have to worry only about Word Docs, PDFs, and email! :-)</div><div><br />
</div><div>In reality, MerusCase is a software product sold as a service (SaaS again) that leverages the cloud computing infrastructure offered by Amazon Web Services. Fuery Solutions is therefore not a "cloud computing" provider per se; we're merely building and selling a product that happens to "run in the cloud".</div><div><br />
</div><div>One of the objections I've run into here and there in the sales process is "security". I've placed the term in quotes because often the word is used to encompass a wide variety of opinions, many of which are based more in emotion than in technical concern. What my future customers are really bringing up is the feeling that they may lose control of their data. There is comfort for a great many folks in seeing a black box in the corner that (hopefully) contains all of their data. In response, I usually point out the following:</div><div><ul><li>MerusCase has to stand up to the internet. That means I'm thinking about crazy Ph.D. hackers in Russia who live on four bucks a day and have a bone to pick. Your little Windows 2003 server in the poorly ventilated closet adjacent to your office has to contend with your ex-wife and that receptionist you canned six months ago. Suffice it to say that your security model can be one of obfuscation -- your server is secure because no one knows it is there. MerusCase is secure because it uses published and proven security models. (The end-to-end communication is 128-bit SSL encoded, like your online banking system, and sensitive data in the database is encoded using unique data from your firm meta information, subsequently 256-bit SHA_1 hashed with said dynamic key, different for every single client, and stored in a database that is only accessible from the MerusCase web server infrastructure. We built the damn thing and schmoozing you into giving me your password would be easier than trying to crack that mess). If you trust your credit card with Amazon, you can trust your data with <a href="https://meruscase.com/">MerusCase</a>. Security is not based on luck or lack of knowledge; true <i>security</i> is telling criminals exactly how your lock works and knowing it is not worth the effort to attempt a breach.</li>
<li>Downtime of your local server is absolutely, without a doubt, higher than MerusCase. Those two days last June when you had to wait for your IT fellow to arrive, run to Best Buy, and install an new drive in your server, then restore your data imperfectly from backups? It might not be top of mind, but it happened. And if it didn't, you were lucky. 2010 may not be so fortunate a year. In contrast, data in MerusCase might be compromised in the event of a nuclear war. Companies a lot bigger than Fuery Solutions are running hundreds of millions of transactions per day on the same infrastructure. Now, would you rather trust the single hard drive platter in your little black box, or would you rather take advantage of the <a href="http://cloudscaling.com/blog/cloud-computing/amazons-ec2-generating-220m-annually">40,000 servers</a> (in October 2009) that make up the Amazon "cloud"?</li>
<li>Worries about the internet connection in your office are easily mitigated. A secondary internet connection for redundancy will cost less than the annual maintenance fee on your Windows Server license.</li>
<li>The benefits outweigh the costs. Yes, there are concerns because you can't hold the backup tapes in your hand. There is a certain comfort in the tangible, physical qualities of owning your own server. But <a href="http://broadcast.oreilly.com/2010/02/how-much-is-the-fear-of-cloud-security-worth.html">How Much is your Fear Worth?</a> "[Cloud Computing] <span class="Apple-style-span" style="line-height: 14px;"><span class="Apple-style-span" style="font-family: inherit;">presents real security issues, real security opportunities, and red herrings. In most cases the red herrings rule the day... [and after real world number crunching,] <span class="Apple-style-span" style="font-family: inherit;">the system in the cloud is orders of magnitude less expensive than the other options.</span><span class="Apple-style-span" style="font-family: inherit;">"</span></span></span></li>
<li><span class="Apple-style-span" style="line-height: 14px;"><span class="Apple-style-span" style="font-family: inherit;"><span class="Apple-style-span" style="font-family: inherit;">Amazon has spent billions of dollars on their infrastructure. They've paid for a world-class outfit, and they have one. That's why <a href="http://fuery.com/">Fuery Solutions</a> and <a href="http://aws.amazon.com/solutions/case-studies/">hundreds of other companies</a> have chosen to base their businesses on this technology infrastructure. Why not leverage that investment?</span></span></span></li>
<li><span class="Apple-style-span" style="line-height: 14px;">Leveraging the web as a development platform allows us to bring more services to market faster. MerusCase has been updated almost 50 times since it's 1.0 release almost a year ago. Since then, we've added features like batch scanning, integration with Google Maps, synchronization with Google Calendar (and by extension Blackberry, Outlook, and iPhone), and chat-based support. We've backed up the application and data in a directed fashion 500 times and backed it up via automatic snapshot somewhere around 20,000 times. We routinely talk to external web-based services, leverage existing free software, and connect disparate data sources dynamically <i>because we're on the web</i>. We run on iPhone, Droid, and the Mac. We can connect you with your clients and each other more effectively because <i>communication and collaboration are what the internet was built for</i>; it's not an afterthought strapped onto quaint software based on client/server technology developed back when going online meant a Prodigy account. </span></li>
</ul><div><span class="Apple-style-span" style="line-height: 14px;"><span class="Apple-style-span" style="font-size: x-large;">Other Resources of Note</span></span></div><div><ul><li><span class="Apple-style-span" style="line-height: 14px;"><a href="http://s3.amazonaws.com/aws_blog/AWS_Security_Whitepaper_2008_09.pdf">Amazon Web Services Security Whitepaper</a> (9/2009, PDF). If you can make sense of all of this and can readily paraphrase, please send me your resume and salary requirements. :-)</span></li>
<li><span class="Apple-style-span" style="line-height: 14px;"><a href="http://awsmedia.s3.amazonaws.com/pdf/AWS_Security_Whitepaper.pdf">Amazon Web Services Security Overview</a> (11/2009, PDF). Same as above with pretty pictures and less technobabble.</span></li>
</ul></div></div>Anonymoushttp://www.blogger.com/profile/04935401188654725995noreply@blogger.com6tag:blogger.com,1999:blog-1299395948776749596.post-42267906166896737072010-02-04T18:24:00.000-08:002010-02-04T18:29:28.356-08:00MooTools Users: Implement a Hash.sort method<span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: 12px;">I notice that Firefox seems to maintain the order of key:value pairs<span class="Apple-converted-space"> </span>in objects when iterating over them, while Safari and Chrome seem to<span class="Apple-converted-space"> </span>sort the object internally (within their respective JS engines). I<span class="Apple-converted-space"> </span> noticed this especially when making select elements. I store the<span class="Apple-converted-space"> </span>options as an object, then when drawing the page, I iterate over that<span class="Apple-converted-space"> </span> object making option elements.<span class="Apple-converted-space"> </span><br />
For example, I am making a select box that lists users<span class="Apple-converted-space"> </span> alphabetically. Users are identified in the database by an id:<span class="Apple-converted-space"> </span></span></span><br />
<span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: 12px;"><span class="Apple-converted-space"> </span><br />
<span style="font-family: "Courier New",Courier,monospace;">var foo = new Element('select').inject($$('body')[0]);</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> var options = {5082:'User A', 5085:'User B', 5074:'User C'}</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> $H(options).each(function(name,id){</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> new Element('option', {text:name, value:id}).inject(foo);</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /> </span></span><br />
<div class="qt" id="qhide_588762" style="display: block;"><div style="font-family: "Courier New",Courier,monospace;"><span class="Apple-style-span" style="border-collapse: separate; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span class="Apple-style-span" style="font-size: 12px;">});<span class="Apple-converted-space"> </span></span></span><br />
</div></div><span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: 12px;">In Firefox the select box would present users in order: A,B,C, but in<span class="Apple-converted-space"> </span>the others, users would appear in order by id: C,A,B. A neat function<span class="Apple-converted-space"> </span> for tackling this sort of problem would be Hash.sort.<span class="Apple-converted-space"> </span></span></span><br />
<span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: 12px;"><span class="Apple-converted-space"> </span><br />
<span style="font-family: "Courier New",Courier,monospace;">/*</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Function: Hash.sort</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Takes {c:0, a:1, b:2} and returns [{a:1},{b:2},{c:0}]</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> */</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Hash.Implement({</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> sort:function(fn){</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> var out = [],</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> keysToSort = this.getKeys(),</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> m = this.getLength();</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> (typeof fn == 'function') ? keysToSort.sort(fn) : keysToSort.sort();</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> for (var i=0; i<m; i++){</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> var o = {};</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> o[keysToSort[i]] = this[keysToSort[i]];</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> out.push(o);</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> }</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> return out;</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /> </span></span><br />
<div class="qt" id="qhide_588763" style="display: block; font-family: "Courier New",Courier,monospace;"><span class="Apple-style-span" style="border-collapse: separate; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span class="Apple-style-span" style="font-size: 12px;">}<span class="Apple-converted-space"> </span></span></span><br />
<span class="Apple-style-span" style="border-collapse: separate; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span class="Apple-style-span" style="font-size: 12px;">});<span class="Apple-converted-space"> </span></span></span></div><span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: 12px;">____________<span class="Apple-converted-space"> </span></span></span><br />
<span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: 12px;"><span class="Apple-converted-space"> </span><br />
Usage:<span class="Apple-converted-space"> </span></span></span><br />
<span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: 12px;"><span class="Apple-converted-space"> </span><br />
<span style="font-family: "Courier New",Courier,monospace;">$H({'a':1,'z':2,'c':3,'b':4}).sort()</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span></span></span><br />
<span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: 12px;"><span class="Apple-converted-space"> </span><br />
Results In:<span class="Apple-converted-space"> </span></span></span><br />
<span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: 12px;"><span class="Apple-converted-space"> </span><br />
<span style="font-family: "Courier New",Courier,monospace;">[Object { a=1}, Object { b=4}, Object { c=3}, Object { z=2}]</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br />
______________________<span class="Apple-converted-space"> </span></span></span><br />
<span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: 12px;"><span class="Apple-converted-space"> </span><br />
Then our select box routine becomes:<span class="Apple-converted-space"> </span></span></span><br />
<span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: 12px;"><span class="Apple-converted-space"> </span><br />
<span style="font-family: "Courier New",Courier,monospace;">var foo = new Element('select').inject($$('body')[0]);</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> var options = {5082:'User A', 5085:'User B', 5074:'User C'}</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> $H(options).sort().each(function(el){</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> $each(el,function(name, id){</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> new Element('option', {text:name, value:id}).inject(foo);</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> });</span><span class="Apple-converted-space" style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /> </span></span><br />
<div class="qt" id="qhide_588764" style="display: block; font-family: "Courier New",Courier,monospace;"><span class="Apple-style-span" style="border-collapse: separate; color: black; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span class="Apple-style-span" style="font-size: 12px;">});<span class="Apple-converted-space"> </span></span></span></div><span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: 12px;">_______<span class="Apple-converted-space"> </span></span></span><br />
<span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: 12px;"><span class="Apple-converted-space"> </span><br />
Ruby programmers may recognize this method (<a href="http://www.google.com/url?sa=D&q=http://ruby-doc.org/core/&usg=AFQjCNFKaR685tYt2wjQbFehztAjXLfDYA" rel="nofollow" style="color: #0000cc;" target="_blank">http://ruby-doc.org/core/</a><span class="Apple-converted-space"> </span><br />
classes/Hash.html#M002865).<span class="Apple-converted-space"> </span></span></span>Anonymoushttp://www.blogger.com/profile/04935401188654725995noreply@blogger.com3tag:blogger.com,1999:blog-1299395948776749596.post-83439816962019698022010-01-18T16:12:00.000-08:002010-01-18T16:12:11.559-08:00Chomp your PHP for good health.<span style="font-family: 'Lucida Grande'; font-size: small;"><span class="Apple-style-span" style="font-size: 11px;">We had some weird problems in testing one of our applications today. It turned out to be a newline after a ?> tag in a core config php file, so anything being outputted was preceded by a newline. Normally this isn't much of a problem--web browsers don't care that much about whitespace. Pickier clients, however, got thrown off and would complain about data being corrupt.</span></span>Anonymoushttp://www.blogger.com/profile/04935401188654725995noreply@blogger.com5tag:blogger.com,1999:blog-1299395948776749596.post-71862782159688815092010-01-08T16:48:00.000-08:002010-01-08T16:50:28.211-08:00Where Tritek Case Management Stores Passwords and Login InformationIn order to move Tritek users over to MerusCase, the superior case management system, one of my projects has been to reverse engineer and write a migration system for Tritek.<br />
<br />
<div>If you have lost your password or simply would like to hack into Tritek or impersonate someone else, it is easy to find the passwords and logins in plain text in the DATA/ folder that Tritek uses.<br />
<br />
First, if you don't know where to find where Tritek is storing its data tables, open up the executable SETUP1.exe in the XMGMT/ folder. Alternatively, open up DATA/parms.dbf with a DBF (dBASE) viewer (For example DBFView or DBFViewer 2000) -- there is a 'data' column that specifies a file path to your data.<br />
<br />
Now, open up DATA/logins.dbf with your dbf viewer and there are columns for name, password, login dates, and so on. They are all stored in plain text so you won't have to do any password hashing or such.<br />
</div>Anonymoushttp://www.blogger.com/profile/04935401188654725995noreply@blogger.com4tag:blogger.com,1999:blog-1299395948776749596.post-52964724449608321492010-01-08T16:42:00.000-08:002010-01-08T16:43:25.116-08:00Word 2007: How to enable editing on a read-only protected template1. Rename word .docx file to .zip. Unzip with your favorite zip program.<br />
2. Open file (archive)/word/settings.xml in text editor.<br />
3. Change property w:enforcement from "1" to "0" within node that reads something like this:<br />
<br />
<pre><w:documentProtection w:edit="forms" w:enforcement="0" w:cryptProviderType="rsaFull" w:cryptAlgorithmClass="hash" w:cryptAlgorithmType="typeAny" w:cryptAlgorithmSid="4" w:cryptSpinCount="100000" w:hash="KyPJG/+vxA4Let1njKgfCpSvJNc=" w:salt="dDf7X+CaLHLXe/H/1zZMqQ=="/>
</pre><br />
4. Save and close file.<br />
5. Rezip into another archive and rename file with .docx extension.<br />
<br />
Viola!Anonymoushttp://www.blogger.com/profile/04935401188654725995noreply@blogger.com5tag:blogger.com,1999:blog-1299395948776749596.post-70372664776414022042009-12-30T13:24:00.000-08:002009-12-30T13:28:03.038-08:00Brief Review of Office Live's Web Site ToolI've recently investigated Microsoft's Office Live service for Small Business as a possible resource for some of our lower-end customers. Office Live is more or less Microsoft's answer to Google Apps, providing a basic web site (a la Google Sites), online document sharing and collaboration (a la Google Docs), and email (using Hotmail instead of Gmail).<br />
<br />
Here's a site I setup in about 20 minutes (it's a template, no design work):<br />
<a href="http://meruscasesupport.web.officelive.com/">http://meruscasesupport.web.officelive.com</a><br />
<br />
Pros<br />
<br />
<ul><li>The tools are simple, straightforward and intuitive. The user interface is obviously based on Microsoft's desktop applications, and it shows. Remember that the definition of "intuitive" is actually "familiar", so despite the lack of "new and different", this thing works very well for what it is designed to do. </li>
<li>Dare I say it? It's easier to understand what is going on than in Google Sites.</li>
<li>The apps get a helping hand from the desktop versions of Microsoft Office. The experience, again, is better as a result.</li>
</ul><br />
Cons<br />
<br />
<ul><li>It's not completely free. (Google lets you remove the branding; MS doesn't unless you pay.)</li>
<li>You'll never give up Windows and Office this way.</li>
</ul><div>Other notes<br />
</div><div><ul><li>You can't write html. I don't think you can with Google Sites either, but it's worth noting. No mootools, no custom JavaScript.</li>
<li>The WYSIWIG editor for web pages rocks. It's among the best I've seen -- think Frontpage without all the confusing tools that real engineers throw away anyway (If I'm writing JavaScript, give me a text editor, not a markup creator). And it's all on the web, although of course it works best in IE8.</li>
</ul></div>Anonymoushttp://www.blogger.com/profile/04935401188654725995noreply@blogger.com5tag:blogger.com,1999:blog-1299395948776749596.post-58659952969346382472009-12-27T17:38:00.000-08:002009-12-29T17:42:36.474-08:00Eating Our Own Dog Food: Moving Everything to the Cloud<div class="p-con">This post is an extension of internal Fuery Solutions dialog. It’s designed to be an exercise in “Thinking out loud”, here for enrichment, a bit of transparency, and, if nothing else, food for thought.<br />
I recognize that some of the content that follows represents a change in tone of this blog. That’s ok; I think that the benefits of being more open and transparent are worth the possibility of some competitive disadvantage. We fashion ourselves to be a Generation-Y company, and our online presence should reflect that.<br />
<h2>Preliminary Thinking: Tactical (Reactive) Use Cases</h2>Over the past few days of relative idle time (hooray for the holidays), I’ve had some time to ponder some the details of our infrastructure. I started with some of the glaring omissions in our online presence, including, for instance:<br />
<ul><li>Still no side-by-side comparison on <a href="https://meruscase.com/" target="_blank" title="MerusCase: Law Firm Practice Management">MerusCase</a> features with the competition (A1 Law, Abacus, Amicus, Tritek Legal, Med-Legal Perfect Filer, ARS CMPro, etc). We seriously kick all of their asses in our sleep at this point and we should sound that off on high from the heavens.</li>
<li>Still no serious effort into SEO stuff. We rock at this and just need to take the time to do it.</li>
<li><a href="https://meruscase.com/" target="_blank" title="MerusCase: Law Firm Practice Management">MerusCase</a> vs <a href="http://merusware.com/" target="_blank" title="MerusWare: Superior Software for Legal Professionals">MerusWare</a> vs <a href="http://fuerysolutions.com/" target="_blank" title="Fuery Solutions: Custom Software Development">Fuery Solutions</a> vs <a href="http://reallysmartguy.com/" target="_blank" title="Really Smart Guy: Johnny Fuery's Personal Blog">My Personal Blog</a>. WTF? Excepting, of course, for likely irrelevant historical babble in my blog, we’re all basically the same and have only slightly divergent messages. Our online presence should echo that.</li>
<li><a href="http://fuerysolutions.com/" target="_blank" title="Fuery Solutions: Custom Software Development">Fuery Solutions</a> content is a far cry from our core expertise. Yes, it’s all true, but we have some serious in-house expertise on such a wide variety of competencies that the site feels a bit scattered and fails to cover any of them in the depth truly required to demonstrate expertise. For instance, our methodology surrounding JSON-everything, no HTML in an XHR, super-fast client rendering/sorting/drawing of tens of thousands of data points simultaneously is some enterprise-ready jaw dropping goodness. While the future is MerusCase and not growing the consulting business, we should nevertheless brag about this more. We’re doing brilliant stuff in MerusCase that Salesforce.com with its billion engineers isn’t doing.</li>
<li>A lot of this content is living on different servers. Good for PageRank, bad for centralized management. We also have quite a few client web sites floating around in the ether, some on shared hosting, some on dedicated EC2 boxes (that’s a server hosted in the Amazon cloud for you noobs), and some on our production MerusCase infrastructure (also in The Cloud). While this was convenient in our early days — we just installed another copy of whatever piece of infrastructure we needed in an on-demand fashion — it is confusing and represents a fair amount of infrastructure to maintain.</li>
</ul>All of this actually boils down to the last point from a propeller-headed perspective. If we get our infrastructure straight, then the rest will fall into place with relative ease.<br />
<h2>Infra-Who? Or, Why it Comes Down to Eating Your Own Dog Food</h2>The promise of cloud computing is simple: All computing resources, including data storage, number crunching cycles, memory to handle said crunching of said data, and bandwidth to move it all around is gathered and used in an on-demand basis. You need to ramp up capacity for a couple of hours to run some insane computational task? Great, launch your own “sandboxed” resource and fire away.<br />
In the last few months, the MerusCase infrastructure has moved from a “dedicated servers running in the cloud” model closer to true cloud computing. Data is no longer stored local to our web server and then backed up after the fact — now it gets moved to the cloud immediately when a user uploads it. Our apache server can literally be offline, crashed, burning from a nuclear holocaust and data files are still safe. Spin up a clone of our baseline web server AMI (Amazon Machine Instance), and voila, 5 minutes of downtime after said nuclear holocaust. Somehow I think we’ll be worried more about how we’re going to harvest enough bugs to eat, but hey, we sell to attorneys, and they are a detail-oriented bunch.<br />
Our web properties, however, have remained in a state of flux. This is a conundrum every enterprise has had to face at some point in their evolution — the web is dynamic, needs to be fluid, should be updated minute-by-minute, needs to allow for user interaction, etc. Yet engineering teams historically are centrally managed institutions — and with good reason. You let a junior fellow who just joined the team release a piece of code without some verification processes in place and you just might have a broken application released to the wild on your hands. (Social-networking derived approaches like GitHub notwithstanding. Someone at some point with a high level of trust, be it a random fellow with a Lead Engineer title or Almighty Linus himself must “bless” software as it is developed.)<br />
And henceforth came the myriad of Content Management packages. Wordpress, Drupal, Joomla round out the open source database-driven list used by the SMB market. Big commerical vendors also come to mind for the enterprise space, with names like Vignette StoryServer (are they still around?), Autonomy, and Oracle in on the action also. On the flip side, contenders like Google Sites and Microsoft Live Whatever-They-Renamed-It-To-This-Week round out the consumer-driven versions. In a sense, really, Facebook and Myspace are personal content management services; they allow users to post customized content about themselves, their interests, and their relationships. And let us not forget wiki — the open source software behind wikipedia has been downloaded millions of times and is in production on hundreds of thousands of web sites for help articles, topic-specific junior wikipedias, and even <a href="http://www.fuerysolutions.com/services/product-management/" target="_blank" title="Product Mangement by Fuery Solutions">Collaborative Project Management</a>.<br />
The beauty of these systems is that non-geeks can post information and content in a safe, efficient, and de-centralized fashion. The downfall of managing many such sites like we do is that every instance essentially becomes yet another highly available, always on, mobile phone alerting, uptime requiring, bulletproof infrastructure needing pain in the neck. Even aside from client requirements (which we are presumably being paid sooner or later to worry about), our own content requires at least four databases at this point, not including any redundancy, development environments, or staging servers. For < 100 content pages and a few hundred blog posts? Really?<br />
(True, I’m including the MerusCase infrastructure in that count, but really that’s just one database. And even though the uptime of our premiere SaaS product needs to be orders of magnitude higher than any of the blog posts, from an architectural perspective, the goal of simplifying the mess moves me to approach these as a singular problem first, then debate the intricacies later. Besides, even two approaches is better than the umpteen we <em>actually</em> have in production right now. Four is actually a gross understatement.)<br />
Now then, we’ve based our business on cloud computing. We’re slowly moving our best customers to the cloud because it makes things easier for us to maintain, it often presents a cost savings for our consulting customers (all SMB), and it allows us to cheaply outsource tasks like backing up data (both files and databases) who have commoditized that very task on a global scale — a place where Amazon has taken a distinctive early lead that Microsoft and Google will have a difficulty overtaking. But that is another blog post for another day.<br />
Put another way, our goal as a web software manufacturer is aligned with Google’s understated one — all your data, all the time, anywhere, on any device. We just happen to be doing it in a niche way for attorneys and our custom software clients.<br />
And hosting a bunch of different wordpress blogs and other Content Management Systems (off the shelf or otherwise) all over the place is not aligned with that goal. We should not be monitoring backups and upgrading multiple installations of various packages.<br />
So how do we fix it?<br />
<h2>Possible Approaches to Centralizing Management of CMS (Dynamic) Content</h2><ol><li>Multiple Databases be darned. Just put the whole lot into one instance of MySQL Server (Amazon RDS or otherwise) and call it a day. Host everything through one instance of apache. Use the Wordpress <a href="http://wordpress.org/extend/plugins/tantan-s3/" target="_blank">Amazon S3 plugin</a> combined with a series of other standardized plugins (Akismet, Gallery, etc) and work out some magical process through a concerted trial-and-error dance that allows themes to be managed by source control, plugins to be managed by Wordpress Admin, and uploads to flow directly up to Amazon. Repeat this dance for other CMS systems (MediaWiki, etc) in our arsenal. Yeah, that sounds readily scalable and easily reproducible. Not.</li>
<li>Move all content to hosted versions of the same. In essence, outsource to the cloud at an application/user level, not an infrastructure level. Using blogspot for MerusWare News, MerusCase Help, and the Fuery Solutions blog (this one) seems possible, but we’ll lose flexibility (categories and .htaccess redirects seem a likely sacrifice). We may also be unable to shield the hosted source completely (Blogger Profiles will probably be readily apparent, for instance). Wordpress.com is another possibility, but that will cost $15 a year per domain and we’ll encounter similar losses in flexibility.</li>
<li>Host our own MMU (massive multi-user) version of whatever CMS systems we need and add to them as needed. WordPressMU could probably be extended to do whatever we need it to. Then we can scale it as needed. This doesn’t consolidate everything into one place, however, because of the MediaWiki installations floating around out there, not to mention Merus. It would help simplify and be a fun engineering exercise, but this seems like an awful lot of work considering the necessity to still maintain infrastructure for each CMS platform.</li>
<li>Throw some stuff away and consolidate around one CMS. Do we really need all of those wiki installations? Ditto with Wordpress?</li>
<li>#4 combined with #2. Consolidate AND switch to (free or mostly free) hosted services wherever possible.</li>
</ol><h2>My Initial Proposal</h2><ol><li>Move my personal blog to blogspot. Redirect all incoming links to either articles moved to the fuerysolutions.com blog (historic tech articles) or reallysmartguy.com (new personal blog address). Care needs to be taken, because those incoming 2000+ links have a fair amount of value.</li>
<li>Move the fuerysolutions.com blog to blogspot. Host as blog.fuery.com. It’s in our email addresses and has been for a long, long time. It should therefore be our primary domain. Create 301s as appropriate (need to verify this is possible on blogspot or come up with a viable workaround).</li>
<li>Move the static fuerysolutions.com pages (now fuery.com) to source control and host on the MerusCase infrastructure. Change code accordingly to point to the new blog.fuery.com. While we’re at it, we should do a facelift and unify the MerusCase and FS brands a bit.</li>
<li>Literally combine MerusWare News, MerusCase Help, and Fuery Solutions blogs into one content-wise. This is a pain, but the Help articles need editing anyway and it will help unify our message at a detailed level. Differentiate between the siloed content by using Labels (Blogger’s version of Wordpress Categories). Domains should redirect to the appropriate silos — help.meruscase.com, news.meruscase.com, blog.fuery.com (everything).</li>
<li>Throw away merusware.com. All live content pages/links should have a home elsewhere now. (Again, 301′ing as appropriate for SEO love.)</li>
<li>Ignore MediaWiki for now. It’s a big task; let’s come back to it.</li>
</ol><div>Your Thoughts?<br />
</div></div>Anonymoushttp://www.blogger.com/profile/04935401188654725995noreply@blogger.com15tag:blogger.com,1999:blog-1299395948776749596.post-54395148559997353172009-12-16T17:43:00.000-08:002009-12-29T17:46:13.102-08:00Cool Colors for Komodo Edit 5.2.4<div class="p-con">The default font and color schemes for <a href="http://www.activestate.com/komodo_edit/">Komodo Edit</a> were disgusting in my opinion. So I made a scheme that looks like Zend/Eclipse or Mac Textmate. I am using Windows 7 and this .ksf file goes into <br />
C:\Users\Michael\AppData\Roaming\ActiveState\KomodoEdit\5.2\schemes <br />
but for XP it’d probably be like<br />
C:\Documents and Settings\Michael\Application Data\ActiveState\KomodoEdit\5.2\schemes <br />
I installed these extensions and now it is my favorite code editor: ColorTab, JSTreeDrive, Mootools API Catalogs, SQLite Manager.<br />
==============================<br />
<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family: monospace;">Version <span style="color: #339933;">=</span> <span style="color: #cc0000;">4</span>
Booleans <span style="color: #339933;">=</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'caretLineVisible'</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">True</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'preferFixed'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'useSelFore'</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">True</span><span style="color: #009900;">}</span>
CommonStyles <span style="color: #339933;">=</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'attribute name'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">7872391</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'attribute value'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">3100463</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'bracebad'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'back'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">65535</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'bold'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">6579400</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'bracehighlight'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'back'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">16758639</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'bold'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'classes'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9145088</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'comments'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">6908265</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'italic'</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">False</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'control characters'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'back'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">16777215</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'default_fixed'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'back'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">16777215</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'bold'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'eolfilled'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'face'</span><span style="color: #339933;">:</span> <span style="color: #3366cc;">'Consolas'</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'hotspot'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'italic'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'size'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'useFixed'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'default_proportional'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'back'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">16777215</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'bold'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'eolfilled'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'face'</span><span style="color: #339933;">:</span> <span style="color: #3366cc;">'Tahoma'</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'hotspot'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'italic'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'size'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'useFixed'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'fold markers'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'back'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">16777215</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">5592405</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'functions'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9145088</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'identifiers'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'indent guides'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">8421504</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'keywords'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">16711680</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'keywords2'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">7872391</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'linenumbers'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'back'</span><span style="color: #339933;">:</span> None<span style="color: #339933;">,</span> <span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">5592405</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'numbers'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">255</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'operators'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'preprocessor'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">6908265</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'regex'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">25800</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'stderr'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">16711680</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'italic'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'stdin'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'stdout'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'stringeol'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'back'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">10079487</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'eolfilled'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'strings'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">39168</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'tags'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">16724480</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'variables'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span>
LanguageStyles <span style="color: #339933;">=</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'Apache'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'directives'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9145088</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'extensions'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">139</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'ip_addresses'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">6908265</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'parameters'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">7872391</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'C#'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'UUIDs'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'commentdockeyword'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'commentdockeyworderror'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">14483456</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'globalclass'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9145088</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'verbatim'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'C++'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'UUIDs'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'commentdockeyword'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'commentdockeyworderror'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">14483456</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'globalclass'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9145088</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'verbatim'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'CSS'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'compound_document_defaults'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'back'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">13559807</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'ids'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">139</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'important'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9109504</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'tags'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9145088</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'values'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">7872391</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'Diff'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'additionline'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9109504</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'chunkheader'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9145088</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'deletionline'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">139</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'diffline'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">6908265</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'italic'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'fileline'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">7872391</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'italic'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'Django'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'compound_document_defaults'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'back'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">14543103</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'Errors'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'Error lines'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">102</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'hotspot'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'italic'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'HTML'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'attributes'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">102</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'cdata'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9109504</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'compound_document_defaults'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'back'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">16772829</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'IDL'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'UUIDs'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'commentdockeyword'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'commentdockeyworderror'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">14483456</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'globalclass'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9145088</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'verbatim'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'Java'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'UUIDs'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'commentdockeyword'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'commentdockeyworderror'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">14483456</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'globalclass'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9145088</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'verbatim'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'JavaScript'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'UUIDs'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'commentdockeyword'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'commentdockeyworderror'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">14483456</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'compound_document_defaults'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'back'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">65535</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'globalclass'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9145088</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'verbatim'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'Mason'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'compound_document_defaults'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'back'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">14544639</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'PHP'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'identifiers'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">5308416</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'keywords'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">16711680</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'operators'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'strings'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">39168</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'tags'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">16711680</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'variables'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">102</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'Perl'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'compound_document_defaults'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'back'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">16050922</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'here documents'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'bold'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">8594211</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'Python'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'compound_document_defaults'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'back'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">16777173</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'decorators'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">39168</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'RHTML'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'compound_document_defaults'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'back'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">10092543</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'Regex'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'charclass'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">2237106</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'italic'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'charescape'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9145088</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'italic'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'charset_operator'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">7872391</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'size'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">12</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'comment'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">6908265</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'italic'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'default'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'eol'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'groupref'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">2237106</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'italic'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'grouptag'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">7872391</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'size'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">8</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'match_highlight'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'back'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">10092543</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'operator'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">7872391</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'size'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">12</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'quantifier'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'bold'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">16711680</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'size'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">12</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'special'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'bold'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">16711680</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'text'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'Ruby'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'compound_document_defaults'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'back'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">15525631</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'Rx'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'breakpoints'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'back'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">14540253</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'children'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'back'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">14540236</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'default'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'bold'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'parents'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'back'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">13434828</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'Smarty'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'compound_document_defaults'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'back'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">10092543</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'Text'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'XML'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'cdata'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9109504</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'cdata content'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9145088</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'cdata tags'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9109504</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'data'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">2302862</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'declarations'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">3358812</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'entity references'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">2302862</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'pi content'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9145088</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'pi tags'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9109504</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'prolog'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'xpath attributes'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9109504</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'xpath content'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">36095</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'xpath tags'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">11</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'reStructuredText'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'comment'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9616695</span><span style="color: #339933;">,</span> <span style="color: #3366cc;">'italic'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'identifier'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1602765</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'operator'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'fore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">9109504</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'regex'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'bold'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span>
MiscLanguageSettings <span style="color: #339933;">=</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'Django'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'globalSubLanguageBackgroundEnabled'</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">True</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'HTML'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'globalSubLanguageBackgroundEnabled'</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">False</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'JavaScript'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'globalSubLanguageBackgroundEnabled'</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">False</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'Mason'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'globalSubLanguageBackgroundEnabled'</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">True</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'Perl'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'globalSubLanguageBackgroundEnabled'</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">True</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'Ruby'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'globalSubLanguageBackgroundEnabled'</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">True</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span>
Colors <span style="color: #339933;">=</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'bookmarkColor'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">14342664</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'callingLineColor'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">16764159</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'caretFore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'caretLineBack'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">13434879</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'currentLineColor'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">16764108</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'edgeColor'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">15658734</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'foldMarginColor'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">16777215</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'selBack'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">16750899</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'selFore'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">16772846</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'whitespaceColor'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">0</span><span style="color: #009900;">}</span>
Indicators <span style="color: #339933;">=</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'find_highlighting'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'alpha'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">100</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'color'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1110271</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'draw_underneath'</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">True</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'style'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">7</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'linter_error'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'alpha'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">100</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'color'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">255</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'draw_underneath'</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">True</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'style'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'linter_warning'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'alpha'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">10</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'color'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">10223515</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'draw_underneath'</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">True</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'style'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">1</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'soft_characters'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'alpha'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">100</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'color'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">13209</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'draw_underneath'</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">False</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'style'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">6</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'tabstop_current'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'alpha'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">100</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'color'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">3355647</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'draw_underneath'</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">True</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'style'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">7</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'tabstop_pending'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'alpha'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">100</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'color'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">16751001</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'draw_underneath'</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">True</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'style'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">6</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'tag_matching'</span><span style="color: #339933;">:</span> <span style="color: #009900;">{</span><span style="color: #3366cc;">'alpha'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">100</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'color'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">33023</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'draw_underneath'</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">True</span><span style="color: #339933;">,</span>
<span style="color: #3366cc;">'style'</span><span style="color: #339933;">:</span> <span style="color: #cc0000;">7</span><span style="color: #009900;">}</span><span style="color: #009900;">}</span></pre></div></div></div>Anonymoushttp://www.blogger.com/profile/04935401188654725995noreply@blogger.com9tag:blogger.com,1999:blog-1299395948776749596.post-37849432788435699622009-10-08T17:44:00.000-07:002009-12-29T17:44:47.706-08:00Take Our Engineering Quiz!<div class="p-con">It’s hiring time here at Fuery Solutions, and with the help of Craigslist, 10%+ unemployment, and a chipper ad, we have far too many applicants.<br />
As such, we’re asking all of you job hunters to take a quick test.<br />
<div><strong>1. Nuts and Bolts.</strong><br />
</div><br />
<div>See <a href="http://crm.documents.s3.amazonaws.com/crm_comment/15/2009-09-25_1342.png">http://crm.documents.s3.amazonaws.com/crm_comment/15/2009-09-25_1342.png</a><br />
</div><br />
<div>Build any single major UI piece in this screen shot wholly from JavaScript. You can use any framework you wish, but bonus points if you use either only core JS (impressive) or mootools (cuz we use it). You should fashion your own structured data (as if the labels and such were the result of an XHR).<br />
</div><br />
<div>It is perfectly fine to ignore graphical components, like the subtle gradients here and there. Do replace these with approximate solid colors.<br />
</div><br />
<div>In the interests of time, you can develop against a single browser platform. Do note if/where you took this shortcut. Also, you might want to stick with just a single box. It’s just a quickie.<br />
</div><br />
<div><strong>2. Conceptual.</strong><br />
</div><br />
<div>We currently store archived data via the “old-fashioned” way — apache over http on a web server. We want to move to a model where all static content (picture uploaded Word and Acrobat documents) are served directly through Amazon S3, where they are ultimately archived anyway.<br />
</div><br />
<div>Now, serving static content to the public from S3 is easy. The link above does just that! But here’s the clincher — we want to do it and control the access on a per user, per session basis. Keep in mind that these are end users — not technical people who have an AWS account and think of XML when you say the word “soap”. Actually, in a perfect world, we’d be able to control the flow of S3 object data directly through the authentication model we’re already using, which is based in Apache, PHP Sessions, and some other clever app-level logic for the rest (man in the middle attacks and such). How would you approach this problem? What sort of security worries does your solution address? Or not address? Is your solution efficient? Why or why not?<br />
</div><br />
<div><strong>3. Product/UI Design.</strong><br />
</div><br />
<div>One of the problems plaguing any database of contacts is the problem of duplicate contacts. Think about the products you use that have contacts as a data point — your phone, Gmail contacts, Outlook contacts, Facebook, Plaxo, and all the rest. Ponder the de-duplication experiences you’ve personally dealt with. Or, more likely, the experiences you’ve wished for when dealing with this problem yourself.<br />
</div><br />
<div>Within the context of a desktop based application (whether iTunes or Gmail), describe what the ideal user experience would entail and why. Draw a sketch or three and snap an shot with your phone if it helps.<br />
</div><br />
<div>Stuff to think about:<br />
</div><div><ul><li>How much should a de-duping engine verify with you as the end-user?</li>
<li>How intelligent would the engine have to be to fulfill your ideal UI? What might the algorithm requirements (or even better, approach) be?</li>
<li>Do dead contacts go to heaven when they die? (What do you do with extra data? Or, at least, data that you’re not absolutely certain is duplicated?)</li>
</ul></div></div>Anonymoushttp://www.blogger.com/profile/04935401188654725995noreply@blogger.com6tag:blogger.com,1999:blog-1299395948776749596.post-5804892095790155042009-10-05T17:40:00.000-07:002009-12-29T17:45:49.953-08:00Shout Out: Fix for “Cannot Start Outlook. Cannot Open the Outlook Window”<div class="p-con"> This particular issue had been plaguing me for a few days, forcing me to go around it to OWA (the Outlook web interface).<br />
<br />
The solution, found over at <a href="http://electrogeek.com/blog/2009/07/30/cannot-start-microsoft-outlook-cannot-open-the-outlook-window/" target="_blank">ElectroGeek</a>, is to start outlook from the command line with the flag “/resetnavpane”.<br />
<br />
Thanks, ElectroGeek.<br />
</div>Anonymoushttp://www.blogger.com/profile/04935401188654725995noreply@blogger.com4tag:blogger.com,1999:blog-1299395948776749596.post-57779903541010764412009-05-14T17:02:00.000-07:002009-12-29T17:42:09.618-08:00Why doesn’t Mootools have a String.truncate() method?<div class="p-con">I need a quick way to truncate strings! I’m surprised that neither MooTools’ String.js or String.Extras.js has such a method. They have so many super-awesome functions, methods and extensions (I especially love the Date.js extensions!!). Yeah, I really love mootools, and I feel compelled to share with the community. So anyway, I wrote out a simple, straightforward String.truncate() function:<br />
<br />
<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family: monospace;">String.<span style="color: #660066;">implement</span><span style="color: #009900;">(</span><span style="color: #009900;">{</span>
<span style="color: #006600; font-style: italic;">/**
* String.truncate(max, atChar, trail)
*
* ++All parameters are optional.
* @param max = (integer) maximum length of truncated string. Defaults to 100 chars.
* @param atChar = (string) truncate at the last index of this string. If not found, just truncates to max length.
* If null, does not search and truncates to max length.
* @param trail = (string) what you want appended to the end of the returned string
*
* @author Michael Fuery, Fuery Solutions, Inc. http://www.fuerysolutions.com/
*
* +Requires MooTools Core 1.2.2
*/</span>
truncate<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">(</span>max<span style="color: #339933;">,</span> atChar<span style="color: #339933;">,</span> trail<span style="color: #009900;">)</span><span style="color: #009900;">{</span>
<span style="color: #003366; font-weight: bold;">var</span> s <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">trim</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">(</span>s.<span style="color: #660066;">length</span><span style="color: #339933;">&</span>lt<span style="color: #339933;">;</span><span style="color: #cc0000;">1</span><span style="color: #009900;">)</span> <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366cc;">''</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">(</span><span style="color: #339933;">!</span>$defined<span style="color: #009900;">(</span>max<span style="color: #009900;">)</span><span style="color: #009900;">)</span> <span style="color: #003366; font-weight: bold;">var</span> max <span style="color: #339933;">=</span> <span style="color: #cc0000;">100</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">else</span> max <span style="color: #339933;">=</span> max.<span style="color: #660066;">toInt</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">(</span><span style="color: #339933;">!</span>$defined<span style="color: #009900;">(</span>atChar<span style="color: #009900;">)</span><span style="color: #009900;">)</span> <span style="color: #003366; font-weight: bold;">var</span> atChar<span style="color: #339933;">=</span><span style="color: #3366cc;">' '</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// break at space</span>
<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">(</span>atChar <span style="color: #339933;">==</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">)</span> <span style="color: #003366; font-weight: bold;">var</span> atChar<span style="color: #339933;">=</span><span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">(</span><span style="color: #339933;">!</span>$defined<span style="color: #009900;">(</span>trail<span style="color: #009900;">)</span><span style="color: #009900;">)</span> <span style="color: #003366; font-weight: bold;">var</span> trail <span style="color: #339933;">=</span> <span style="color: #3366cc;">'...'</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">(</span>s.<span style="color: #660066;">length</span> <span style="color: #339933;">&</span>gt<span style="color: #339933;">;</span> max<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
<span style="color: #003366; font-weight: bold;">var</span> i<span style="color: #339933;">=</span><span style="color: #cc0000;">0</span><span style="color: #339933;">;</span>
s <span style="color: #339933;">=</span> s.<span style="color: #660066;">slice</span><span style="color: #009900;">(</span><span style="color: #cc0000;">0</span><span style="color: #339933;">,</span>max<span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">(</span>atChar<span style="color: #009900;">)</span><span style="color: #009900;">{</span>
<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">(</span><span style="color: #009900;">(</span>i <span style="color: #339933;">=</span> s.<span style="color: #660066;">lastIndexOf</span><span style="color: #009900;">(</span>atChar<span style="color: #009900;">)</span><span style="color: #009900;">)</span> <span style="color: #339933;">!=</span> <span style="color: #339933;">-</span><span style="color: #cc0000;">1</span><span style="color: #009900;">)</span><span style="color: #009900;">{</span>
s <span style="color: #339933;">=</span> s.<span style="color: #660066;">substring</span><span style="color: #009900;">(</span><span style="color: #cc0000;">0</span><span style="color: #339933;">,</span> i<span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span><span style="color: #000066; font-weight: bold;">else</span><span style="color: #009900;">{</span>
s <span style="color: #339933;">=</span> s.<span style="color: #660066;">substring</span><span style="color: #009900;">(</span><span style="color: #cc0000;">0</span><span style="color: #339933;">,</span> max<span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span>
<span style="color: #009900;">}</span>
s <span style="color: #339933;">+=</span> trail<span style="color: #339933;">;</span>
<span style="color: #009900;">}</span>
<span style="color: #000066; font-weight: bold;">return</span> s<span style="color: #339933;">;</span>
<span style="color: #009900;">}</span>
<span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span></pre></div></div></div>Anonymoushttp://www.blogger.com/profile/04935401188654725995noreply@blogger.com4tag:blogger.com,1999:blog-1299395948776749596.post-69114747138411731292009-05-05T13:30:00.000-07:002009-12-30T13:36:22.959-08:00World Peace via MootoolsMerusCase disposes of A1Law and Tritek using Mootools.<br />
<br />
While I was at it, I created a one line algorthm to solve world peace using our JS framework of choice, Mootools. Yes, we love the moo over here at Fuery Solutions!<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU9Nz0vF2bRs2UOClHpQMVBT7NIXklXNMqkOiCWLRA6QOznKHzYoW_37-95dzkDN3tDwJPEuR3I7ZlEuq4URqiG6LoOdPi-7IB9Y5a6E1wiLkpyA2L9_ZDfZdhRHaVHXK9DU1imNY9Pb4A/s1600-h/0430092116-00-js-soln-to-world-peace.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU9Nz0vF2bRs2UOClHpQMVBT7NIXklXNMqkOiCWLRA6QOznKHzYoW_37-95dzkDN3tDwJPEuR3I7ZlEuq4URqiG6LoOdPi-7IB9Y5a6E1wiLkpyA2L9_ZDfZdhRHaVHXK9DU1imNY9Pb4A/s640/0430092116-00-js-soln-to-world-peace.jpg" /></a><br />
</div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: left;">If you can't quite make out what that says, here's a recap:<br />
</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;"><span style="font-family: 'Courier New', Courier, monospace;">MerusInit = function(){</span><br />
</div><div class="separator" style="clear: both; text-align: left;"><span style="font-family: 'Courier New', Courier, monospace;"> $$('A1Law','Tritek').each(function(e){</span><br />
</div><div class="separator" style="clear: both; text-align: left;"><span style="font-family: 'Courier New', Courier, monospace;"> e.dispose();</span><br />
</div><div class="separator" style="clear: both; text-align: left;"><span style="font-family: 'Courier New', Courier, monospace;"> }</span><br />
</div><div class="separator" style="clear: both; text-align: left;"><span style="font-family: 'Courier New', Courier, monospace;">}</span><br />
</div><div class="separator" style="clear: both; text-align: left;"><span style="font-family: 'Courier New', Courier, monospace;"><br />
</span><br />
</div><div class="separator" style="clear: both; text-align: left;"><span style="font-family: 'Courier New', Courier, monospace;">World.Peace = $$('evil').each(function(e){e.destroy()});</span><br />
</div><div class="separator" style="clear: both; text-align: left;"><span style="font-family: 'Courier New', Courier, monospace;"><br />
</span><br />
</div><div class="separator" style="clear: both; text-align: left;"><span style="font-family: 'Courier New', Courier, monospace;"><br />
</span><br />
</div><div class="separator" style="clear: both; text-align: left;"><span style="font-family: 'Courier New', Courier, monospace;"><br />
</span><br />
</div><div class="separator" style="clear: both; text-align: left;"><span style="font-family: 'Courier New', Courier, monospace;"><br />
</span><br />
</div><div class="separator" style="clear: both; text-align: center;"><br />
</div>Anonymoushttp://www.blogger.com/profile/04935401188654725995noreply@blogger.com15tag:blogger.com,1999:blog-1299395948776749596.post-82836138578526795352009-04-05T13:36:00.000-07:002009-12-30T13:43:02.591-08:00Problem Solved: Windows Update redirecting to GoogleI had a piece of adware installed that seemed to randomly redirect me to various sites I didn’t ask for… sometimes reputable, sometimes offshore viagra. Turns out it also consistently redirected any link to a microsoft update or download site to Google’s English language home page.<br />
<br />
I think the cluprit was Vundo.JC.dll — found this little tidbit of love after running Defender in safe mode. However, even after removal, the redirection continued.<br />
<br />
The clue was that this redirection was consistent, worked in all browsers (or, actually, was broken in all browsers — if it were only broken in Internet Explorer, a “browser helper object” add-in would probably have been the cause), and even returned the wrong address from the command line. After a little digging, I discovered that my DNS settings had been hijacked. That is, the stinking adware changed my DNS settings to point to the publisher’s servers. In this case, the new server settings were 85.255.112.69 and 85.255.112.209. If you see these in your Network configuration, you’ve found your culprit!<br />
<br />
I reset my DNS back to “automatically via DHCP” and all returned to normal. Hooray!Anonymoushttp://www.blogger.com/profile/04935401188654725995noreply@blogger.com1tag:blogger.com,1999:blog-1299395948776749596.post-42216541338120265942009-01-19T14:26:00.000-08:002009-12-30T14:27:03.562-08:00Building Word AddIn UtilitiesWe have a need to build a "Save to (your custom web application)" Add-In for Microsoft Word. This book should help:<br />
<a href="http://www.amazon.com/Mastering-VBA-Microsoft-Office-2007/dp/0470279591" mce_href="http://www.amazon.com/Mastering-VBA-Microsoft-Office-2007/dp/0470279591">Mastering VBA in Microsoft Office 2007</a>Anonymoushttp://www.blogger.com/profile/04935401188654725995noreply@blogger.com0tag:blogger.com,1999:blog-1299395948776749596.post-51685048431554491472009-01-13T15:51:00.000-08:002009-12-30T14:30:22.747-08:00The Unix Epoch Reachs 1234567890 Seconds!On Friday the Thirteenth, February 13, 2009 at 15:31:30 (or 3:31:30 pm) PST, the Unix Epoch count reached 1234567890 seconds! <br />
<br />
My good friend and coworker <a href="http://fuerysolutions.com/about/derek-barnes-software-engineer/">Derek</a> found this website that <a href="http://fuerysolutions.com/about/michael-fuery-solutions-engineer/">Michael</a> was able to get a screenshot of: <a href="http://coolepochcountdown.com/" mce_href="http://coolepochcountdown.com/">http://coolepochcountdown.com/</a>Anonymoushttp://www.blogger.com/profile/04935401188654725995noreply@blogger.com0tag:blogger.com,1999:blog-1299395948776749596.post-31992781220720197002008-11-25T13:52:00.000-08:002009-12-30T13:53:27.432-08:00Bookshelf Additions for NovemberThis month we added these additional resources to the bookshelf in our office:<br />
<ul><li><a href="http://www.amazon.com/Business-Side-Creativity-Complete-Communications/dp/039373207X" mce_href="http://www.amazon.com/Business-Side-Creativity-Complete-Communications/dp/039373207X" target="_blank" title="Business Side of Creativity">The Business Side of Creativity</a>. I read the first edition of this years ago, back when the internet was synonymous with "Netscape". While we're not a design firm, we do, on occasion have to address client "look and feel" desires on occasion -- especially the message on unified branding, measuring effectiveness of a marketing effort, and other such "business sense" type issues.</li>
<li><a href="http://www.amazon.com/High-Performance-Web-Sites-Essential/dp/0596529309" mce_href="http://www.amazon.com/High-Performance-Web-Sites-Essential/dp/0596529309" target="_blank">High Performance Web Sites Essentials</a>. Haven't read it yet. The verdict is still out.</li>
<li><a href="http://www.amazon.com/MooTools-Essentials-JavaScript-Development-Firstpress/dp/1430209836" mce_href="http://www.amazon.com/MooTools-Essentials-JavaScript-Development-Firstpress/dp/1430209836" target="_blank">MooTools Essentials</a>. We know the web-based resources backwards, so we were hoping that this would offer some context and background not obvious via the web. Again, the verdict is still out.</li>
</ul>Anonymoushttp://www.blogger.com/profile/04935401188654725995noreply@blogger.com0tag:blogger.com,1999:blog-1299395948776749596.post-33712311994620413072008-11-13T13:51:00.000-08:002009-12-30T13:52:18.433-08:00The Maiden PostWelcome!<br />
<br />
I'm Johnny Fuery, Principal Engineer here at Fuery Solutions. We've been working on our core message for quite some time -- despite doing web applications for a living, it seems like our own site is never complete. The old cliche about how "a contractor's house is never painted" comes to mind. :-)<br />
<br />
With the birth of this new blog, I, along with the rest of the team here at Fuery Solutions, will be publishing ongoing updates. We hope to go beyond the standard "pseudo press release" model many company-sponsored blogs seem to adhere to, by publishing the occasional technical tip and small business lesson along the obligatory announcements about new content, client successes, and upcoming products.<br />
<br />
Whether you're a casual browser or a long-time customer, I hope you'll find something enriching here. Thanks for visiting.<br />
<br />
Enjoy!Anonymoushttp://www.blogger.com/profile/04935401188654725995noreply@blogger.com1