MIgrating development db and test db simultaneously

If you’re lazy like me and don’t want to keep repeating

rails db:migrate
rails db:migrate RAILS_ENV=test

every time you create a migration, just bind them together using alias. Open up your .bash_profile(or create one if you haven’t already) and paste this:

alias migrate='rake db:migrate; rake db:migrate RAILS_ENV=test'

Now the next time you have to migrate, just type:

migrate

and you’re all set! You can also have fun and do all those other rake stuff and alias them all like rake db:seed or something.

Enjoy!

Running Thinking Sphinx, with Mysql and Postgres on OSX Snow Leopard

Having installed Thinking Sphinx for a project that used postgres, I had trouble running it with mysql. I tried editing some configuration files, both for my project and even tried the global config for TS but to no avail, it kept complaining that it didn’t know the type = mysql.

This led me to think(coupled with the answer for my SO question) that I must’ve compiled my TS before specifically for postgres only so I set off to recompile said thing for both.

./configure ran fine though, but it had problems when I tried make, because it was complaining I wasn’t using the right architecture. I then realized the mysql installed in my machine was x86, when in fact what I needed was the 64-bit version.

I then downloaded the 64-bit version for macosx and installed. I then tried to make TS again and voila! It installed perfectly. Now I was itching to index my database, but a new error popped out:

ERROR: index 'prospect_delta': sql_range_query: Out of sort memory; increase server sort buffer size

Using some google-fu, I finally nailed it down to this command:

sudo mysqld_safe --key_buffer_size=16M --sort_buffer_size=1M

which sets your buffer size a bit higher for the indexing. Whew!

G-Edit and Shell to make editing multiple views easier

I recently was given a task to change alt tags in ALL of our companies images for better SEO purposes(I do think it won’t impact that much, but I guess they’re thinking any additional impact is better than nothing). I was given an excel file with about 300 images with their current alt tags and their proposed replacements. Yes, another copy and paste task.

What really blows is I don’t have a way of knowing where ALL the instances of the images are, so I had to use my now current favorite shell command to search where a said image is placed in a view:

grep -r -i imagename *

What that does is look which file and line in that file that the imagename string is mentioned. I usually just look for the name itself, and not the extension and the sub-folder, so to look for logo.jpg, I just put

grep -r -i logo *

That returns all the files where logo is mentioned(so I guess you’ll also get non-image results). What’s good about this is that it looks for both the instances when the image was rendered using <img src> or <%= image_tag %>

Seeing my first search resulted in 11 hits(I think the options -r -i of grep searches incrementally so it will also look in all sub-folders of the directory you are in), it occurred to me that this might take a while, as I also had to look for all the files, etc. I asked my friend to help in some shell-fu and here’s what we came up with:

gedit `grep -r -i -l imagename *`

What does this do? Simple, the -l option just lists the filename of the file where imagename was seen(as opposed to including the actual line where it was seen), and the grep enclosed in “ means that the output will be a string…which in turn is sent to gedit. The result? It opens up all the files that contains imagename and that my friends, made my life a wee bit easier in changing the alt tags in all the instances of a said image.

*EDIT:
By the way, I know there is an easier way, like maybe replace all instances of said string in all files or something, but I haven’t found out about it yet. If I do, I’ll be sure to make a new post about it :P

Rails for Designers 101 – Step by Step Version

This is more of a ‘tutorialized’ version of my previous post. Here, I’ll be sharing how I made my ‘portfolio/haml converter’ rails application, since I unfortunately assumed that anyone reading that post also knew what I knew. This time though, I’ll be assuming nothing, just that you are a designer and you just want to try coding in Haml for a change(good for you!) even if you don’t know squat about rails.

For starters, if you don’t have Rails yet, I suggest either installing Rails the hardcore way, or take the easy way out like I did: just download InstantRails. Okay, after you’re done with that part(I’ll be assuming you also took the easy way out) just unzip that into your root directory(I’m using Windows *gasp* so mine is located at C:/Instantrails/)

Now, all you have to do is bring up a command line(windows key + r, then type cmd), go to your Instantrails folder(type ‘C:/Instantrails/’) then type ‘use_ruby’. You’ll know you did the right thing when the directory changes to C:/Instantrails/rails_apps(just realized it’ll be better with screenshots…but I’ll do that later)

OKay, next in line is installing haml. Ready? Just type:

