For whatever reason, Ruby DBI and DBD have axed the quote method from their midst, breaking compatibility with previous versions. Sadly I couldn’t find any clues as to why it was removed (actually, bluntly commented out).
Fortunately I was able to unearth some hints how to restore this method and with an added fix to NilClass, the result seems to be working fine:
# For some unknown reason quote method is commented out at:
# https://github.com/raphaelcosta/rails-dbd-mysql/blob/master/lib/dbd/mysql/database.rb
#
# Restoring it for b/w compliance
module DBI::DBD::Mysql
class Database < DBI::BaseDatabase
def quote(value)
case value
when String
"'#{@handle.quote(value)}'"
when DBI::Binary
"'#{@handle.quote(value.to_s)}'"
when TrueClass
"'1'"
when FalseClass
"'0'"
when Array
value.collect { |v| quote(v) }.join(", ")
when DBI::Date, DBI::Time, DBI::Timestamp, ::Date
"'#{value.to_s}'"
when ::Time
"'#{value.rfc2822}'"
when NilClass
"NULL"
else
value.to_s
end
end
end
end
Just place this in some file and require it in your code.
How to quickly mount partitions when the need arises? A small AppleScript to help you out.
The need
No good comes without little drawbacks. When I swapped ODD with HDD, I noticed that it was quite a bit noisier than SSD and even compared to similar MBP with HDD in original bay (probably because ODD bay has a slot that lets noise out easily). So, now I tend to eject the secondary disk when I don’t need it, so my Mac can spin it down. All nice and dandy, but reattaching it when needed was a bit tedious.
The Script
set partList to {"Meedia", "BOOTCAMP"}
choose from list partList with prompt "Choose partitions" with multiple selections allowed
if result is not equal to false then
repeat with part in result
do shell script "diskutil mount " & part
display dialog "Volume " & part & " mounted"
end repeat
end if
This script asks for which of the partitions to mount and then iterates with diskutil through the selection.
Download
You can copy-paste the above script to AppleScript Editor and adjust it to your needs, or you can download this as a ready to use application.
Setting up solid Ruby on Rails developer box based on Windows can be tedious task. More so than on other platforms, because vanilla Windows is meant for end user and lacks proper development tools that exist on other platforms. But fear not, there are many good people out there that have jumped through multitude of hoops to get different parts of the ecosystem working. All that remains is to build a solid foundation for developmer from them.Read More »
Often I find myself in a situation where I need to quickly paste some text and edit it a bit. Switching to TextMate also switches spaces to my last TM session, which might not be my current space. With other programs (and TextMate 1 for that matter) this can be overcome by selecting “New file” or “New window” from dock menu.
But the problem is that TextMate 2 alpha currently does not have
“New file” option in the Dock menu. I really miss this, because of my workflow – I use spaces to manage projects and programs I have open concurrently and I don’t want to mix the TextMate windows between spaces. So opening new TM2 window in current space is a must.
But surely the developers are preoccupied with more important features and thus I decided to throw in my 2 cents and cobbled together an AppleScript that one can use to open new window in current space.
TMNewWindow
Place this script in your Applications folder and wait until Spotlight has indexed it. Then push whatever shortcut you have for Spotlight (or Alfred, if you are like me) and enter few first chars. I have found that tmn is enough to trigger this application.
Hitting enter will fire this app and a sec later new TextMate window should be opened in current space. Definitely faster than switching to TM2, hitting ⌘N and then moving the window to correct space.
Facing the question which Ruby Rack server perform best behind Nginx front-end and failing to google out any exact comparison, I decided to do a quick test myself.
Later I tried to test UWSGI server too as it now boasts built-in RACK module, but dropped it for two reasons: (1) it required tweaking OS to raise kern.ipc.somaxconn above 128 (which none other server needed) and later Nginx’s worker_connections above 1024 too and (2) it still lagged far behind at ~ 130 req/s, so after successful concurrency of 1000 requests, I got tired of waiting for the tests to complete and gave up seeking it’s break point. Still, UWSGI is very interesting project that I will keep my eye on, mostly because of it’s Emperor and Zerg modes and ease of deployment for dynamic mass-hosting Rack apps.
As UWSGI was originally developed for Python, I wasted a bit of time trying to get it working with some simple Python framework for comparison, but probably lack of knowledge on my part was the failure of it.
To set up a basic testcase, I wrote a simple Rack app that responds every request with the request IP address. I dediced to output IP because this involves some Ruby code in the app, but should be rather simple still.
ip = lambda do |env|
[200, {"Content-Type" => "text/plain"}, [env["REMOTE_ADDR"]]]
end
run ip
Tweaking the concurrency number N (see below) with resolution of 100, I found out the break point of each of the servers (when they started giving errors) and recorded the previous throughput (the one that didn’t give any errors).
Results
The results are as follows:
Unicorn – 2451 req/s @ 1500 concurrent request
Thin – 2102 req/s @ 900 concurrent requests
Passenger – 1549 req/s @ 400 concurrent requests
The following are screenshots from JMeter results:
None of these throughputs are bad, but still Unicorn and Thin beat the crap out of Passenger.
Details
The JMeter testcase
ramp up to N requests concurrently
send request to the server
assert that response contains IP address
loop all of this 10 times
Nginx configuration:
# Passenger
server {
listen 8080;
server_name localhost;
root /Users/laas/proged/rack_test/public;
passenger_enabled on;
rack_env production;
passenger_min_instances 4;
}
# Unicorn
upstream unicorn_server {
server unix:/Users/laas/proged/rack_test/tmp/unicorn.sock fail_timeout=0;
}
server {
listen 8081;
server_name localhost;
root /Users/laas/proged/rack_test/public;
location / {
proxy_pass http://unicorn_server;
}
}
# Thin
upstream thin_server{
server unix:/Users/laas/proged/rack_test/tmp/thin.0.sock fail_timeout=0;
server unix:/Users/laas/proged/rack_test/tmp/thin.1.sock fail_timeout=0;
server unix:/Users/laas/proged/rack_test/tmp/thin.2.sock fail_timeout=0;
server unix:/Users/laas/proged/rack_test/tmp/thin.3.sock fail_timeout=0;
}
server {
listen 8082;
server_name localhost;
root /Users/laas/proged/rack_test/public;
location / {
proxy_pass http://thin_server;
}
}
As is only logical, having processes match the number of cores (dual HT = 4 cores) gave best results for both Thin and Unicorn (thouch the variations were small).
Unicorn configuration
Passenger requires no additional configuration and Thin was configured from command line to use 4 servers and Unix sockets, but Unicorn required a separate file (I modified Unicorn example config for my purpose):
I admit that this is extremely basic test and with better configuration much can be squeezed out from all of these servers, but this simple test surved my purpose and hopefully is of help to others too.
I have searched several times how to produce graph tree in terminal similar to Gitk or other GUI visualizers. Compiling the knowledge in this StackOverflow question together, I came up with the following command:
UPDATE: I added author name to the end of line in bold so that you can blame people quicker.
UPDATE 2: I changed the command to use Git color codes instead of ANSI to ease reading
This produces graph shown on the image.
(Unfortunately the %d placeholder does not support separate colors for local and remote branches, as --decorate itself does, which would be even better.)
To make it useful, I have aliased all of this for a much shorter command git tree, which can be done with the following git config line:
Today I woke up with a new name for my blog. It is now known as CommitBlog.
Simple as that.
The why
When starting something new, there is always the problem with the name. The worst part is that, most of the time, you need to come up with a name just in the middle of creation and when you least know, whether the beast will walk, swim or fly. And the name sticks. And sometimes the name stinks too. After some initial moments, I never really liked the name Brolog (being not-so-clever wordplay on Prolog and Blog). Given that I have never actually seen Prolog in action and know nothing of the language it seemed a bit false. So today I woke up and had a new name, that relates more to what I do daily – commit to GIT. Or write to commitlog if you will.
Heckert’s original script unfortunately broke for me several times and I took the opportunity to rewrite it and make it more extendable for future.
USAGE
Install the gem
gem install inkscape_merge
Create files
Create CSV data file with first row as a header. The values from this row are used as keys in the SVG file substitution.
Create SVG file that contains some variables in the form:
%VAR_name%
Where `name` is the name of a column in the CSV file created previously. These variables can be anywhere inside the SVG, from plain text nodes to color values. This script just brute-forcedly `gsubs` these values as text w/o any thought.
Run the script
The script requires at least three arguments:
the input SVG file
the input CSV file
and the output file `pattern`
Note: output pattern undergoes the same substitutions as the SVG file, so to create easily unique file names. Additionally the output pattern can contain `%d` which is replaced with current row number.
How to get the root of your site, regardless of the folder depth of your script while taking into account any Aliases your webserver might have?
Say, for example, that you have in your apache conf the following lines:
DocumentRoot /var/www/htdocs
Alias /phpsite /var/www/mysite
That means that your PHP site resides in /var/www/mysite, while rest of your web resides in /var/www/htdocs. How will your PHP scripts know that /phpsite portion, without hardcoding this into scripts, when they do not know how many levels deep in directory structure they themselves are in your site (e.g /phpsite/posts/update.php).
First, if you already don’t have, create a script (call it what ever you like, e.g. config.php) somewhere in your site folder. Preferred is at the top level, but subfolders work too (more on this later).
If you placed your config.php in some subfolder, then you have to multiply the dirname() calls for every subfolder level. E.g if your config.php is in conf/config.php, i.e second level, you need 2 dirname() calls and your 4th line should look like:
dirname(dirname(__FILE__))
Third, include this file in every script, even in subfolders and prepend to links:
What this script does is actually rather simple string algebra. The contents of those special variable is as follows:
$_SERVER['SERVER_NAME']
# => example.com
__FILE__
# => /var/www/mysite/config.php - the name of the script where this is written
$_SERVER['SCRIPT_FILENAME']
# => /var/www/mysite/dir/script.php - the full path to script that included config.php
$_SERVER['SCRIPT_NAME']
# => /phpsite/dir/script.php - the URL path of the script that included config.php
You might already start to grasp what we’re about to do. Leaving aside the obvious hostname part, what the str_replace part does is the following:
calculate filesystem path to the base of the site: dirname(__FILE__): /var/www/mysite/config.php => /var/www/mysite
substract this path from the SCRIPT_FILENAME => /var/www/mysite/dir/script.php => /dir/script.php
substract the result from the URL SCRIPT_NAME => /phpsite/dir/script.php => /phpsite
This method works even if you change the Alias or remove it altogether.
I needed a way in vim config to use counters and what better way, but to write a function to simultaneously handle all variables and optinally increase or decrease them:
" define and manage counters
" NB! all counters are namespaced globally (g:)
function! Counter(name,...)
" check if this variable already exists or should we initialise it
if !exists("g:" . a:name)
exec 'let g:' . a:name .' = 0'
endif
" if second parameter is given, increase/decrease value
if a:0 > 0
exec 'let g:'. a:name .' = g:' . a:name . ' + ' . a:1
endif
exec 'return g:' . a:name
endfunction
Usage of the function is as follows:
" Get the current value
echo Counter('mycount')
" Increase value by 1(and return the new value)
echo Counter('mycount', 1)
" Decrease value by 2
echo Counter('mycount', -2)