Rails and SASS

I don’t think people quite understand the beauty and power of SASS (metaprogramming/abstraction layer on top of CSS).

Here is a small portion of a CSS file that is generated by SASS that I use on my personal (LAN) website. As WordPress doesn’t yet feature pretty code snippet tags, I have to use the “Preformatted” style for code — but the code here is too long for this design layout, you must  scroll allllll the way to the right to see all the code (alternatively, I suggest you copy all the text on this page and paste it into your text editor to get a real world feel on the sheer length of the code). I can’t help but marvel at the seemingly insane complexity of this VALID, working CSS code:

#article_body_unique .b_c_padding_bottom table.bullet, #article_body_unique .ph1b table.bullet, #article_body_unique .ph2b table.bullet, #article_body_unique .ph3b table.bullet, #article_body_unique .ph4b table.bullet, #article_body_unique .ph5b table.bullet, #article_body_unique .ph6b table.bullet, #article_body_unique .ph7b table.bullet, #article_body_unique .ph8b table.bullet, #article_body_unique .ph9b table.bullet, #article_body_unique .ph1c table.bullet, #article_body_unique .ph2c table.bullet, #article_body_unique .ph3c table.bullet, #article_body_unique .ph4c table.bullet, #article_body_unique .ph5c table.bullet, #article_body_unique .ph6c table.bullet, #article_body_unique .ph7c table.bullet, #article_body_unique .ph8c table.bullet, #article_body_unique .ph9c table.bullet, #article_body_unique .ph1d table.bullet, #article_body_unique .ph2d table.bullet, #article_body_unique .ph3d table.bullet, #article_body_unique .ph4d table.bullet, #article_body_unique .ph5d table.bullet, #article_body_unique .ph6d table.bullet, #article_body_unique .ph7d table.bullet, #article_body_unique .ph8d table.bullet, #article_body_unique .ph9d table.bullet, #article_body_unique .ph1e table.bullet, #article_body_unique .ph2e table.bullet, #article_body_unique .ph3e table.bullet, #article_body_unique .ph4e table.bullet, #article_body_unique .ph5e table.bullet, #article_body_unique .ph6e table.bullet, #article_body_unique .ph7e table.bullet, #article_body_unique .ph8e table.bullet, #article_body_unique .ph9e table.bullet, #article_body_unique .ph1f table.bullet, #article_body_unique .ph2f table.bullet, #article_body_unique .ph3f table.bullet, #article_body_unique .ph4f table.bullet, #article_body_unique .ph5f table.bullet, #article_body_unique .ph6f table.bullet, #article_body_unique .ph7f table.bullet, #article_body_unique .ph8f table.bullet, #article_body_unique .ph9f table.bullet {
  padding-left: 0.9em; }
#article_body_unique .b_c_padding_bottom table.bullet2, #article_body_unique .ph1b table.bullet2, #article_body_unique .ph2b table.bullet2, #article_body_unique .ph3b table.bullet2, #article_body_unique .ph4b table.bullet2, #article_body_unique .ph5b table.bullet2, #article_body_unique .ph6b table.bullet2, #article_body_unique .ph7b table.bullet2, #article_body_unique .ph8b table.bullet2, #article_body_unique .ph9b table.bullet2, #article_body_unique .ph1c table.bullet2, #article_body_unique .ph2c table.bullet2, #article_body_unique .ph3c table.bullet2, #article_body_unique .ph4c table.bullet2, #article_body_unique .ph5c table.bullet2, #article_body_unique .ph6c table.bullet2, #article_body_unique .ph7c table.bullet2, #article_body_unique .ph8c table.bullet2, #article_body_unique .ph9c table.bullet2, #article_body_unique .ph1d table.bullet2, #article_body_unique .ph2d table.bullet2, #article_body_unique .ph3d table.bullet2, #article_body_unique .ph4d table.bullet2, #article_body_unique .ph5d table.bullet2, #article_body_unique .ph6d table.bullet2, #article_body_unique .ph7d table.bullet2, #article_body_unique .ph8d table.bullet2, #article_body_unique .ph9d table.bullet2, #article_body_unique .ph1e table.bullet2, #article_body_unique .ph2e table.bullet2, #article_body_unique .ph3e table.bullet2, #article_body_unique .ph4e table.bullet2, #article_body_unique .ph5e table.bullet2, #article_body_unique .ph6e table.bullet2, #article_body_unique .ph7e table.bullet2, #article_body_unique .ph8e table.bullet2, #article_body_unique .ph9e table.bullet2, #article_body_unique .ph1f table.bullet2, #article_body_unique .ph2f table.bullet2, #article_body_unique .ph3f table.bullet2, #article_body_unique .ph4f table.bullet2, #article_body_unique .ph5f table.bullet2, #article_body_unique .ph6f table.bullet2, #article_body_unique .ph7f table.bullet2, #article_body_unique .ph8f table.bullet2, #article_body_unique .ph9f table.bullet2 {
  padding-left: 1.8em; }
#article_body_unique .b_c_padding_bottom table.bullet3, #article_body_unique .ph1b table.bullet3, #article_body_unique .ph2b table.bullet3, #article_body_unique .ph3b table.bullet3, #article_body_unique .ph4b table.bullet3, #article_body_unique .ph5b table.bullet3, #article_body_unique .ph6b table.bullet3, #article_body_unique .ph7b table.bullet3, #article_body_unique .ph8b table.bullet3, #article_body_unique .ph9b table.bullet3, #article_body_unique .ph1c table.bullet3, #article_body_unique .ph2c table.bullet3, #article_body_unique .ph3c table.bullet3, #article_body_unique .ph4c table.bullet3, #article_body_unique .ph5c table.bullet3, #article_body_unique .ph6c table.bullet3, #article_body_unique .ph7c table.bullet3, #article_body_unique .ph8c table.bullet3, #article_body_unique .ph9c table.bullet3, #article_body_unique .ph1d table.bullet3, #article_body_unique .ph2d table.bullet3, #article_body_unique .ph3d table.bullet3, #article_body_unique .ph4d table.bullet3, #article_body_unique .ph5d table.bullet3, #article_body_unique .ph6d table.bullet3, #article_body_unique .ph7d table.bullet3, #article_body_unique .ph8d table.bullet3, #article_body_unique .ph9d table.bullet3, #article_body_unique .ph1e table.bullet3, #article_body_unique .ph2e table.bullet3, #article_body_unique .ph3e table.bullet3, #article_body_unique .ph4e table.bullet3, #article_body_unique .ph5e table.bullet3, #article_body_unique .ph6e table.bullet3, #article_body_unique .ph7e table.bullet3, #article_body_unique .ph8e table.bullet3, #article_body_unique .ph9e table.bullet3, #article_body_unique .ph1f table.bullet3, #article_body_unique .ph2f table.bullet3, #article_body_unique .ph3f table.bullet3, #article_body_unique .ph4f table.bullet3, #article_body_unique .ph5f table.bullet3, #article_body_unique .ph6f table.bullet3, #article_body_unique .ph7f table.bullet3, #article_body_unique .ph8f table.bullet3, #article_body_unique .ph9f table.bullet3 {
  padding-left: 2.7em; }
#article_body_unique .b_c_padding_bottom table.bullet4, #article_body_unique .ph1b table.bullet4, #article_body_unique .ph2b table.bullet4, #article_body_unique .ph3b table.bullet4, #article_body_unique .ph4b table.bullet4, #article_body_unique .ph5b table.bullet4, #article_body_unique .ph6b table.bullet4, #article_body_unique .ph7b table.bullet4, #article_body_unique .ph8b table.bullet4, #article_body_unique .ph9b table.bullet4, #article_body_unique .ph1c table.bullet4, #article_body_unique .ph2c table.bullet4, #article_body_unique .ph3c table.bullet4, #article_body_unique .ph4c table.bullet4, #article_body_unique .ph5c table.bullet4, #article_body_unique .ph6c table.bullet4, #article_body_unique .ph7c table.bullet4, #article_body_unique .ph8c table.bullet4, #article_body_unique .ph9c table.bullet4, #article_body_unique .ph1d table.bullet4, #article_body_unique .ph2d table.bullet4, #article_body_unique .ph3d table.bullet4, #article_body_unique .ph4d table.bullet4, #article_body_unique .ph5d table.bullet4, #article_body_unique .ph6d table.bullet4, #article_body_unique .ph7d table.bullet4, #article_body_unique .ph8d table.bullet4, #article_body_unique .ph9d table.bullet4, #article_body_unique .ph1e table.bullet4, #article_body_unique .ph2e table.bullet4, #article_body_unique .ph3e table.bullet4, #article_body_unique .ph4e table.bullet4, #article_body_unique .ph5e table.bullet4, #article_body_unique .ph6e table.bullet4, #article_body_unique .ph7e table.bullet4, #article_body_unique .ph8e table.bullet4, #article_body_unique .ph9e table.bullet4, #article_body_unique .ph1f table.bullet4, #article_body_unique .ph2f table.bullet4, #article_body_unique .ph3f table.bullet4, #article_body_unique .ph4f table.bullet4, #article_body_unique .ph5f table.bullet4, #article_body_unique .ph6f table.bullet4, #article_body_unique .ph7f table.bullet4, #article_body_unique .ph8f table.bullet4, #article_body_unique .ph9f table.bullet4 {
  padding-left: 3.6em; }
