As a small thank you to the Redcar team for such a great editor and in the spirit of giving a little bit back I’m documenting the process of creating my first plugin.
I really like the idea of the Redcar editor. Its written in Ruby, its possible to write your own plugins what’s not to like? Though I must confess I don’t use it as my day to day editor, I wonder if writing my own plugins will change that.
Let see how easy it is to write a plugin for Redcar.
What’s da big idea
The idea for my first plugin is rather ambitious considering I’ve no idea how to write a plugin. I’d like to replicate some of the functionality of Live Reload – basically refresh a browser web page whenever I save a file in Redcar. This will save me constantly hitting refresh in the browser when working with Backbone.js.
I’m hoping to trap the save event of Redcar and call out to my browser (Chrome) and tell it to refresh the page.
I first followed the install instructions:
All good no problems there (I’m running on a Mac OSX 10.7.1)
I then read the plugin guides I found here:
Setting up a plugin is really easy and well described in the guides listed above. Redcar itself is made up of a bunch of plugin’s so there are no end of great examples to follow in the source code (http://github.com/redcar/redcar)
For trapping the save event I dug into the source code and came across the method project_refresh_task_type which is called on all plugins after a save. To hook into this process my plugin simply defines the method:
This may not be the best place to hook into save, Redcar has the concept of events and that may be a better place to look but for now this is working.
Browser refresh script
RefreshBrowser is a Redcar::Task which I have created to run the browser refresh script.
I managed to find a script to refresh the browser here:
The script uses a keyword to identify which tab to refresh in the browser so I needed this to be saved and configurable somewhere. Luckily Redcar has a storage mechanism built right in.
Redcar’s storage mechanism allows you to easily store configuration data into a yaml file.
@storage ||= Plugin::Storage.new('live_reload_plugin')
Here I am using this mechanism to store the ‘keyword’ used by the RefreshBrowser task. This allows the user to edit the yaml file via the Redcar plugin preferences. It’s also possible to setup a nice edit page but for now this will do.
You can find the source for this plugin here:
Was it easy?
YES! The Redcar team have done a great job and made it incredibly easy to create your own plugins. In a couple of hours I made a useful plugin, useful to me at least. I’ve spent more time fussing over this blog post than developing the plugin.
So what you waiting for? Go give it a try!
It seemed almost impossible to penetrate the fortress that is Sharepoint with only NTLM authentication enabled. Turns out its really easy when you know how.
curl to the rescue!
You can upload files using curl directly into Sharepoint via it’s HTTP PUT interface.
curl --ntlm --user username:password --upload-file myfile.xls https://sharepointserver.com/sites/mysite/myfile.xls
Told you, easy when you know how.
Notes on setting up Shibboleth against an Apache Reverse Proxy to TorqueBox.
Config File: /etc/httpd/conf.d/shib.conf
ShibRequestSetting requireSession 1
ShibUseHeaders On‘ setting tells Shibboleth to pass along its attributes as request headers so your sinatra/rails application can gain access to them allowing you to implement your own authorisation system.
If you don’t need a complex authorisation system and you don’t mind users seeing a standard Shibboleth authorisation error page:
You can implement this via your Shibboleth settings using the require statement:
ShibRequestSetting requireSession 1
require grouper_groups ~ MySecurityGroup
Here we require the custom grouper_groups attribute matches on the regular expression after the ‘
~‘. Basically to access the protected url the user must be a member of the MySecurityGroup.
When playing with your Shib settings don’t forget to restart httpd to see the affect.
sudo /sbin/service httpd restart
Setup Apache as a Reverse Proxy in front of a standalone Torquebox server.
For this to work Apache must have the mod_proxy module loaded:
Config file: /etc/httpd/conf/httpd.conf
ProxyRequests Off # Switch off forward proxy
ProxyPreserveHost On # Pass host name onto the proxy
ProxyPass /myapp http://localhost:8080/myapp/ # Map url to remote server
ProxyPassReverse /myapp http://localhost:8080/myapp/ # Adjust header sent from remote server to match url
Here we are passing all calls to the /myapp/ url on to the Torquebox server http://localhost:8080/myapp/
In your Torquebox application folder create a file ‘config/torquebox.yml’ which contains a context which matches the Apache reverse proxy url.
I’m playing with latest version of TorqueBox (Currently 2.x.incremental.245) the easiest way to install it is via a gem:
gem install torquebox-server --pre --source http://torquebox.org/2x/builds/LATEST/gem-repo/
Full details on the TorqueBox blog (http://torquebox.org/news/2011/06/10/torquebox-gem/).
Anyhoose when doing the gem install on my dev server (CentOS 5.6) I got the error:
Error: Your application used more memory than the safety cap of 500m.
Specify -J-Xmx####m to increase it (#### = cap size in MB).
After a bit digging around it turns out you need to set the heap size when running the gem install:
jruby -J-Xmx900m -S gem install torquebox-server --pre --source http://torquebox.org/2x/builds/LATEST/gem-repo/
More details on stackoverflow.
Hope that helps someone or maybe me if have to do this again!
ADDING KEY TO SERVER
scp ~/.ssh/id_rsa.pub email@example.com:~/.ssh/authorized_keys
sudo mkdir /home/git/myrepo
sudo git --bare init
sudo chown -R git:git /home/git/myrepo
# add some files
git add .
git commit -m "added some files"
git remote add origin firstname.lastname@example.org:myrepo
git push origin master
rm -r myrepo/
git clone email@example.com:myrepo
These are the steps I take when creating a new Rails app, documented here for when I forget.
rails new <app_name>
git add .
git commit –m ‘Initial commit’
Remember: Rails generates a .gitignore file for us.
rvm and gemsets
rvm gemset create <app_name>
echo ‘rvm use 1.9.2@<app_name>’ >> .rvmrc
echo ‘.rvmrc’ >> .gitignore
Creates a .rvmrc file in current directory that way when you cd into this directory rvm automatically switches to the correct version of ruby and the gemset we just created.
Change in and out of the directory to get rvm to kick in:
Edit ./Gemfile and add the following lines.
group :test do
Then install and run bundler:
gem install bundler
Generate the rspec files:
rails g rspec:install
Extracts a selection into a method and places it above the current method.
The refactoring: http://www.refactoring.com/catalog/extractMethod.html
rem is the default binding for this refactoring, think Refactor Extract Method.
Rename Instance Variable
Renames the selected instance variable.
rriv is the default binding for this refactoring, think Refactor Rename Instance Variable.
Rename Local Variable
Renames the selected local variable.
rrlv is the default binding for this refactoring, think Refactor Rename Local Variable.