When files have crazy characters in their filename (like ' or ""), it can make creating a robust script challenging. After all, if you write the script with either a single quotation mark or a double quotation mark, the other one will trip you up:
file1 = "my'crazy'file.txt"
file2 = 'my"crazy"file.txt'
system "mv \"#{file2}\" bettername.txt" # fails on file2
system "mv '#{file2}' bettername.txt" # fails on file1
The answer is to use the multiple arguments invocation, which will properly escape your filename to be fully shell compatible:
system "mv", file1, "bettername.txt" # works on file1 or file2
Masahiro Tanaka has been redesigning NArray. Word is that it may be pulled into mainline ruby.
So, what is it like? Amazing from what I can tell. How do you play with it? At least on Ubuntu 10.10, this is what I did (there may be other dependencies I've neglected here):
assumes you have build-essential package installed
wget http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-p0.tar.bz2
tar -xjvf ruby-1.9.2-p0.tar.bz2
cd ruby-1.9.2-p0
./configure --enable-shared --program-suffix=1.9.2
make
make check # optional
sudo checkinstall make install
# [follow the defaults until here:
# NOTE that you want the extra files inside your directory.
# those extra files contain things like the openssl libraries!!
Some of the files created by the installation are inside the build
directory: /home/jtprince/src/ruby-1.9.2-p0
You probably don't want them to be included in the package,
especially if they are inside your home directory.
Do you want me to list them? [n]: n
Should I exclude them from the package? (Saying yes is a good idea) [y]: n
# At this point, you can install the package on machines of the same
# architecture with "sudo dpkg -i ruby-1.9.2_p0-1_amd64.deb" [depending on your arch]
sudo rm /usr/bin/ruby
sudo ln -s /usr/local/bin/ruby1.9.2 /usr/bin/ruby
Okay, now you need to get rubygems working properly. Remember, rubygems comes with ruby 1.9.X, so you don't need to download it separately.
At this point, we have to ensure our soft links point where we want and to tell gems to point to ruby 1.9.2
sudo cp /usr/bin/gem1.9.{1,2}
# then edit /usr/bin/gem1.9.2
# change #!/usr/bin/ruby1.9.1 ==> #!/usr/local/bin/ruby1.9.2
# now set up the soft link so that "gem" calls our gem1.9.2
sudo rm /etc/alternatives/gem
sudo ln -s /usr/bin/gem1.9.2 /etc/alternatives/gem
Maybe it is unnecessary, but I moved my local gem folder so that all my gems are compiled from scratch again to ensure they have been built against 1.9.2. how to set up a local gem environment
http://www.sklav.com/node/4 shows a bash solution to the issue debated here. Regardless of how good a bash script is, it inevitably is not very DRY, I think because it is hard to be DRY in bash scripting.
Here is a ruby solution. Of course, all I did was factor, which is easy in ruby:
#!/usr/bin/env ruby
lame_opts = "--preset standard -q0"
if ARGV.size == 0
puts "usage: #{File.basename(__FILE__)} .flac ..."
puts "output: .mp3"
puts ""
puts "uses lame opts: #{lame_opts}"
puts "retains tag info"
exit
end
tag_convert = {
:tt => "TITLE",
:tl => "ALBUM",
:ta => "ARTIST",
:tn => "TRACKNUMBER",
:tg => "GENRE",
:ty => "DATE",
}
ARGV.each do |file|
tag_opts = tag_convert.map do |key,val|
# comes out as TITLE=
data = `metaflac --show-tag=#{val} #{file}`.split("=",2).last
"--#{key} #{data}"
end
mp3name = file.chomp(File.extname(file)) + ".mp3"
`flac -dc #{file} | lame #{lame_opts} #{tag_opts.join(" ")} --add-id3v2 - #{mp3name}`
end
Fairly easy to follow, especially since we don't repeat ourselves. Most of the code is in creating a useful help message.
For Perl hackers, here is the entire script on a few lines of less than 105 chars per line:
tag_convert = {:tt=>"TITLE",:tl=>"ALBUM",:ta=>"ARTIST",:tn=>"TRACKNUMBER",:tg=>"GENRE",:ty=>"DATE"}
ARGV.each do |f|
tgs = tag_convert.map {|k,v| "--#{k} "+`metaflac --show-tag=#{v} #{f}`.split("=",2).last}.join(" ")
`flac -dc #{f} | lame --preset standard -q0 #{tgs} --add-id3v2 - #{f.sub(/.flac$/i,".mp3")}`
end
There are still ways to compress this further, but it is very concise and surprisingly easy to follow (if you know ruby).
The output (ruby 1.9.1p378 (2010-01-10 revision 26273) [x86_64-linux]):
user system total real
array index 0.730000 0.000000 0.730000 ( 0.745341)
hash index 0.990000 0.000000 0.990000 ( 1.003517)
hash include 1.310000 0.000000 1.310000 ( 1.332846)
set include 1.970000 0.000000 1.970000 ( 2.024808)
The conclusion: Regardless of whether you are going to a string or numeric after rounding, it is faster to round numerically than with sprintf. Also, using the sprintf function is faster than '%'. Usually speed doesn't matter, but when it does...
How do you do operations on rows and columns in R? apply and sweep are the main tools. Here is an example of "autoscaling" (mean center and divide by standard deviation) on each column:
[I verified that this is correct on oocalc]
# 1 -> across the rows
# 2 -> across the columns
m <- matrix(data=c(1,2,3,4,4.5,6,7,8,9,10,11,13), nrow=4, ncol=3)
m
# [,1] [,2] [,3]
# [1,] 1 4.5 9
# [2,] 2 6.0 10
# [3,] 3 7.0 11
# [4,] 4 8.0 13
colmeans <- apply(mymatrix, 2, mean) # the column-wise means
# mc = the column-wise mean centered data
mc <- sweep(m, 2, colmeans, "-") # subtract is the default
col_stdev <- apply(m, 2, sd) # column-wise standard deviations
mcstd <- sweep(mc, 2, col_stdev, "/") # divide by standard deviations
mcstd
# [,1] [,2] [,3]
# [1,] -1.1618950 -1.2558275 -1.024695
# [2,] -0.3872983 -0.2511655 -0.439155
# [3,] 0.3872983 0.4186092 0.146385
# [4,] 1.1618950 1.0883839 1.317465
A basic feature in Excel and OpenOffice Calc is to find and plot the regression line. Here is an example of doing this in R. This is more work in R, but you are sacrificing for more power.
Here is how we get the data out:
x = c(1,2,3,4,5)
y = c(3,4,5,5.1,6.2)
pearsons_r = cor(x,y)
r_squared = pearsons_r^2
fit = lm(y~x) # notice the order of variables
y_intercept = as.numeric(fit$coeff[1])
slope = as.numeric(fit$coeff[2])
Here is how we plot it:
plot(x,y)
abline(lm(y~x)) # again, notice the order
function_string = paste("f(x) = ", slope, "x + ", y_intercept, sep="")
r_sq_string = paste("R^2 =", r_squared)
display_string = paste(function_string, r_sq_string, sep="\n")
mtext(display_string, side=3, adj=1) # top right outside of the margin
Molecular biologists often refer to depictions of cellular processes or structure as cartoons. (here is an example). I think it is a poor word choice. Cartoon is generally used to indicate a humorous depiction or an unfinished product (i.e., a sketch on a carton), so it is somewhat insulting to the creator of the illustration (unless it is, in fact, unfinished or humorous). What I think they are trying to say by calling their diagram a cartoon is something like: "do not forget that this diagram is a vast oversimplification of reality! Proteins are not really boxes and lines are really not protein associations! Proteins aren't made of ribbons!" At times, one also gets the feeling they are trying to convey something more, "Our field is so complex, our diagrams are ludicrously simple compared to reality!" or even, "Aren't I cute for calling this a cartoon even though this is a science talk!"
Fortunately, there are several other words suggesting that a depiction is not a precise representation of reality but rather a simplification that serves to emphasize certain facts or relationships, and they don't carry any of cartoon's demeaning connotations: diagram, figure, illustration, schematic. IMHO, these are vastly preferable for referring to depictions of biological phenomenon. This seems to be well supported by definitions, synonyms, and word associations:
Merriam-Webster (online) diagram
Etymology: Greek diagramma, from diagraphein to mark out by lines, from dia- + graphein to write — more at carve
Date: 1619
1: a graphic design that explains rather than represents; especially: a drawing that shows arrangement and relations (as of parts) 2: a line drawing made for mathematical or scientific purposes
1: a diagrammatic presentation; broadly: a structured framework or plan : outline
figure
Etymology: Middle English, from Anglo-French, from Latin figura, from fingere
Date: 13th century
2 a: a geometric form (as a line, triangle, or sphere) especially when considered as a set of geometric elements (as points) in space of a given number of dimensions b: bodily shape or form especially of a person c: an object noticeable only as a shape or form s moving in the dusk> 3 a: the graphic representation of a form especially of a person or geometric entity b: a diagram or pictorial illustration of textual matter
illustration
Date: 14th century
2: something that serves to illustrate: as a: an example or instance that helps make something clear b: a picture or diagram that helps make something clear or attractive
cartoon
Etymology: Italian cartone pasteboard, cartoon, augmentative of carta leaf of paper — more at card
Date: 1671
1: a preparatory design, drawing, or painting (as for a fresco) 2 a: a drawing intended as satire, caricature, or humor b: comic strip 3: animated cartoon 4: a ludicrously simplistic, unrealistic, or one-dimensional portrayal or version ;
Thesaurus.com
diagram
Part of Speech: noun
Definition: drawing, sketch of form or plan
Synonyms: big picture, blueprint, chart, description, design, draft, figure, floor plan, game, game plan, ground plan, layout, outline, perspective, representation, rough draft
illustration
Part of Speech: noun
Definition: drawing, artwork that assists explanation
Synonyms: adornment, cartoon, decoration, depiction, design, engraving, etching, figure, frontispiece, halftone, image, line drawing, painting, photo, photograph, picture, plate, sketch, snapshot, tailpiece, vignette
cartoon
Part of Speech: noun
Definition: funny drawing, often with dialogue or caption
Synonyms: animation, caricature, comic strip, drawing, lampoon, parody, representation, satire, sketch, takeoff
www.wordassociation.org
associated to diagram
1. chart weak
2. graph weak
3. draw v. weak
4. plan v. weak
5. block v. weak
associated from diagram
1. chart medium
2. picture medium
3. diaphragm weak
4. drawing v. weak
5. graph v. weak