#article_body_unique .b_c_padding_bottom .divbox .divbox_note_text p, #article_body_unique .b_c_padding_bottom .divbox .divbox_example_text p, #article_body_unique .b_c_padding_bottom .divbox .divbox_warning_text p, #article_body_unique .ph1b .divbox .divbox_note_text p, #article_body_unique .ph1b .divbox .divbox_example_text p, #article_body_unique .ph1b .divbox .divbox_warning_text p, #article_body_unique .ph2b .divbox .divbox_note_text p, #article_body_unique .ph2b .divbox .divbox_example_text p, #article_body_unique .ph2b .divbox .divbox_warning_text p, #article_body_unique .ph3b .divbox .divbox_note_text p, #article_body_unique .ph3b .divbox .divbox_example_text p, #article_body_unique .ph3b .divbox .divbox_warning_text p, #article_body_unique .ph4b .divbox .divbox_note_text p, #article_body_unique .ph4b .divbox .divbox_example_text p, #article_body_unique .ph4b .divbox .divbox_warning_text p, #article_body_unique .ph5b .divbox .divbox_note_text p, #article_body_unique .ph5b .divbox .divbox_example_text p, #article_body_unique .ph5b .divbox .divbox_warning_text p, #article_body_unique .ph6b .divbox .divbox_note_text p, #article_body_unique .ph6b .divbox .divbox_example_text p, #article_body_unique .ph6b .divbox .divbox_warning_text p, #article_body_unique .ph7b .divbox .divbox_note_text p, #article_body_unique .ph7b .divbox .divbox_example_text p, #article_body_unique .ph7b .divbox .divbox_warning_text p, #article_body_unique .ph8b .divbox .divbox_note_text p, #article_body_unique .ph8b .divbox .divbox_example_text p, #article_body_unique .ph8b .divbox .divbox_warning_text p, #article_body_unique .ph9b .divbox .divbox_note_text p, #article_body_unique .ph9b .divbox .divbox_example_text p, #article_body_unique .ph9b .divbox .divbox_warning_text p, #article_body_unique .ph1c .divbox .divbox_note_text p, #article_body_unique .ph1c .divbox .divbox_example_text p, #article_body_unique .ph1c .divbox .divbox_warning_text p, #article_body_unique .ph2c .divbox .divbox_note_text p, #article_body_unique .ph2c .divbox .divbox_example_text p, #article_body_unique .ph2c .divbox .divbox_warning_text p, #article_body_unique .ph3c .divbox .divbox_note_text p, #article_body_unique .ph3c .divbox .divbox_example_text p, #article_body_unique .ph3c .divbox .divbox_warning_text p, #article_body_unique .ph4c .divbox .divbox_note_text p, #article_body_unique .ph4c .divbox .divbox_example_text p, #article_body_unique .ph4c .divbox .divbox_warning_text p, #article_body_unique .ph5c .divbox .divbox_note_text p, #article_body_unique .ph5c .divbox .divbox_example_text p, #article_body_unique .ph5c .divbox .divbox_warning_text p, #article_body_unique .ph6c .divbox .divbox_note_text p, #article_body_unique .ph6c .divbox .divbox_example_text p, #article_body_unique .ph6c .divbox .divbox_warning_text p, #article_body_unique .ph7c .divbox .divbox_note_text p, #article_body_unique .ph7c .divbox .divbox_example_text p, #article_body_unique .ph7c .divbox .divbox_warning_text p, #article_body_unique .ph8c .divbox .divbox_note_text p, #article_body_unique .ph8c .divbox .divbox_example_text p, #article_body_unique .ph8c .divbox .divbox_warning_text p, #article_body_unique .ph9c .divbox .divbox_note_text p, #article_body_unique .ph9c .divbox .divbox_example_text p, #article_body_unique .ph9c .divbox .divbox_warning_text p, #article_body_unique .ph1d .divbox .divbox_note_text p, #article_body_unique .ph1d .divbox .divbox_example_text p, #article_body_unique .ph1d .divbox .divbox_warning_text p, #article_body_unique .ph2d .divbox .divbox_note_text p, #article_body_unique .ph2d .divbox .divbox_example_text p, #article_body_unique .ph2d .divbox .divbox_warning_text p, #article_body_unique .ph3d .divbox .divbox_note_text p, #article_body_unique .ph3d .divbox .divbox_example_text p, #article_body_unique .ph3d .divbox .divbox_warning_text p, #article_body_unique .ph4d .divbox .divbox_note_text p, #article_body_unique .ph4d .divbox .divbox_example_text p, #article_body_unique .ph4d .divbox .divbox_warning_text p, #article_body_unique .ph5d .divbox .divbox_note_text p, #article_body_unique .ph5d .divbox .divbox_example_text p, #article_body_unique .ph5d .divbox .divbox_warning_text p, #article_body_unique .ph6d .divbox .divbox_note_text p, #article_body_unique .ph6d .divbox .divbox_example_text p, #article_body_unique .ph6d .divbox .divbox_warning_text p, #article_body_unique .ph7d .divbox .divbox_note_text p, #article_body_unique .ph7d .divbox .divbox_example_text p, #article_body_unique .ph7d .divbox .divbox_warning_text p, #article_body_unique .ph8d .divbox .divbox_note_text p, #article_body_unique .ph8d .divbox .divbox_example_text p, #article_body_unique .ph8d .divbox .divbox_warning_text p, #article_body_unique .ph9d .divbox .divbox_note_text p, #article_body_unique .ph9d .divbox .divbox_example_text p, #article_body_unique .ph9d .divbox .divbox_warning_text p, #article_body_unique .ph1e .divbox .divbox_note_text p, #article_body_unique .ph1e .divbox .divbox_example_text p, #article_body_unique .ph1e .divbox .divbox_warning_text p, #article_body_unique .ph2e .divbox .divbox_note_text p, #article_body_unique .ph2e .divbox .divbox_example_text p, #article_body_unique .ph2e .divbox .divbox_warning_text p, #article_body_unique .ph3e .divbox .divbox_note_text p, #article_body_unique .ph3e .divbox .divbox_example_text p, #article_body_unique .ph3e .divbox .divbox_warning_text p, #article_body_unique .ph4e .divbox .divbox_note_text p, #article_body_unique .ph4e .divbox .divbox_example_text p, #article_body_unique .ph4e .divbox .divbox_warning_text p, #article_body_unique .ph5e .divbox .divbox_note_text p, #article_body_unique .ph5e .divbox .divbox_example_text p, #article_body_unique .ph5e .divbox .divbox_warning_text p, #article_body_unique .ph6e .divbox .divbox_note_text p, #article_body_unique .ph6e .divbox .divbox_example_text p, #article_body_unique .ph6e .divbox .divbox_warning_text p, #article_body_unique .ph7e .divbox .divbox_note_text p, #article_body_unique .ph7e .divbox .divbox_example_text p, #article_body_unique .ph7e .divbox .divbox_warning_text p, #article_body_unique .ph8e .divbox .divbox_note_text p, #article_body_unique .ph8e .divbox .divbox_example_text p, #article_body_unique .ph8e .divbox .divbox_warning_text p, #article_body_unique .ph9e .divbox .divbox_note_text p, #article_body_unique .ph9e .divbox .divbox_example_text p, #article_body_unique .ph9e .divbox .divbox_warning_text p, #article_body_unique .ph1f .divbox .divbox_note_text p, #article_body_unique .ph1f .divbox .divbox_example_text p, #article_body_unique .ph1f .divbox .divbox_warning_text p, #article_body_unique .ph2f .divbox .divbox_note_text p, #article_body_unique .ph2f .divbox .divbox_example_text p, #article_body_unique .ph2f .divbox .divbox_warning_text p, #article_body_unique .ph3f .divbox .divbox_note_text p, #article_body_unique .ph3f .divbox .divbox_example_text p, #article_body_unique .ph3f .divbox .divbox_warning_text p, #article_body_unique .ph4f .divbox .divbox_note_text p, #article_body_unique .ph4f .divbox .divbox_example_text p, #article_body_unique .ph4f .divbox .divbox_warning_text p, #article_body_unique .ph5f .divbox .divbox_note_text p, #article_body_unique .ph5f .divbox .divbox_example_text p, #article_body_unique .ph5f .divbox .divbox_warning_text p, #article_body_unique .ph6f .divbox .divbox_note_text p, #article_body_unique .ph6f .divbox .divbox_example_text p, #article_body_unique .ph6f .divbox .divbox_warning_text p, #article_body_unique .ph7f .divbox .divbox_note_text p, #article_body_unique .ph7f .divbox .divbox_example_text p, #article_body_unique .ph7f .divbox .divbox_warning_text p, #article_body_unique .ph8f .divbox .divbox_note_text p, #article_body_unique .ph8f .divbox .divbox_example_text p, #article_body_unique .ph8f .divbox .divbox_warning_text p, #article_body_unique .ph9f .divbox .divbox_note_text p, #article_body_unique .ph9f .divbox .divbox_example_text p, #article_body_unique .ph9f .divbox .divbox_warning_text p {
  padding-left: 5px; }