gem install haml

That’s it! Haml should be automatically downloading now. As you wait for that one, you can open up a new command line, go to your IR(due to laziness I’ll be calling Instantrails IR from now on) folder again, type use_ruby again and then type

rails myhamlizedportfolio

Actually you can name it anything you want. Doesn’t really matter(I sugest you pick a short name though). This will effectively create a blank rails app for you. And by that I mean it will create a folder named myhamlizedportfolio in your rails_app folder, complete with all the folders needed for a blank rails app. Next would be to install haml as a plugin for your portfolio app(you should still be in C:/Instantrails/rails_app when you do this):

haml --rails myhamlizedportfolio

Easy, right? Next, you just have to tell rails that you won’t be needing any database of sorts. So goand open the myhamlizedportfolio/config folder. Open environment.rb(with your favorite text editor – notepad) and look for the following lines

# Skip frameworks you're not going to use. To use Rails without a database  
# you must remove the Active Record framework.
# config.frameworks -= [ :active_record, :active_resource, :action_mailer ]

Just take out the ‘#’ of the third line like so:

# Skip frameworks you're not going to use. To use Rails without a database
# you must remove the Active Record framework.
config.frameworks -= [ :active_record, :active_resource, :action_mailer ]

Save this and close the file. Delete database.yml in that same folder by the way – you won’t be needing that. Next up is to fix your routes(if you want to understand what you’re actually doing, I suggest learning basic rails first like a good citizen, but if you can’t be bothered, then just follow these steps and believe it will work :P ). Open up routes.rb with notepad(it’s still in the config folder) and add this line right after the first line like so:

ActionController::Routing::Routes.draw do |map|
map.connect 'projects/:id', :controller => 'projects', :action => 'index'
 

That just basically means that to access your projects all you have to do is go to http://localhost:3000/projects/projectnamehere. More on that later. For now, save and exit again and you’re done with the config folder. We’re almost there! 

Now go back to your command line and while in your project directory(in our case, myhamlizedportfolio) and type

ruby script/generate controller projects

This will generate some files but what we really want to focus on is the newly generated projects_controller.rb located in myhamlizedportfolio/app/controllers. Open this file up with notepad, as usual, and well, just replace all the code there with this:

class ProjectsController < ApplicationController
def index
render :action => "#{params[:id]}/index"
end
end

Don’t worry if you don’t understand. That’s just a ‘continuation’ of what we did with routes.rb, basically telling our app that going to http://localhost:3000/projects/projectnamehere means it should render the page with the same name located in your views(again, more on that soon).

Actually you’re done setting up. You can now start coding with Haml. To start, let’s make a design project named RedHelloWorld. Go to your views folder(myhamlizedportfolio/app/views) and make a new directory named RedHelloWorld. Open up notepad again and type these:

!!!

%html{:xmlns => "http://www.w3.org/1999/xhtml", "xml:lang" => "en", :lang => "en"}
  = yield :layout

If you have reviewed Haml, that just basically creates the basic headers for your html page. Save that as application.haml and save it in the views/layouts folder(also delete application.html there if it exists). Create a new document yet again and type the following:

%head
  %meta{"http-equiv" => "content-type", :content => "text/html;charset=UTF-8"}
  %title hamlicious home!
  = stylesheet_link_tag 'demo'

  %body
    %h1.red HELLO WORLD!

Just by looking at the code, you’ll already know that Haml really makes things easier for you. A lot of time is saved since you won’t be needing to type the appropriate closing tags for each div, or other html tag out there. Save that file as index.haml and save it in views/RedHelloWorld (yup, create a folder with that name).

Next up, is your sass(css) file. Open up a new text file again and type:

.red
  :color #ff0000

Save that as demo.sass and save it in myhamlizedportfolio/public/stylesheets/sass/(you’ll have to create a sass folder). While you’re at it, also delete the index.html in your public/ folder. And now all you have to do is run and test your app! Go to your command line(yet again) and after use_ruby and going to your project directory, just type

ruby script/server

Wait til ou see the lines:

** Mongrel available at 0.0.0.0:3000
** Use CTRL-C to stop.

And that’s it. You can now access your demo by opening up your browser and going to http://localhost:3000/projects/RedHelloWorld