#article_body_unique .b_c_padding_bottom .divbox .divbox_note_text table.bullet, #article_body_unique .b_c_padding_bottom .divbox .divbox_example_text table.bullet, #article_body_unique .b_c_padding_bottom .divbox .divbox_warning_text table.bullet, #article_body_unique .ph1b .divbox .divbox_note_text table.bullet, #article_body_unique .ph1b .divbox .divbox_example_text table.bullet, #article_body_unique .ph1b .divbox .divbox_warning_text table.bullet, #article_body_unique .ph2b .divbox .divbox_note_text table.bullet, #article_body_unique .ph2b .divbox .divbox_example_text table.bullet, #article_body_unique .ph2b .divbox .divbox_warning_text table.bullet, #article_body_unique .ph3b .divbox .divbox_note_text table.bullet, #article_body_unique .ph3b .divbox .divbox_example_text table.bullet, #article_body_unique .ph3b .divbox .divbox_warning_text table.bullet, #article_body_unique .ph4b .divbox .divbox_note_text table.bullet, #article_body_unique .ph4b .divbox .divbox_example_text table.bullet, #article_body_unique .ph4b .divbox .divbox_warning_text table.bullet, #article_body_unique .ph5b .divbox .divbox_note_text table.bullet, #article_body_unique .ph5b .divbox .divbox_example_text table.bullet, #article_body_unique .ph5b .divbox .divbox_warning_text table.bullet, #article_body_unique .ph6b .divbox .divbox_note_text table.bullet, #article_body_unique .ph6b .divbox .divbox_example_text table.bullet, #article_body_unique .ph6b .divbox .divbox_warning_text table.bullet, #article_body_unique .ph7b .divbox .divbox_note_text table.bullet, #article_body_unique .ph7b .divbox .divbox_example_text table.bullet, #article_body_unique .ph7b .divbox .divbox_warning_text table.bullet, #article_body_unique .ph8b .divbox .divbox_note_text table.bullet, #article_body_unique .ph8b .divbox .divbox_example_text table.bullet, #article_body_unique .ph8b .divbox .divbox_warning_text table.bullet, #article_body_unique .ph9b .divbox .divbox_note_text table.bullet, #article_body_unique .ph9b .divbox .divbox_example_text table.bullet, #article_body_unique .ph9b .divbox .divbox_warning_text table.bullet, #article_body_unique .ph1c .divbox .divbox_note_text table.bullet, #article_body_unique .ph1c .divbox .divbox_example_text table.bullet, #article_body_unique .ph1c .divbox .divbox_warning_text table.bullet, #article_body_unique .ph2c .divbox .divbox_note_text table.bullet, #article_body_unique .ph2c .divbox .divbox_example_text table.bullet, #article_body_unique .ph2c .divbox .divbox_warning_text table.bullet, #article_body_unique .ph3c .divbox .divbox_note_text table.bullet, #article_body_unique .ph3c .divbox .divbox_example_text table.bullet, #article_body_unique .ph3c .divbox .divbox_warning_text table.bullet, #article_body_unique .ph4c .divbox .divbox_note_text table.bullet, #article_body_unique .ph4c .divbox .divbox_example_text table.bullet, #article_body_unique .ph4c .divbox .divbox_warning_text table.bullet, #article_body_unique .ph5c .divbox .divbox_note_text table.bullet, #article_body_unique .ph5c .divbox .divbox_example_text table.bullet, #article_body_unique .ph5c .divbox .divbox_warning_text table.bullet, #article_body_unique .ph6c .divbox .divbox_note_text table.bullet, #article_body_unique .ph6c .divbox .divbox_example_text table.bullet, #article_body_unique .ph6c .divbox .divbox_warning_text table.bullet, #article_body_unique .ph7c .divbox .divbox_note_text table.bullet, #article_body_unique .ph7c .divbox .divbox_example_text table.bullet, #article_body_unique .ph7c .divbox .divbox_warning_text table.bullet, #article_body_unique .ph8c .divbox .divbox_note_text table.bullet, #article_body_unique .ph8c .divbox .divbox_example_text table.bullet, #article_body_unique .ph8c .divbox .divbox_warning_text table.bullet, #article_body_unique .ph9c .divbox .divbox_note_text table.bullet, #article_body_unique .ph9c .divbox .divbox_example_text table.bullet, #article_body_unique .ph9c .divbox .divbox_warning_text table.bullet, #article_body_unique .ph1d .divbox .divbox_note_text table.bullet, #article_body_unique .ph1d .divbox .divbox_example_text table.bullet, #article_body_unique .ph1d .divbox .divbox_warning_text table.bullet, #article_body_unique .ph2d .divbox .divbox_note_text table.bullet, #article_body_unique .ph2d .divbox .divbox_example_text table.bullet, #article_body_unique .ph2d .divbox .divbox_warning_text table.bullet, #article_body_unique .ph3d .divbox .divbox_note_text table.bullet, #article_body_unique .ph3d .divbox .divbox_example_text table.bullet, #article_body_unique .ph3d .divbox .divbox_warning_text table.bullet, #article_body_unique .ph4d .divbox .divbox_note_text table.bullet, #article_body_unique .ph4d .divbox .divbox_example_text table.bullet, #article_body_unique .ph4d .divbox .divbox_warning_text table.bullet, #article_body_unique .ph5d .divbox .divbox_note_text table.bullet, #article_body_unique .ph5d .divbox .divbox_example_text table.bullet, #article_body_unique .ph5d .divbox .divbox_warning_text table.bullet, #article_body_unique .ph6d .divbox .divbox_note_text table.bullet, #article_body_unique .ph6d .divbox .divbox_example_text table.bullet, #article_body_unique .ph6d .divbox .divbox_warning_text table.bullet, #article_body_unique .ph7d .divbox .divbox_note_text table.bullet, #article_body_unique .ph7d .divbox .divbox_example_text table.bullet, #article_body_unique .ph7d .divbox .divbox_warning_text table.bullet, #article_body_unique .ph8d .divbox .divbox_note_text table.bullet, #article_body_unique .ph8d .divbox .divbox_example_text table.bullet, #article_body_unique .ph8d .divbox .divbox_warning_text table.bullet, #article_body_unique .ph9d .divbox .divbox_note_text table.bullet, #article_body_unique .ph9d .divbox .divbox_example_text table.bullet, #article_body_unique .ph9d .divbox .divbox_warning_text table.bullet, #article_body_unique .ph1e .divbox .divbox_note_text table.bullet, #article_body_unique .ph1e .divbox .divbox_example_text table.bullet, #article_body_unique .ph1e .divbox .divbox_warning_text table.bullet, #article_body_unique .ph2e .divbox .divbox_note_text table.bullet, #article_body_unique .ph2e .divbox .divbox_example_text table.bullet, #article_body_unique .ph2e .divbox .divbox_warning_text table.bullet, #article_body_unique .ph3e .divbox .divbox_note_text table.bullet, #article_body_unique .ph3e .divbox .divbox_example_text table.bullet, #article_body_unique .ph3e .divbox .divbox_warning_text table.bullet, #article_body_unique .ph4e .divbox .divbox_note_text table.bullet, #article_body_unique .ph4e .divbox .divbox_example_text table.bullet, #article_body_unique .ph4e .divbox .divbox_warning_text table.bullet, #article_body_unique .ph5e .divbox .divbox_note_text table.bullet, #article_body_unique .ph5e .divbox .divbox_example_text table.bullet, #article_body_unique .ph5e .divbox .divbox_warning_text table.bullet, #article_body_unique .ph6e .divbox .divbox_note_text table.bullet, #article_body_unique .ph6e .divbox .divbox_example_text table.bullet, #article_body_unique .ph6e .divbox .divbox_warning_text table.bullet, #article_body_unique .ph7e .divbox .divbox_note_text table.bullet, #article_body_unique .ph7e .divbox .divbox_example_text table.bullet, #article_body_unique .ph7e .divbox .divbox_warning_text table.bullet, #article_body_unique .ph8e .divbox .divbox_note_text table.bullet, #article_body_unique .ph8e .divbox .divbox_example_text table.bullet, #article_body_unique .ph8e .divbox .divbox_warning_text table.bullet, #article_body_unique .ph9e .divbox .divbox_note_text table.bullet, #article_body_unique .ph9e .divbox .divbox_example_text table.bullet, #article_body_unique .ph9e .divbox .divbox_warning_text table.bullet, #article_body_unique .ph1f .divbox .divbox_note_text table.bullet, #article_body_unique .ph1f .divbox .divbox_example_text table.bullet, #article_body_unique .ph1f .divbox .divbox_warning_text table.bullet, #article_body_unique .ph2f .divbox .divbox_note_text table.bullet, #article_body_unique .ph2f .divbox .divbox_example_text table.bullet, #article_body_unique .ph2f .divbox .divbox_warning_text table.bullet, #article_body_unique .ph3f .divbox .divbox_note_text table.bullet, #article_body_unique .ph3f .divbox .divbox_example_text table.bullet, #article_body_unique .ph3f .divbox .divbox_warning_text table.bullet, #article_body_unique .ph4f .divbox .divbox_note_text table.bullet, #article_body_unique .ph4f .divbox .divbox_example_text table.bullet, #article_body_unique .ph4f .divbox .divbox_warning_text table.bullet, #article_body_unique .ph5f .divbox .divbox_note_text table.bullet, #article_body_unique .ph5f .divbox .divbox_example_text table.bullet, #article_body_unique .ph5f .divbox .divbox_warning_text table.bullet, #article_body_unique .ph6f .divbox .divbox_note_text table.bullet, #article_body_unique .ph6f .divbox .divbox_example_text table.bullet, #article_body_unique .ph6f .divbox .divbox_warning_text table.bullet, #article_body_unique .ph7f .divbox .divbox_note_text table.bullet, #article_body_unique .ph7f .divbox .divbox_example_text table.bullet, #article_body_unique .ph7f .divbox .divbox_warning_text table.bullet, #article_body_unique .ph8f .divbox .divbox_note_text table.bullet, #article_body_unique .ph8f .divbox .divbox_example_text table.bullet, #article_body_unique .ph8f .divbox .divbox_warning_text table.bullet, #article_body_unique .ph9f .divbox .divbox_note_text table.bullet, #article_body_unique .ph9f .divbox .divbox_example_text table.bullet, #article_body_unique .ph9f .divbox .divbox_warning_text table.bullet {
  padding-left: 0.9em; }
#article_body_unique .b_c_padding_bottom .divbox .divbox_note_text table.bullet2, #article_body_unique .b_c_padding_bottom .divbox .divbox_example_text table.bullet2, #article_body_unique .b_c_padding_bottom .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph1b .divbox .divbox_note_text table.bullet2, #article_body_unique .ph1b .divbox .divbox_example_text table.bullet2, #article_body_unique .ph1b .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph2b .divbox .divbox_note_text table.bullet2, #article_body_unique .ph2b .divbox .divbox_example_text table.bullet2, #article_body_unique .ph2b .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph3b .divbox .divbox_note_text table.bullet2, #article_body_unique .ph3b .divbox .divbox_example_text table.bullet2, #article_body_unique .ph3b .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph4b .divbox .divbox_note_text table.bullet2, #article_body_unique .ph4b .divbox .divbox_example_text table.bullet2, #article_body_unique .ph4b .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph5b .divbox .divbox_note_text table.bullet2, #article_body_unique .ph5b .divbox .divbox_example_text table.bullet2, #article_body_unique .ph5b .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph6b .divbox .divbox_note_text table.bullet2, #article_body_unique .ph6b .divbox .divbox_example_text table.bullet2, #article_body_unique .ph6b .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph7b .divbox .divbox_note_text table.bullet2, #article_body_unique .ph7b .divbox .divbox_example_text table.bullet2, #article_body_unique .ph7b .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph8b .divbox .divbox_note_text table.bullet2, #article_body_unique .ph8b .divbox .divbox_example_text table.bullet2, #article_body_unique .ph8b .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph9b .divbox .divbox_note_text table.bullet2, #article_body_unique .ph9b .divbox .divbox_example_text table.bullet2, #article_body_unique .ph9b .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph1c .divbox .divbox_note_text table.bullet2, #article_body_unique .ph1c .divbox .divbox_example_text table.bullet2, #article_body_unique .ph1c .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph2c .divbox .divbox_note_text table.bullet2, #article_body_unique .ph2c .divbox .divbox_example_text table.bullet2, #article_body_unique .ph2c .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph3c .divbox .divbox_note_text table.bullet2, #article_body_unique .ph3c .divbox .divbox_example_text table.bullet2, #article_body_unique .ph3c .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph4c .divbox .divbox_note_text table.bullet2, #article_body_unique .ph4c .divbox .divbox_example_text table.bullet2, #article_body_unique .ph4c .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph5c .divbox .divbox_note_text table.bullet2, #article_body_unique .ph5c .divbox .divbox_example_text table.bullet2, #article_body_unique .ph5c .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph6c .divbox .divbox_note_text table.bullet2, #article_body_unique .ph6c .divbox .divbox_example_text table.bullet2, #article_body_unique .ph6c .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph7c .divbox .divbox_note_text table.bullet2, #article_body_unique .ph7c .divbox .divbox_example_text table.bullet2, #article_body_unique .ph7c .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph8c .divbox .divbox_note_text table.bullet2, #article_body_unique .ph8c .divbox .divbox_example_text table.bullet2, #article_body_unique .ph8c .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph9c .divbox .divbox_note_text table.bullet2, #article_body_unique .ph9c .divbox .divbox_example_text table.bullet2, #article_body_unique .ph9c .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph1d .divbox .divbox_note_text table.bullet2, #article_body_unique .ph1d .divbox .divbox_example_text table.bullet2, #article_body_unique .ph1d .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph2d .divbox .divbox_note_text table.bullet2, #article_body_unique .ph2d .divbox .divbox_example_text table.bullet2, #article_body_unique .ph2d .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph3d .divbox .divbox_note_text table.bullet2, #article_body_unique .ph3d .divbox .divbox_example_text table.bullet2, #article_body_unique .ph3d .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph4d .divbox .divbox_note_text table.bullet2, #article_body_unique .ph4d .divbox .divbox_example_text table.bullet2, #article_body_unique .ph4d .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph5d .divbox .divbox_note_text table.bullet2, #article_body_unique .ph5d .divbox .divbox_example_text table.bullet2, #article_body_unique .ph5d .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph6d .divbox .divbox_note_text table.bullet2, #article_body_unique .ph6d .divbox .divbox_example_text table.bullet2, #article_body_unique .ph6d .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph7d .divbox .divbox_note_text table.bullet2, #article_body_unique .ph7d .divbox .divbox_example_text table.bullet2, #article_body_unique .ph7d .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph8d .divbox .divbox_note_text table.bullet2, #article_body_unique .ph8d .divbox .divbox_example_text table.bullet2, #article_body_unique .ph8d .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph9d .divbox .divbox_note_text table.bullet2, #article_body_unique .ph9d .divbox .divbox_example_text table.bullet2, #article_body_unique .ph9d .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph1e .divbox .divbox_note_text table.bullet2, #article_body_unique .ph1e .divbox .divbox_example_text table.bullet2, #article_body_unique .ph1e .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph2e .divbox .divbox_note_text table.bullet2, #article_body_unique .ph2e .divbox .divbox_example_text table.bullet2, #article_body_unique .ph2e .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph3e .divbox .divbox_note_text table.bullet2, #article_body_unique .ph3e .divbox .divbox_example_text table.bullet2, #article_body_unique .ph3e .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph4e .divbox .divbox_note_text table.bullet2, #article_body_unique .ph4e .divbox .divbox_example_text table.bullet2, #article_body_unique .ph4e .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph5e .divbox .divbox_note_text table.bullet2, #article_body_unique .ph5e .divbox .divbox_example_text table.bullet2, #article_body_unique .ph5e .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph6e .divbox .divbox_note_text table.bullet2, #article_body_unique .ph6e .divbox .divbox_example_text table.bullet2, #article_body_unique .ph6e .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph7e .divbox .divbox_note_text table.bullet2, #article_body_unique .ph7e .divbox .divbox_example_text table.bullet2, #article_body_unique .ph7e .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph8e .divbox .divbox_note_text table.bullet2, #article_body_unique .ph8e .divbox .divbox_example_text table.bullet2, #article_body_unique .ph8e .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph9e .divbox .divbox_note_text table.bullet2, #article_body_unique .ph9e .divbox .divbox_example_text table.bullet2, #article_body_unique .ph9e .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph1f .divbox .divbox_note_text table.bullet2, #article_body_unique .ph1f .divbox .divbox_example_text table.bullet2, #article_body_unique .ph1f .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph2f .divbox .divbox_note_text table.bullet2, #article_body_unique .ph2f .divbox .divbox_example_text table.bullet2, #article_body_unique .ph2f .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph3f .divbox .divbox_note_text table.bullet2, #article_body_unique .ph3f .divbox .divbox_example_text table.bullet2, #article_body_unique .ph3f .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph4f .divbox .divbox_note_text table.bullet2, #article_body_unique .ph4f .divbox .divbox_example_text table.bullet2, #article_body_unique .ph4f .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph5f .divbox .divbox_note_text table.bullet2, #article_body_unique .ph5f .divbox .divbox_example_text table.bullet2, #article_body_unique .ph5f .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph6f .divbox .divbox_note_text table.bullet2, #article_body_unique .ph6f .divbox .divbox_example_text table.bullet2, #article_body_unique .ph6f .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph7f .divbox .divbox_note_text table.bullet2, #article_body_unique .ph7f .divbox .divbox_example_text table.bullet2, #article_body_unique .ph7f .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph8f .divbox .divbox_note_text table.bullet2, #article_body_unique .ph8f .divbox .divbox_example_text table.bullet2, #article_body_unique .ph8f .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph9f .divbox .divbox_note_text table.bullet2, #article_body_unique .ph9f .divbox .divbox_example_text table.bullet2, #article_body_unique .ph9f .divbox .divbox_warning_text table.bullet2 {
  padding-left: 1.8em; }