Hopefully that’ll work. Any problems, leave a comment :P Oh and before I forget, if you need the html and css files(like I do – I just like coding in Haml/Sass) just view the page, view the source and copy paste it in a blank document and save it as .html(in another directory of course). Get the .css file that will be generated in myhamlizedportfolio/public/stylesheets/ and use that for the css file of your project. Enjoy!

More on customizing this app sometime in the future. (namely how to make a “homepage” where you have a list of all your hamlized projects.

Rails for Designers – Using Haml/Sass for all projects

I have recently acquired a newfound drive for designing sites(as opposed to my earlier desire to be a great design/backend mediator). As of now, due to some reent developments, I am the main designer for most of our projects, not to mention some of which are personal or freelance related. One pet peeve I had though was the diversity of my projects: meaning some were in rails(of course I was happy with fixing views and adding some javascript-fu), php, and some, just plain XHTML/CSS.

With that said, things can get pretty messy when multiple projects are at hand and I have to shift continually from regular XHTML/CSS coding and HAML/SASS. Though it is not a great hindrance, having to keep remembering which language I was using was kinda annoying. Add to the fact that I work twice(or thrice) as fast using HAML/SASS and the tiny nuisance becomes a glaring problem(for me that is).

At first, I made a semi-solution. A compromise of sorts: since I use the ever cool Elements CSS framework(actually I just use the general html structure and a modified reset.css which I have discussed with the author, Ben Henschel), my html is usually almost ready-made so my usual focus is just the css file. For projects that used Rails(I still didn’t have a solution for ones that didn’t) but not Haml, I just installed Haml on my part, and continued developing with Sass. Since Sass generates a .css file, that’s the one I usually push in repos(if the client can’t be bothered with installing Haml).

But that was just for Rails projects. The problem lies with normal design projects or ones that used PHP. Recently, I had another solution(I doubt this is the most efficient though): make a blank rails app and keep using Haml/Sass for myself and when done with coding the design, I just do a view source, copy-paste the whole thing in a blank html file, modify the paths for the css and javascripts, then just copy the images/stylesheets/javascripts folders in my public/ folder. Nifty!

It was a good thing for me, since now, I can just keep coding in Haml and Sass to my heart’s content. Thing is, I just realized I just can’t keep making blank rails apps for each project! So the plan was to separate the projects in self-titled folders and just use some routes.rb and controller magic suggested by my friend Greg:

In routes.rb:

map.connect 'projects/:id', :controller => 'projects', :action => 'index'

and in my single controller named projects_controller.rb:

def index
render :action => "#{params[:id]}/index"
end

With that, I can just go to say /projects/projectA and it will then render projectA. This also works as a portfolio and future-reference of sorts for me, which is excellent. Now I only need to think of a good way to organize the images and the stylesheets(especially the javascripts) so they won’t interfere with each other but basically, I’m just planning to put them in separate folders too(except for reset.css and jquery.js of course – every project needs that!)

Extra note:
Forgot to mention that I had to add 

config.frameworks -= [ :active_record, :active_resource, :action_mailer ]

since I wasn’t using any db.

Online privacy

Recently, I have come across this news in Slashdot. I don’t fully understand the repercussions of that but from what I do think I understand, it just says that Google actually logs your IP and your online behavior, right? Like, “Hey, this guy using 123.456.789 .123 is surfing bestiality porn! LMAO!”.

Sure, it kinda violates your “privacy” but I don’t know. Google actually does it(log people’s online behavior, like surfed sites, search terms) because they want to know what kind of ads to show you, right? Sure, you use Firefox 3 and have adblock plus, but what about the others who don’t? What about the others who actually like getting ads as those ads help point them get to sites/buy items they usually wouldn’t have seen anyway?

Maybe there should be an option for turning off/on the tracking of your online behavior, but for me, I’m pretty sure it is harmless. It’s not like they’re watching your every move online. You are NOT that special. To them, you’re just a byte. Or a statistic. Or a number. Nobody. You’re an ip address at most. I’m pretty sure they’re not trying to be Orwell’s Big Brother by looking at everyone’s personal lives and trying to dictate everyone’s actions.

Maybe I’m wrong, but that’s how I understand it. Is there any other reason for them to get everyone’s surfing behavior?  Like almost all web services, I think it is important to “get to know” your users so that instead of giving them what they need when they need it, you can give them what they need/want before they even ask for it. Sure, they’ll know you surfed for car porn or door porn or even the fact that you googled “the number of married men/women uglier than me” or something, but that doesn’t mean they’ll try to find you. For what? To laugh at you? Tell the whole world that you’re one of a kind who searches google for married people uglier than you? Or maybe you purchased a sniper rifle to kill someone and they can trace you(Wow. That’s just genius on your part then)

I honestly don’t understand why people care about online privacy that much. It isn’t that much different from you asking the local librarian for books on “How to Impress a First Date” or “French Kissing 101″ or even “How to Wipe Your Ass Properly”. It isn’t much different from buying OTC potency pills. They wouldn’t actually care if you surf for weird stuff at night – they’ll just give you more ads about the weird stuff you like. And wouldn’t that make your web experience better?

These are just my thoughts and maybe I am missing the whole point here. And if so, feel free to steer me the right way. But right now, I still think that people are being overly paranoid on what Google might do to about their online behaviors. Am I just that naive? Can anyone enlighten me on this?

Scraping bot

I just recently found the joys of scraping. Yes, the “technique” is a bit underhanded, but it sure is fun. I guess as long as you don’t profit off of it, it’s ok(and it doesn’t affect the site you’re scraping). If you scraped a site just to present it in a different design(like scrape all the news off CNN and then make a site called BNN or something and then charged users with a smaller fee), then yeah, that’s just plain dirty.

I scrape for fun and that’s it. Anyways, there I was, scraping movie schedules off the only movie schedule site that I know of( clickthecity.com ) and suddenly, I had an idea. What if I just made an RSS feed for a movie house that I liked? It would be just so cool since clickthecity(or CTC) doesn’t have an RSS feed. So I started researching about makign RSS feed, and while doing so, Topher brought about the idea of making a bot. He showed me how jabberbot and from there I went on and played around with it.

To make the scraper, I used the Rubyful-soup plugin for Ruby on Rails(along with Mechanize). Using it was easy, and the main problem actually was how to traverse the atrocious table layout of clickthecity. Once I got over that hurdle though, getting the info I wanted was easy. And what did I need? I only just needed the date of the showtimes(so I’ll know if it was the latest update), the location of the cinemas(the mall the cinemas were located), the cinema name(or number), the movies being shown on each movie house,  and the show times of each. These were saved into a database I made(I had a bit of a trouble in putting them in, especially since there were movie houses that had two different movies being shown the same day)

Next was the bot itself. Like I said, I used jabberbot, which was also a handy plugin for Ruby on Rails. The syntax was easy, and this was the easiest part. I made a new google account just for the bot and now it is up. I still have yet to make it work on yahoo messenger(Topher tried it and it didn’t work, but I haven’t tried it for myself yet) so I’ll just have to settle with Gtalk.

The flow of the program is simple: scrape the data from clickthecity.com and then save it to the database(done using a rake task I made). I have yet to automate these tasks, along with the connection of the bot(I still have to manually start it using another rake task). Anyways, after manually callign the rake tasks for scraping the site and starting the bot, movieschedule-bot is ready to go.

So far, I only added a select few movie houses that me and my friends usually go to. You can actually add movieschedules (yes, google mail) to your gtalk/gmail contact list and start using it(don’t worry about down times. that just means I am currently updating/restarting it – try again after five minutes if it doesn’t work) Don’t try to spam it though as right now it is running from my local machine. I have yet to upload it to my free Heroku account and make it run the bot forever.

So there you have it. A scraper bot. There are a LOT of other uses for this, like a thesaurus bot, wikipedia bot, imdb bot or something but that’s for another discussion. As you can see, bots can be useful too! Right now, movieschedules is looking for more friends. Be kind to it!

To start using  movieschedules, just add it to your Google contact list then type “help” and send it. It will return you a list of commands that are currently available. Have fun!

Small But Terrible

I’m pretty sure most of us have been in a situation where we have been trying to fix a bug for hours and finally seeing that there had just been some tiny typo or maybe even a commented line of code. I’ve been through a lot of those experiences before, especially when I was still learning to code, and most of the time, I just breathe out a huge sigh of relied or just plainly laugh at myself.

Reminiscing about those ‘good old days’ could be fun too. Here’s some of those ‘what the hell/oh come on/I knew it was just a simple mistake!’ scenarios that I have experienced or just know of:

These are just some of the mistakes that we can encounter while coding and minimizing the chances of these happening can help in coding a lot faster and having more time dealing with bugs that matter.