#article_body_unique .b_c_padding_bottom .divbox .divbox_note_text table.bullet3, #article_body_unique .b_c_padding_bottom .divbox .divbox_example_text table.bullet3, #article_body_unique .b_c_padding_bottom .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph1b .divbox .divbox_note_text table.bullet3, #article_body_unique .ph1b .divbox .divbox_example_text table.bullet3, #article_body_unique .ph1b .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph2b .divbox .divbox_note_text table.bullet3, #article_body_unique .ph2b .divbox .divbox_example_text table.bullet3, #article_body_unique .ph2b .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph3b .divbox .divbox_note_text table.bullet3, #article_body_unique .ph3b .divbox .divbox_example_text table.bullet3, #article_body_unique .ph3b .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph4b .divbox .divbox_note_text table.bullet3, #article_body_unique .ph4b .divbox .divbox_example_text table.bullet3, #article_body_unique .ph4b .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph5b .divbox .divbox_note_text table.bullet3, #article_body_unique .ph5b .divbox .divbox_example_text table.bullet3, #article_body_unique .ph5b .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph6b .divbox .divbox_note_text table.bullet3, #article_body_unique .ph6b .divbox .divbox_example_text table.bullet3, #article_body_unique .ph6b .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph7b .divbox .divbox_note_text table.bullet3, #article_body_unique .ph7b .divbox .divbox_example_text table.bullet3, #article_body_unique .ph7b .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph8b .divbox .divbox_note_text table.bullet3, #article_body_unique .ph8b .divbox .divbox_example_text table.bullet3, #article_body_unique .ph8b .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph9b .divbox .divbox_note_text table.bullet3, #article_body_unique .ph9b .divbox .divbox_example_text table.bullet3, #article_body_unique .ph9b .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph1c .divbox .divbox_note_text table.bullet3, #article_body_unique .ph1c .divbox .divbox_example_text table.bullet3, #article_body_unique .ph1c .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph2c .divbox .divbox_note_text table.bullet3, #article_body_unique .ph2c .divbox .divbox_example_text table.bullet3, #article_body_unique .ph2c .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph3c .divbox .divbox_note_text table.bullet3, #article_body_unique .ph3c .divbox .divbox_example_text table.bullet3, #article_body_unique .ph3c .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph4c .divbox .divbox_note_text table.bullet3, #article_body_unique .ph4c .divbox .divbox_example_text table.bullet3, #article_body_unique .ph4c .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph5c .divbox .divbox_note_text table.bullet3, #article_body_unique .ph5c .divbox .divbox_example_text table.bullet3, #article_body_unique .ph5c .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph6c .divbox .divbox_note_text table.bullet3, #article_body_unique .ph6c .divbox .divbox_example_text table.bullet3, #article_body_unique .ph6c .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph7c .divbox .divbox_note_text table.bullet3, #article_body_unique .ph7c .divbox .divbox_example_text table.bullet3, #article_body_unique .ph7c .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph8c .divbox .divbox_note_text table.bullet3, #article_body_unique .ph8c .divbox .divbox_example_text table.bullet3, #article_body_unique .ph8c .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph9c .divbox .divbox_note_text table.bullet3, #article_body_unique .ph9c .divbox .divbox_example_text table.bullet3, #article_body_unique .ph9c .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph1d .divbox .divbox_note_text table.bullet3, #article_body_unique .ph1d .divbox .divbox_example_text table.bullet3, #article_body_unique .ph1d .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph2d .divbox .divbox_note_text table.bullet3, #article_body_unique .ph2d .divbox .divbox_example_text table.bullet3, #article_body_unique .ph2d .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph3d .divbox .divbox_note_text table.bullet3, #article_body_unique .ph3d .divbox .divbox_example_text table.bullet3, #article_body_unique .ph3d .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph4d .divbox .divbox_note_text table.bullet3, #article_body_unique .ph4d .divbox .divbox_example_text table.bullet3, #article_body_unique .ph4d .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph5d .divbox .divbox_note_text table.bullet3, #article_body_unique .ph5d .divbox .divbox_example_text table.bullet3, #article_body_unique .ph5d .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph6d .divbox .divbox_note_text table.bullet3, #article_body_unique .ph6d .divbox .divbox_example_text table.bullet3, #article_body_unique .ph6d .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph7d .divbox .divbox_note_text table.bullet3, #article_body_unique .ph7d .divbox .divbox_example_text table.bullet3, #article_body_unique .ph7d .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph8d .divbox .divbox_note_text table.bullet3, #article_body_unique .ph8d .divbox .divbox_example_text table.bullet3, #article_body_unique .ph8d .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph9d .divbox .divbox_note_text table.bullet3, #article_body_unique .ph9d .divbox .divbox_example_text table.bullet3, #article_body_unique .ph9d .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph1e .divbox .divbox_note_text table.bullet3, #article_body_unique .ph1e .divbox .divbox_example_text table.bullet3, #article_body_unique .ph1e .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph2e .divbox .divbox_note_text table.bullet3, #article_body_unique .ph2e .divbox .divbox_example_text table.bullet3, #article_body_unique .ph2e .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph3e .divbox .divbox_note_text table.bullet3, #article_body_unique .ph3e .divbox .divbox_example_text table.bullet3, #article_body_unique .ph3e .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph4e .divbox .divbox_note_text table.bullet3, #article_body_unique .ph4e .divbox .divbox_example_text table.bullet3, #article_body_unique .ph4e .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph5e .divbox .divbox_note_text table.bullet3, #article_body_unique .ph5e .divbox .divbox_example_text table.bullet3, #article_body_unique .ph5e .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph6e .divbox .divbox_note_text table.bullet3, #article_body_unique .ph6e .divbox .divbox_example_text table.bullet3, #article_body_unique .ph6e .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph7e .divbox .divbox_note_text table.bullet3, #article_body_unique .ph7e .divbox .divbox_example_text table.bullet3, #article_body_unique .ph7e .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph8e .divbox .divbox_note_text table.bullet3, #article_body_unique .ph8e .divbox .divbox_example_text table.bullet3, #article_body_unique .ph8e .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph9e .divbox .divbox_note_text table.bullet3, #article_body_unique .ph9e .divbox .divbox_example_text table.bullet3, #article_body_unique .ph9e .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph1f .divbox .divbox_note_text table.bullet3, #article_body_unique .ph1f .divbox .divbox_example_text table.bullet3, #article_body_unique .ph1f .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph2f .divbox .divbox_note_text table.bullet3, #article_body_unique .ph2f .divbox .divbox_example_text table.bullet3, #article_body_unique .ph2f .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph3f .divbox .divbox_note_text table.bullet3, #article_body_unique .ph3f .divbox .divbox_example_text table.bullet3, #article_body_unique .ph3f .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph4f .divbox .divbox_note_text table.bullet3, #article_body_unique .ph4f .divbox .divbox_example_text table.bullet3, #article_body_unique .ph4f .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph5f .divbox .divbox_note_text table.bullet3, #article_body_unique .ph5f .divbox .divbox_example_text table.bullet3, #article_body_unique .ph5f .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph6f .divbox .divbox_note_text table.bullet3, #article_body_unique .ph6f .divbox .divbox_example_text table.bullet3, #article_body_unique .ph6f .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph7f .divbox .divbox_note_text table.bullet3, #article_body_unique .ph7f .divbox .divbox_example_text table.bullet3, #article_body_unique .ph7f .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph8f .divbox .divbox_note_text table.bullet3, #article_body_unique .ph8f .divbox .divbox_example_text table.bullet3, #article_body_unique .ph8f .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph9f .divbox .divbox_note_text table.bullet3, #article_body_unique .ph9f .divbox .divbox_example_text table.bullet3, #article_body_unique .ph9f .divbox .divbox_warning_text table.bullet3 {
  padding-left: 2.7em; }
#article_body_unique .b_c_padding_bottom .divbox .divbox_note_text table.bullet4, #article_body_unique .b_c_padding_bottom .divbox .divbox_example_text table.bullet4, #article_body_unique .b_c_padding_bottom .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph1b .divbox .divbox_note_text table.bullet4, #article_body_unique .ph1b .divbox .divbox_example_text table.bullet4, #article_body_unique .ph1b .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph2b .divbox .divbox_note_text table.bullet4, #article_body_unique .ph2b .divbox .divbox_example_text table.bullet4, #article_body_unique .ph2b .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph3b .divbox .divbox_note_text table.bullet4, #article_body_unique .ph3b .divbox .divbox_example_text table.bullet4, #article_body_unique .ph3b .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph4b .divbox .divbox_note_text table.bullet4, #article_body_unique .ph4b .divbox .divbox_example_text table.bullet4, #article_body_unique .ph4b .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph5b .divbox .divbox_note_text table.bullet4, #article_body_unique .ph5b .divbox .divbox_example_text table.bullet4, #article_body_unique .ph5b .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph6b .divbox .divbox_note_text table.bullet4, #article_body_unique .ph6b .divbox .divbox_example_text table.bullet4, #article_body_unique .ph6b .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph7b .divbox .divbox_note_text table.bullet4, #article_body_unique .ph7b .divbox .divbox_example_text table.bullet4, #article_body_unique .ph7b .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph8b .divbox .divbox_note_text table.bullet4, #article_body_unique .ph8b .divbox .divbox_example_text table.bullet4, #article_body_unique .ph8b .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph9b .divbox .divbox_note_text table.bullet4, #article_body_unique .ph9b .divbox .divbox_example_text table.bullet4, #article_body_unique .ph9b .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph1c .divbox .divbox_note_text table.bullet4, #article_body_unique .ph1c .divbox .divbox_example_text table.bullet4, #article_body_unique .ph1c .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph2c .divbox .divbox_note_text table.bullet4, #article_body_unique .ph2c .divbox .divbox_example_text table.bullet4, #article_body_unique .ph2c .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph3c .divbox .divbox_note_text table.bullet4, #article_body_unique .ph3c .divbox .divbox_example_text table.bullet4, #article_body_unique .ph3c .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph4c .divbox .divbox_note_text table.bullet4, #article_body_unique .ph4c .divbox .divbox_example_text table.bullet4, #article_body_unique .ph4c .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph5c .divbox .divbox_note_text table.bullet4, #article_body_unique .ph5c .divbox .divbox_example_text table.bullet4, #article_body_unique .ph5c .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph6c .divbox .divbox_note_text table.bullet4, #article_body_unique .ph6c .divbox .divbox_example_text table.bullet4, #article_body_unique .ph6c .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph7c .divbox .divbox_note_text table.bullet4, #article_body_unique .ph7c .divbox .divbox_example_text table.bullet4, #article_body_unique .ph7c .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph8c .divbox .divbox_note_text table.bullet4, #article_body_unique .ph8c .divbox .divbox_example_text table.bullet4, #article_body_unique .ph8c .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph9c .divbox .divbox_note_text table.bullet4, #article_body_unique .ph9c .divbox .divbox_example_text table.bullet4, #article_body_unique .ph9c .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph1d .divbox .divbox_note_text table.bullet4, #article_body_unique .ph1d .divbox .divbox_example_text table.bullet4, #article_body_unique .ph1d .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph2d .divbox .divbox_note_text table.bullet4, #article_body_unique .ph2d .divbox .divbox_example_text table.bullet4, #article_body_unique .ph2d .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph3d .divbox .divbox_note_text table.bullet4, #article_body_unique .ph3d .divbox .divbox_example_text table.bullet4, #article_body_unique .ph3d .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph4d .divbox .divbox_note_text table.bullet4, #article_body_unique .ph4d .divbox .divbox_example_text table.bullet4, #article_body_unique .ph4d .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph5d .divbox .divbox_note_text table.bullet4, #article_body_unique .ph5d .divbox .divbox_example_text table.bullet4, #article_body_unique .ph5d .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph6d .divbox .divbox_note_text table.bullet4, #article_body_unique .ph6d .divbox .divbox_example_text table.bullet4, #article_body_unique .ph6d .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph7d .divbox .divbox_note_text table.bullet4, #article_body_unique .ph7d .divbox .divbox_example_text table.bullet4, #article_body_unique .ph7d .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph8d .divbox .divbox_note_text table.bullet4, #article_body_unique .ph8d .divbox .divbox_example_text table.bullet4, #article_body_unique .ph8d .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph9d .divbox .divbox_note_text table.bullet4, #article_body_unique .ph9d .divbox .divbox_example_text table.bullet4, #article_body_unique .ph9d .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph1e .divbox .divbox_note_text table.bullet4, #article_body_unique .ph1e .divbox .divbox_example_text table.bullet4, #article_body_unique .ph1e .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph2e .divbox .divbox_note_text table.bullet4, #article_body_unique .ph2e .divbox .divbox_example_text table.bullet4, #article_body_unique .ph2e .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph3e .divbox .divbox_note_text table.bullet4, #article_body_unique .ph3e .divbox .divbox_example_text table.bullet4, #article_body_unique .ph3e .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph4e .divbox .divbox_note_text table.bullet4, #article_body_unique .ph4e .divbox .divbox_example_text table.bullet4, #article_body_unique .ph4e .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph5e .divbox .divbox_note_text table.bullet4, #article_body_unique .ph5e .divbox .divbox_example_text table.bullet4, #article_body_unique .ph5e .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph6e .divbox .divbox_note_text table.bullet4, #article_body_unique .ph6e .divbox .divbox_example_text table.bullet4, #article_body_unique .ph6e .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph7e .divbox .divbox_note_text table.bullet4, #article_body_unique .ph7e .divbox .divbox_example_text table.bullet4, #article_body_unique .ph7e .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph8e .divbox .divbox_note_text table.bullet4, #article_body_unique .ph8e .divbox .divbox_example_text table.bullet4, #article_body_unique .ph8e .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph9e .divbox .divbox_note_text table.bullet4, #article_body_unique .ph9e .divbox .divbox_example_text table.bullet4, #article_body_unique .ph9e .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph1f .divbox .divbox_note_text table.bullet4, #article_body_unique .ph1f .divbox .divbox_example_text table.bullet4, #article_body_unique .ph1f .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph2f .divbox .divbox_note_text table.bullet4, #article_body_unique .ph2f .divbox .divbox_example_text table.bullet4, #article_body_unique .ph2f .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph3f .divbox .divbox_note_text table.bullet4, #article_body_unique .ph3f .divbox .divbox_example_text table.bullet4, #article_body_unique .ph3f .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph4f .divbox .divbox_note_text table.bullet4, #article_body_unique .ph4f .divbox .divbox_example_text table.bullet4, #article_body_unique .ph4f .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph5f .divbox .divbox_note_text table.bullet4, #article_body_unique .ph5f .divbox .divbox_example_text table.bullet4, #article_body_unique .ph5f .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph6f .divbox .divbox_note_text table.bullet4, #article_body_unique .ph6f .divbox .divbox_example_text table.bullet4, #article_body_unique .ph6f .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph7f .divbox .divbox_note_text table.bullet4, #article_body_unique .ph7f .divbox .divbox_example_text table.bullet4, #article_body_unique .ph7f .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph8f .divbox .divbox_note_text table.bullet4, #article_body_unique .ph8f .divbox .divbox_example_text table.bullet4, #article_body_unique .ph8f .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph9f .divbox .divbox_note_text table.bullet4, #article_body_unique .ph9f .divbox .divbox_example_text table.bullet4, #article_body_unique .ph9f .divbox .divbox_warning_text table.bullet4 {
  padding-left: 3.6em; }

table.bullet, table.bullet2, table.bullet3, table.bullet4 {
  margin: 0; }
  table.bullet tbody tr td.point, table.bullet tbody tr td.point_small,   table.bullet2 tbody tr td.point, table.bullet2 tbody tr td.point_small,   table.bullet3 tbody tr td.point, table.bullet3 tbody tr td.point_small,   table.bullet4 tbody tr td.point, table.bullet4 tbody tr td.point_small {
    vertical-align: top;
    font-family: 'dejavu sans mono', 'times new roman', sans-serif; }
  table.bullet tbody tr td.point_small,   table.bullet2 tbody tr td.point_small,   table.bullet3 tbody tr td.point_small,   table.bullet4 tbody tr td.point_small {
    font-size: 0.7em;
    padding-top: 2px; }
  table.bullet tbody tr td.point_number,   table.bullet2 tbody tr td.point_number,   table.bullet3 tbody tr td.point_number,   table.bullet4 tbody tr td.point_number {
    vertical-align: top; }
  table.bullet tbody tr td.text,   table.bullet2 tbody tr td.text,   table.bullet3 tbody tr td.text,   table.bullet4 tbody tr td.text {
    padding-left: 5px;
    line-spacing: 95%; }

Can you imagine doing this in plain CSS? Here is the SASS for the corresponding section:

#article_body_unique
  .b_c_padding_bottom, .ph1b, .ph2b, .ph3b, .ph4b, .ph5b, .ph6b, .ph7b, .ph8b, .ph9b, .ph1c, .ph2c, .ph3c, .ph4c, .ph5c, .ph6c, .ph7c, .ph8c, .ph9c, .ph1d, .ph2d, .ph3d, .ph4d, .ph5d, .ph6d, .ph7d, .ph8d, .ph9d, .ph1e, .ph2e, .ph3e, .ph4e, .ph5e, .ph6e, .ph7e, .ph8e, .ph9e, .ph1f, .ph2f, .ph3f, .ph4f, .ph5f, .ph6f, .ph7f, .ph8f, .ph9f
    table.bullet
      :padding-left = !padding_left_outline_base * 1
    table.bullet2
      :padding-left = !padding_left_outline_base * 2
    table.bullet3
      :padding-left = !padding_left_outline_base * 3
    table.bullet4
      :padding-left = !padding_left_outline_base * 4
    .divbox
      .divbox_note_text, .divbox_example_text, .divbox_warning_text
        p
          :padding-left 5px
        table.bullet
          :padding-left = !padding_left_outline_base * 1
        table.bullet2
          :padding-left = !padding_left_outline_base * 2
        table.bullet3
          :padding-left = !padding_left_outline_base * 3
        table.bullet4
          :padding-left = !padding_left_outline_base * 4

table.bullet, table.bullet2, table.bullet3, table.bullet4
  :margin 0
  //:font-size 90%
  tbody
    tr
      td.point, td.point_small
        :vertical-align top
        :font-family = !font_constant
      td.point_small
        :font-size 0.7em
        :padding-top 2px
      td.point_number
        :vertical-align top
      td.text
        :padding-left 5px
        :line-spacing 95%

So use SASS, and explore new ways to structure your CSS files. And once your stylesheet theme is set in stone, you can make SASS generate all the CSS code into a single line — effectively reducing bandwidth usage, and also acting as a poor man’s way of obfuscating brilliant CSS ideas.

Netbeans 6.0.1 on Elyssa – Ruby, Rails, C/C++ Projects

Some weeks ago, the Ubuntu people quietly upgraded their Netbeans package on their repositories from version 5.5 to 6.0.1. For me, this is great, because I don’t have to download shell install scripts from the Netbeans website any more (the current 6.1 not being much of a facelift from version 6.0.1). However, you’ll notice that 6.0.1 from Synaptic does not support the creation of projects other than Java or some other “Samples” in the New Project dialog box. To remedy this, simply go to Tools -> Plugins -> Available Plugins, and check off the boxes that you want to use. For me, I added the Ruby and Rails, Ruby Extra Hints, and C/C++ plugins. Now, I can create (and open existing) projects that are based on Ruby, Rails, or C/C++, and use all of the functionality of the IDE associated with those languages! You might also want to go to the Tools -> Plugins -> Updates tab to install some of the “core” updates to the general IDE.

Linux Mint (4.0, “Daryna”) – Reflections after a week of regular use

As far as the distro itself, Mint is quite excellent as I’ve pointed out in my previous post. After having the unprecedented success on my Dell laptop, I decided to install it on my Windows XP SP2 desktop PC as well. It’s too bad that there’s only a 32-bit version of Mint right now, but I’m sure it’ll expand to 64-bit once it gets popular enough.

Mint on my desktop looks verrry pretty. Compiz fusion runs brilliantly with the official nvidia drivers (easily google-able/searchable on synaptic). Indeed, running the Desktop Cube plugin alone saves me a ton of desktop real estate–it’s so beautiful and easy to use! (Firefox 2.0.0.12, when it restarts from a crash, will actually remember which sides of the cube its multiple windows were last open on–amazing.) And you can have more than just 4 sides–I have a hexagon setup on my laptop (4 sides is plenty enough for me on my desktop, as I use dual 22″ LCDs).

Speaking of dual monitors, it was probably the single most difficult thing for me to set up to get it to work. I ended up using TwinView after some preliminary research. Basically though, don’t get let down if after installing Mint you find that only 1 of the 2 monitors plugged into your video card is displaying any images. You just need to get TwinView (or Xinerama, or… there’s another program for ATI cards) to get your linux system to start spitting images out to that second monitor.

Some things I really dig about Linux (not just Mint, since this should apply to all linux distros/open source apps):

  1. NO NEED FOR ANTIVIRUS SOFTWARE! Google about it. It’s a liberating feeling not having to wait 3 minutes every day for AVG Free Edition to update virus definitions.
  2. NO NEED TO DEFRAG! Well, you wouldn’t need to defrag as long as you are using about 80% of your disk space (provided that the majority of your files are small, not like 2 gigs or something in size–I think; google it to see what I mean)
  3. NO SPYWARE/ADWARE! Since I only use FOSS, and since these are all developed by, basically, regular people like you and me (smart consumers who can code), and only grow in popularity based on things like ease of use, how good the program is, etc., they NEVER have any sort of system monitoring BS you get with (many) Windows programs. (To my mind, even the Apple Update software that comes with iTunes is bloat/crap, for people without iPods like me). As you can see by now, these three advantages alone rid probably100% of people’s problems with Microsoft Windows/what people spend their money on for Windows software. It’s incredible to see now, after all these years, that, Windows is essentially equivalent to a gasoline-guzzling truck (and the whole profit-minded, scam-like industry that the auto manufacturers have created in terms of exorbitant prices for simple, often obsolete-technology-but-still-being-produced parts). Linux is different. It’s smarter. (And I don’t understand why in the world Gates designed Windows the way it is, since UNIX came before him, not just Torvalds).
  4. COMPLETE CONTROL /ABILITY TO FIGURE OUT EXACTLY WHAT IS INSTALLED IN YOUR SYSTEM. You won’t be hunting down registry keys and things like that on linux (for 99% of your needs). This is because the wonderful application installer called synaptic (which comes with Mint–I’m not sure how other distros work) lists EVERY little component to ANYTHING you’ve installed (provided that you installed it from synaptic–which is like 98% of the time–unless you install things by building from source files and compiling them, which is what I did for some programs that were cutting-edge and not available from synaptic (e.g., NetBeans 6.0)). The beauty about installing things from synaptic is that, it lists programs from an online server (you can connect to as many servers as you want, I think, although Mint, being an Ubuntu-based distro, leaches off of Ubuntu’s repositories, heh). This means that thousands and thousands (maybe millions?) of people are looking at the same list of programs (for those using the default servers listed with synaptic). This means that, we have, at any given time, a tangible and finite amount of programs that are being considered for installation by people like you and me. Only quality programs/programs that are actually good and useful make it to this list; you won’t find any bogus/bloated junk here. Isn’t that just beautiful? And also, most programs you install will also tell you exactly what other programs/components it will need to become fully functional. I don’t write these down, but hey, it’s nice to know.
  5. FAST bootup times. I’m running off of an old IDE hard drive (I installed Windows on the SATA, poor me), and I still boot faster than Windows. This is still taking into account the 5-second delay for GRUB’s OS-choosing menu (which is deletable, I think, if you don’t want to dual-boot and just access Windows files from Linux, which is quite easy and automatic in Mint), and the 10-second minimum timed automatic login for your username/password. My PC feels lighter with less useless garbage running in the background.
  6. Related to #3 and #4: MOST PROGRAMS HAVE A VERY INTUITIVE/EASY TO UNDERSTAND USER INTERFACE! You won’t be digging up help files much at all. It’s not like the old Word 2003, where you had to do odd things like View -> Header and Footer to actually add things in there. This is because, since FOSS is developed actively (and incrementally, one step/patch at a time), things are changed quickly if people voice their dislike of a certain feature (or if enough requests come in). I didn’t have to do much to figure out how to customize things on the standard text editor/etc, even though I’d never used them for the first time. The only exception to this is OpenOffice, which retains much of the quirky location of options from the old MS Office programs, to steal Microsoft’s userbase.
  7. Oh, and how can I forget: NO NEED TO RESTART/REBOOT AFTER INSTALLING A PROGRAM!!! You heard that right. Well, it’s been this way so far for about… 15-ish programs that I’ve installed. Amazing. It just feels so odd to install a program and then use it right away. It’s a good feeling.
  8. Multi-platform programs are faster on here than in Windows. E.g., the ruby interpreter, irb, begins instantly when I type in “irb” in the terminal. On Windows’ command line, it would always wait 1 second before starting. Mongrel is faster on Linux here for my Ruby on Rails app (probably due to how there’s less crap/no antivirus running on my system when my app is handling a large MySQL/computationally intensive query). If you click on any program, it seems, it will start pretty quick compared to Windows.

Now, nothing gold can stay; so, here are some perks that I find distracting/unnatural:

  1. The need to constantly type in “sudo” before executing any important and/or system administration/driver related command. I think “sudo” stands for “super user do.” Essentially, typing in “sudo” is a security layer against someone changing really important settings on your system, like editing the configuration file for your screen/monitor (the widely-known “xorg.conf” file that you might have heard of by now). I think this behavior is changeable (heck, anything in Linux is), but I’m too lazy to google it just now. And in a way I sort of like being trained in the old UNIX tradition of yore of using the terminal. And that brings me to…
  2. TERMINALS! I should have mentioned this first. The “terminal” basically stands for the Windows equivalent of a “DOS” prompt or “command line” prompt. It’s the black background with monospaced characters with a little blinking line waiting for you to type in some (rather archaic looking) command the computer can understand, like “cd” for change directory, “rm” for removing a file, and so on. Terminals, and Linux’s obsession with giving the user absolute control over everything, has lead to their continued widespread use for some rather basic commands (you’ve probably seen advice like “type ‘sudo apt-get install program_name_here’ ” on some forum online–the speaker was referring to the terminal). This is confusing, and really, there shouldn’t be a need for you to type in perfectly-spelled commands. Right now, I don’t know how to change file/folder permissions in the File Browser (aka “nautilus”), so I have to type in things like “sudo chmod 777 file_name” which looks a bit stupid, honestly, for something so simple. Yes, the terminal is powerful and you can do all the magic in the world in them, but it’s basically over-used/over-recommended for some things.
  3. Lack of official support for some hardware, like my Brother HL-2040 printer. (I was so suprised that Mint got it working without a hiccup after I installed the Linux drivers from the Brother website–and even automatically found and printed to a networked printer (also a Brother, but a different model) in a different room in my house). Wait, but how can I say lack of support when everything worked smoothly? It’s the lack of printing options I get from inside Windows. I can’t do 2-up printing (or even manual duplex, it seems) inside Mint. Ah, I miss duplex so much.
  4. Since there are few commercial companies that have Linux products, this means that any Linux problem you google about to get help is likely to link to some Linux community’s forum or the official forum of the FOSS developer in question (and sometimes the monstrous, 60+ page topics that have hundreds of people chipping in their own little quirk/experience/variation to the problem originally proposed). The real downside is that, often, if you don’t want to spend 20 minutes to research/find an answer that works, you’ll have to register and submit a question on a forum. For Windows problems, I’ve found that, the internet is overflowing with answers to just about anything you can think of about your Windows system, that it’s more like spending 2 minutes to find an answer on google. I miss the large community of me-alikes (and yes, Ubuntu’s community is very large, but nothing compared to the Windows family).
  5. Somewhat shoddy international language INPUT support. Notice how I stress input, not viewing Unicode or anything like that. Right now, there are two alternatives for Chinese/Japanese/Korean input on Mint–SCIM (what I use) and UIM. But SCIM is weird because I’m quite sure I installed it the same way on my desktop as I did in my laptop, and yet, they behaved differently for some time, in things like display of the tray icon and whatnot. Well, they both work now–but to get them to work, I had to edit some files and things. Not fun. (If you’re curious, the tray icon wouldn’t show on my desktop, so I had to configure my Sessions setting to restart SCIM with “scim -d” manually each time Mint starts–which seems redundant since SCIM is already supposed to start automatically anew with each boot/login).
  6. And of course, not many games! It’s not really a complaint, I guess, but yes, the gaming community is really lagging behind in the Linux world. For things like word processing and email and any other basic PC use, Linux is quite excellent. But not for games. So, it’s not yet a really as “fun” a machine as Windows in this field.
  7. Somewhat redundant-looking folders in the system. E.g., for fonts, there’s a ~/.fonts hidden folder, another fonts folder under /etc/X11, etc etc etc (like 20 folders all called “fonts” in various directories–type in “fc-cache -fv” in the terminal to update your system’s font recognition of new fonts you’ve installed, and you’ll see these redundant-looking font folder structures/locations). It’s confusing. It’s probably because there are thousands of programmers and many large projects that do not work together toward a common goal (that goal here being the use of just 1 font folder for everything, like how Windows does C:/Windows/FONTS). E.g., OpenOffice has its own font directory, and the same for X11 mentioned above (X is a GUI kind of thing for the Mint OS, it seems, and I think the term “X Window System” comes from this technology). It’s a liiiiittle bit confusing if you’re anal about where everything is located, like me. (On the other hand, you can type in “fonts:///” in File Browser and see a universal list of fonts that are currently recognized by the system–but “fonts:///” is not actually a physical folder, but a collection of symbolic links I think that is displayed into one magic folder).

So that’s my wrap-up of Linux first impressions, of sorts. Hopefully this will give you an idea of what the Linux world is like at the moment. Do keep an eye out for Mint version 5.0, due out sometime in April (that’s next month!). (Daryna came out last October–oh, if I had known, I would have installed it during winter break!)

EDIT: To simulate Manual Duplex printing on a HL-2040 (or possibly any basic printer), follow these steps:

  1. First, set up the printing properties from within the app you’re printing from, so that you print only the even pages first.
  2. Put those pages back into the printer tray, keeping in mind the proper orientation. For me, I just stole the image from the manual duplex dialog box from Windows.
  3. Now, print the odd pages.

The only significant difference from the Windows experience is that, you have to manually click your way through to set up the printer that it prints only the even pages, and then only the odd pages. Other than that, it’s basically the same. Caveat: be sure to set the printer option BACK to printing “all pages,” and not just the odd ones, because it will likely remember your setting, so that, if you ask the printer to print page 4 next time, it will give you an error (this is what happened to me using the Evince pdf viewer).

My Newbie Experience With Ruby on Rails

So for the past month, I decided to learn Ruby and also its popular web framework, Ruby on Rails (or just “Rails”). The motivation behind this learning spree was the creation of my own website that I could use to help me study better (as a sort of drop-in replacement for MS Word for writing outlines). First, let me say that learning Ruby was great and really fun. However, Rails was really, to be honest, a pain in the @ss for pretty much everything.

I’m not going to go off on a long rant here (like what this ex-Rails core contributor did); instead, let me just point out some of the biggest weaknesses of Rails:

  1. Its documentation is pathetic. The Rails API doesn’t really mean anything to me–it’s just an index of every feature of Rails with short tidbits that are often sorely lacking in coherence. Or at least something that a newbie programmer like me can understand. And, I don’t know why, but the Rails community decided to put together a Wiki that is, at least for everything I was interested in, either obsolete, or poorly organized. It’s like reading a IRC chat log, except with prettified code blocks. Like this page.
  2. Somewhat related to #1, Rails has few, if any, tutorials that work. This is because Rails changes every 2 weeks. For some reason, every book I’ve used on Rails so far had to be modified by myself to work on my Windows XP box (I’d like to get into the world of Linux and open source operating systems more, but the last time I tried to install Ubuntu 7.04, it refused to work with my dual LCD monitor setup). And that means every time I want to do something–say, add a feature to my Rails app–I need to first google some vague description of it, and hope that someone on the Rails mailing list has it figured out. And about 75% of all useful tutorials on Rails seem to come from blogs. This gives me the impression that Rails developers don’t want to share clear, concise knowledge with other people in general. That’s why crappy sites like the Rails Wiki I mentioned above pops up in the top ten search results on google so often.
  3. Aside from horrible documentation and a sore lack of working tutorials, Rails seems hypnotized with its own mantra of “do everything in 20 minutes or less!”. By this I mean–so many articles about Rails are caught in the hysteria that it’s always better to write less lines of code, that it’s so great to do something in 5 minutes. There’s a common thread running through these tutorials/blog articles about Rails–they’re concerned first about quickly implementing something instead of creating something that is sturdy, reliable, and is general enough to work in a wide variety of situations. Usually, many of the Rails “solutions” or “recipes” that I encounter across the web while googling for Rails developer wisdom are too specialized to be of any use to anyone but themselves. If you’re going to share something with other people, it better be easily adaptable/changeable so that people can actually make use of it, and hey, perhaps make it better.
  4. In line with what I said in #3, I really despise how so many tutorials make use of Rails’s “scaffolding” feature. Good grief–I don’t want auto-generated code flying around in my Rails app to add just one little feature. You know what, I think the whole “scaffolding” feature is retarded. It’s only good if you want to create shit-looking websites that look as good as the tutorial’s scaffolded views. Seriously–do people really use scaffolding? I think it’s just a big joke–a marketing scheme. Scaffolding only lets you create something really fast–so that the Rails community can boast about development speed. And why is it that every tutorial out there on scaffolding is concerned about creating a weblog? With “Posts” and “Comments” as models? What if I don’t want to create a weblog? What then?
  5. Some features that should be really, really, really simple and built-into Rails don’t exist at all! For example, there is no simple way to upload files. Just google “rails upload files” and you will see. The answers do not converge to same/similar solutions. This is madness! Rails wasn’t built yesterday. It’s been several years since DHH became an international figure. And yet, all through that time, it has failed to create a simple feature that allows users to upload files to a basic Rails app! Also, did I mention that Rails migrations do NOT support the creation of MEDIUMBLOB/MEDIUMTEXT or LONGBLOB/LONGTEXT types in MySQL? Why? Why do I have to execute ugly SQL code inside my Rails migration files? Apparently, Rails likes to think that everything should be smaller than 64KB. What a joke!

That being said, I’ll still say that Rails has taught me a lot about web design and what it could be (my last foray into website design was in 2001 with pure HTML and Notepad). But it leaves a lot to be desired. I’ll keep playing around with Rails on my windows box for now, but my desire to learn the deeper intricacies of Rails has all but died out. The bad news is that Rails is the only heavily-developed framework out there based on Ruby–my favorite scripting language. Yes, I know of other alternatives like Merb, but bad documentation is better than no documentation (the only reason why I decided to learn Rails for what it was worth was because no other Ruby-based framework had a similar amount of documentation). And for the record, I did end up creating a decent website to suit my needs (a replacement for MS Word). But it could have been better, and more pleasurable, had it not been for the 5 annoying-as-hell points I listed above.

My advice to those wanting to learn a web framework is this: wait a couple years! Hopefully, either Rails or some other alternative will be mature enough to be easily digestible. But if you have countless hours to burn reading blogs and googling for things–you have my blessing.

UPDATE March 25, 2008: I see that people are visiting this blog for Rails tips (like what I was doing 3 months ago). If you want to learn Rails without the crappy feature called “scaffolding” that I ranted about above, try “Build Your Own Ruby Applications” by Patrick Lenz. It’s outdated, yes, and it has its share of typos, but once you get through at least the first few chapters (especially the ones where he builds from scratch how to make editable text input boxes and do the basic CRUD features on them), you should be able to make some basic but still functional (and not “scaffolded”–ugh) websites. The SitePoint publisher forum for this book is quite helpful for common typos, etc (Lenz even has a page dedicated to errata/corrections).The key is to copy code and modify them to your liking.

I also recommend the NetBeans IDE. It’s superb. Also, get the HAML ruby gem (which comes with SASS support), and the corresponding NetBeans HAML/SASS syntax highlighter (google it), and you’ll be on your way to some mad-quick development. HAML will save you quite a bit of typing–hours of typing in the long run (no closing tags!). Oh, and I highly recommend the FireBug Firefox extension if you don’t have it already. The SASS + FireBug duo is probably 10 ~ 15 times quicker than plain CSS editing (I can’t believe there are actually sites that still talk about CSS, when SASS is ultra fast for development (you could, if you want, use SASS for development only and just copy/paste the resulting CSS generated by SASS, statically, on your non-Rails sites).

Oh, and lastly, use XAMPP (or any other similar package). Why? No need to type in MySQL commands, if you’re using MySQL (like me, b/c to me it seems that MySQL has the most dominant presence right now). I worked through Lenz’s beginning chapters without typing in any unpalatable MySQL commands. 😉 Just use the phpMyAdmin web app that comes with XAMPP on localhost to browse through database entries and do CRUD operations on them with intuitive, easy mouse-clicks. (And since you’ll probably be using FireFox for phpMyAdmin, this means that you can keep your prototype Rails app on the tab next to it (and while you’re at it, a tab with FireBug enabled on another part of the site you’re fixing up, etc etc)).

And finally, if you’re NEW to Rails and am just starting out from almost no programming background (like how I was), DO NOT bother with creating unit tests, functional tests, or any other tests. It is a waste of time when you’re trying to create a simple, ultra basic web app for learning purposes. I cannot tell you how many hours I spent trying to fix typos in Lenz’s book (either that or the test code in the book was outdated by the time Rails 2.0 came around) to get every unit test to work. Besides, Rails by default will present you with EXACTLY where the source code encountered a problem. I still haven’t written tests for my app–but I made sure during development to try out bogus input and to purposely make my app break for every method I wrote. And now my app has reached a point where it hasn’t displayed any errors (or anomalies) for the past month or so of continued usage. It’s actually better this way, in my opinion, because you’re FIRST learning to write good, reliable code from the get-go, instead of getting into the mindset of (“I’ll just test it later”). Writing function tests are not easy (just look at Lenz’s book–he has like 30-something tests for his super basic web app… I mean, how does he know that he only needs 30, and not 31? Or 29? So to sum up: don’t bother with test code if you’re starting out in Rails. Get the “feel” of Rails down first, and how the app behaves/responds to input, and then implement tests if you wish (…to work as a Rails developer, that is, and not just as a hobby).

UPDATE April 25, 2008: OK, people are still visiting this page to find out about LONGTEXT/LONGBLOB types for migrations. Here is my SQL-command that I used for my migration (in the full context of my 001_create_articles.rb migration file:

class CreateArticles < ActiveRecord::Migration
  def self.up
    create_table :articles do |t|
      t.string :title
      # and some other stuff that look like t.text or t.string
      # or whatever else
    end # END create_table

    execute 'ALTER TABLE articles ADD COLUMN body_text MEDIUMTEXT'

  end # END self.up

  def self.down
    drop_table :articles
  end

end # END class definition

You can replace mediumtext with longtext or longblob or anything else. The command above adds a new column called body_text to the articles table that already exists on the database.

UPDATE March 11, 2009: I don’t want to give out bad advice. I should have stated a long time ago that you should NOT use any IDE, even NetBeans. IDE’s and their GUIs and all that baggage slow you down a lot. Personally I use Vim, but any solid text editor should do.