TAG | Ruby
Hello everyone,
This is a quick post that should help developers new to Ruby. It may also help out those that have been away from the language for a while. Its just a quick reference to Ruby’s variables and their respective scopes. I know I had a chart to keep it all straight when I first encountered the language.
- @ An instance variable
- [a-z] or _ A local variable
- [A-Z] A constant
- @@ A class variable
- $ A global variable
This information is easily found on the net if you know what you are looking for. I just posted it to help make it even easier to find for those that are new to Ruby, or new to code writing
.
3
Mergesort and Quicksort with Dynamic Languages
4 Comments · Posted by admin in Erlang, Groovy, Ruby, code, python
The other day I was flipping through an algorithms book and came across a section on sorting. I remembered that I had a blast writing them c++ during my undergrad and thought it would be fun to write them in a couple of different languages. I settled on writing a quicksort, and mergesort.
Interesting notes:
1) Python(2.5) returns a None type when appending a value to an empty list which forced me to use ‘+’
>>> ex= [].append()
>>> print ex
>>>None
2) Groovy gave me a java.util.ConcurrentModificationException when I transcribed my Ruby code to Groovy. Because of the fact that I was deleting items from a list that I would read in later(while loop which checks size of left and right), I got this error. Accounting for that, the groovy code is pretty nasty.(anyone that would like to provide a better example without relying on the built in Collections.sort(list) would be welcome)
Here is my code… enjoy!
# javazquez.com ==========MERGE SORT======== -------------RUBY---------------- def merge_sort(ary) return ary if (ary.length <= 1) half = ary.length/2 left = merge_sort(ary[0...half]) right = merge_sort(ary[half..ary.length-1]) result =[] #compare first left and first right while left.length > 0 and right.length > 0 result << (left[0] < right[0] ? left.shift : right.shift) end result.concat((left.length > 0 ? left : right)) return result end ary=[1,5,14,3,2,45,2,0,01,-1] p merge_sort(ary)-----------Python Mergesort------------- def merg_sort(lst): if(len(lst) <= 1): return lst left = merg_sort(lst[:len(lst)/2]) right = merg_sort(lst[len(lst)/2:len(lst)]) result = [] while len(left) > 0 and len(right)> 0: if( left[0] > right[0]): result.append(right.pop(0)) else: result.append(left.pop(0)) if(len(left)>0): result.extend(merg_sort(left)) else: result.extend(merg_sort(right)) return result print merg_sort([8,7,43,2,5])--------Erlang Mergesort------------- -module(mergesort). -export([ms/1,msTestSuite/1]). ms(Lst)->break(Lst). break([]) -> []; break([L]) -> [L]; break(List) -> {Left, Right} = lists:split(length(List) div 2, List), merge(break(Left),break(Right)). merge(L, []) -> L; merge([], R) -> R; merge([Lh|Ltail],[Rh|Rtail])-> if Lh < Rh -> [Lh | merge(Ltail,[Rh|Rtail])]; Lh >= Rh -> [Rh | merge(Rtail,[Lh|Ltail])] end. %to test, run mergesort:msTestSuite(run). msTestSuite(run)-> [mstest1(run),mstest2(run), mstest3(run),mstest4(run), mstest5(run)]. mstest1(run)-> ms([3,2,1]). mstest2(run)-> ms([3,3,3,1]). mstest3(run)-> ms([]). mstest4(run)-> ms([1]). mstest5(run)-> ms([123,0,-1,23,2,34,5,678,7,5,8]).-------------GROOVY MERGESORT-------- def ms(lst){ if(lst.size() <= 1){return lst} def sz=lst.size() int half = (int)(sz/2) def l = lst[0..# javazquez.com ========QUICKSORT======== -----RUBY---------------- def quick_sort(ary) return ary if(ary.length <= 1) greater,less = [],[] pos = rand(ary.length) pivot = ary[pos] ary.delete_at(pos) ary.each{|item| (item < pivot) ? less << item :greater << item} return (quick_sort(less) << pivot).concat(quick_sort(greater)) end ary=[1,5,14,3,2,45,2,0,01,-1] p quick_sort(ary)----------Python Quicksort-------------- import random def quickSort(lst): if(len(lst) <= 1):return lst greater = [] less = [] pivot = lst.pop(random.randint(0,len(lst)-1)) for item in lst: if(item < pivot): less.append(item) else: greater.append(item) return quickSort(less)+[pivot]+quickSort(greater) ary=[1,5,14,3,2,45,2,0,01,-1]----------Erlang Quicksort-------------- -module(quicksort). -export([qsort/1]). qsort([]) ->[]; qsort([Pivot|T]) -> lists:append( [qsort([X || X <- T, X < Pivot]), [Pivot], qsort([X || X <- T, X >= Pivot]) ). -------GROOVY QUICKSORT-------------- def quickSort(lst){ if(lst.size() <= 1){return lst} def greater = [] def less = [] def pivot = lst.remove(new Random().nextInt(lst.size())) lst.each{item-> if(item < pivot){ less.add(item)} else{greater.add(item)} } return quickSort(less)+[pivot]+quickSort(greater) } print quickSort([1,5,14,3,2,45,2,0,01,-1])
algorithm · algorithms · code · Erlang · Groovy · mergesort · Programming · python · quicksort · Ruby · sort · sorting
If your like me, you bounce around between languages a lot. Lately, I have been writing python code. It’s not Ruby
, but it can get the job done. Here is a quick list of similarities between the two languages. I hope it helps… don’t forget to this list in the comments section ![]()
#-----find object methods-----
s="hello, I am a string"
#ruby
puts s.methods
#python
print dir(s)
#find out more about a method using python
help(s.split)
#-----view object's class-----
#ruby
s.class
#python
s.__class__
#------Iterate hashes-------
#ruby
h.each{|key,value| puts "#{key}, #{value}"}
#python
for key,value in h.iteritems():
print key, value
#---ternary operators
#ruby
condition ? var = x : var = y
#python.. not exactly an operator, but you get the meaning
#---- var = y if condition is false
var = x if condition else y
#----lengths------
#ruby
s="hello, I am a string"
puts "Length of string is #{s.length} or #{s.size}"
h={:one=>2,:three=>4}
puts "Length of hash is same as string, #{h.length} or #{h.size} "
#python
print("This is the length of a string %s" % len("string"))
print("number of key/value pair= %d" % len({'one':1,'two':2}))
#---slicing lists/arrays
l=[1,2,3,4,5]
#ruby
l[1..3] #=>[2,3]
#python
l[1:3] #=>[2,3]
#--print string multiple times-----
#ruby
4.times{print "hello"} #=> hellohellohellohello
#python
print("hello" * 4) #=> hellohellohellohello
code · fun · Programming · python · Ruby · Ruby Questions
So for my own geeky pleasure, I decided to try writing cgi scripts with Ruby, Python, PHP, and Perl. All had readily accessible documentation on how to POST to a https URL but ruby. My first thought was to look at the Net:HTTP documentation found HERE.
The one example I wanted was not listed. I did some searching around and pieced together the following code. I hope this is as big a help to you as it was to me. Looking at it, It seems pretty intuitive….but if your like me, sometimes you need it spelled out
As a side note, setting path to path = ‘/../’ is my work-around for a script that is mapped to www.mysite.com rather than ‘/some_POST_handling_script.rb’
#Juan Vazquez ->javazquez.com
require 'net/http'
require 'net/https'
http = Net::HTTP.new('www.mysite.com', 443)
http.use_ssl = true
#path(a.k.a) ->www.mysite.com/some_POST_handling_script.rb'
path = '/some_POST_handling_script.rb'
data = 'badguy=Gargamel'
headers = {'Content-Type'=> 'application/x-www-form-urlencoded'}
resp, data = http.post(path, data, headers)
puts 'Code = ' + resp.code
puts 'Message = ' + resp.message
resp.each {|key, val| puts key + ' = ' + val}
puts data
6
Recursive Directory Search with Ruby and Groovy
No comments · Posted by admin in Groovy, Ruby, code
A while back I was bored and decided I need to brush up on my Ruby chops. I had been wanting to play with threads for quite some time and couldn’t think of anything that would be a fun project to do…until this crazy idea hit me. “Wouldn’t it be cool if could generate multiple threads to search different servers for any file of my choosing?” The code I wrote doesn’t directly do this, but with some minor tweaks it could be done.
I took that idea and ran with it using Ruby. After I finished coding, I thought I would try writing it from scratch using my second favorite language, Groovy (Ruby is my first). I have to admit, writing the Groovy code was more intuitive because of the baked in file/directory iterators. I refactored my Ruby code a few times and ended up using the find module to maximize performance. Below is the code, and as always, I am open to suggestions on other ways of doing it
Ruby code
#########################
# Juan Vazquez
# http://javazquez.com
#########################
require 'find'
class DirectoryWizard
attr_accessor :root_dir,:exts, :thread_cnt, :thread_tracker, :count
#initialize with a root , and file extensions
def initialize(root, t_count,*extensions)
@root_dir, @exts, @thread_cnt , @thread_tracker, @count = root, extensions, t_count, [], 0
end
def start_looking
begin
puts Dir.entries(@root_dir).select{|dir_item| is_in_ext(dir_item) }
list_dirs(@root_dir).each do|di|
@thread_tracker << Thread.new(@root_dir+di){|directory|
recursive_file_search(directory) }
wait_for_running_threads if(@thread_tracker.size > @thread_cnt)
end
wait_for_running_threads
rescue Exception => e; puts e;
end
end
def recursive_file_search(directory)
Find.find(directory){|dir_item|
if(is_in_ext(dir_item))
@count+=1
puts dir_item
end
}
end
#return array of immediate subdirectories excluding . and ..
def list_dirs(directory)
Dir.entries(directory).select{|fh|(!is_p_c_directory?(fh) &&
File.directory?(directory+fh))}
end
#return an array of all file/directories excluding '.' and '..'
def list_contents(directory)
Dir.entries(directory).delete_if{|x| is_p_c_directory?(x)}
end
#is Parent or Current Directory
def is_p_c_directory?(filename);(filename =="." || filename == "..");end
#return an array of files that match ext
def is_in_ext(dir_item); @exts.detect{|ext| dir_item.match(ext)}; end
def wait_for_running_threads
@thread_tracker.each{|th|th.join}
@thread_tracker=[]
end
end #end class
t= DirectoryWizard.new("\\\\server\\e$\\profiles\\",16,'filename')
t.start_looking
puts "Done with Program count is #{t.count}"
Groovy Code
import java.util.regex.*;
class DirWiz{
def root_dir, exts, thread_max_cnt, thread_tracker, count
public DirWiz(String basedir, int t_count, List extensions){
this.root_dir = basedir
this.exts = compile_regex(extensions)
this.thread_max_cnt = t_count
this.thread_tracker = []
this.count=0
}
def start_looking(){
try{
def dir = new File(this.root_dir)
check_for_files(this.root_dir)
//recursively search directories
dir.eachDir{ subDir->
//thread it off
if(this.thread_tracker.size() > this.thread_max_cnt){
this.thread_tracker.each{it->it.join()}
this.thread_tracker=[]
}
this.thread_tracker << Thread.start{
subDir.eachFileRecurse{ fh ->
check_using_compiled_regex(fh.canonicalPath)
}
}
}
}catch(Exception e){
println("error ${e}")
}
this.thread_tracker.each{it->it.join()}
println("Done")
}
def print_if_match(String file){this.exts.each{ext->
if(file=~ext){this.count+=1;println(file)}}
}
def check_using_compiled_regex(String file){
try{
def var = this.exts.find{it.matcher(file).matches()}
if(var){this.count+=1;println(file)}
}catch(Exception e){println("Not a Directory ${dir}\n$e")}
}
def check_for_files(String dir){
try{ new File(dir).eachFile{ file ->
check_using_compiled_regex(file.canonicalPath)
}
}catch(Exception e){println("Not a Directory ${dir}\n$e")}
}
def compile_regex(List list){
List ret_list=[]
list.each{ ret_list << Pattern.compile(it,Pattern.CASE_INSENSITIVE)}
return ret_list
}
}
def t = new DirWiz('c:\\',16,[".*\\.jpg.*"])//look for jpegs
//def t = new DirWiz('\\\\server\\dir\\',16,["filname"])
t.start_looking()
println("Done with the program total number of files is ${t.count}")
I love to learn and try new languages. Not only is learning a new language fun, many times it teaches me something new about a language that I am already familiar with. The only problem that I have with learning so many languages, is keeping them straight. I decided that I would take a few of the dynamic languages I use most often and compile a list of how to handle File I/O with each of them. If you have a Dynamic language(part 2 of this post will be on static languages) not represented below or have another method of File I/O with the represented languages, please add to the list with its respective File I/O code:D
Without further ado…
//Groovy open file for writing
def target ="filename"
File wf= new File(target)
wf.write( "I am in your file eating your space" )
//Groovy open file for appending
def target ="filename"
File af= new File(target)
af.append("I have all of your base")
//Groovy read each line in file
new File("filename").eachLine{line-> println line}
//Groovy read whole document and put into List
List lines = new File("filename").readLines()
//lines contains two lines that we need
println "first line $lines[0]"
println "second line $lines[1]"
//Groovy reading one line
File rf= new File("filename") //open for reading
//read first line, trim, assign to tmp
rf.withReader { line ->tmp = line.readLine().trim()}
//Groovy test if file exists
File src = new File(srcFile)
if (src.exists() ){ println "I exist"}
else{println "I don't exist"}
#Ruby openfile for reading
fh = File.new(path, "r") # open file "path" for reading only
fh.close
#Ruby open file for writing
fout = File.new(path, "w") # open file "path" for writing only
fout.puts "Up, Up, Down, Down, Left, Right, Left, Right, B, A, Select, Start"
fout.close
#Ruby open file for apending
fa= File.new("DeleteMe.txt","a")
fa.puts "I am at the end of file"
fa.close
#Ruby read eachline in a file
File.open("file").each { |line| p line}
#Ruby read entire file to string
fh = File.new(filename)
str = fh.read
#Ruby read entire file into array(each line is an element in the array)
fh = File.new(filename)
str = fh.readlines
#Python Write a file
fout = open("DeletMe.txt", "w")
fout.write("Writing to fout\nCheck it out!")
fout.close()
#Python Read an entire file
fin = open("ReadingTest.txt", "r")
fin_text = fin.read()
fin.close()
print fin_text
#Python read entire file into list
fin = open("ReadingTest.txt", "r")
txt= fin.readlines()
fin.close()
print txt[0]
#Python append to a file
fh= open ( 'DeleteMe.txt', 'a' )
fh.write ( '\n\n\nBottom line.' )
fh.close()
#Perl reading a file
open(FILE, '<', $file) or die "Can't read $file: $!\n";
while(<FILE>)
{
print ;
}
#Perl append to a file
open(FILE, '>>', $file) or die "Can't append to $file: $!\n";
print FILE "text";
close(FILE);
#Perl read and write to a file
#+< allows reading and writing, and keeps the data that was
#already in the file. open() will fail if file doesn't exist.
open(FILE, "+<$file" ) or die ("Can't read|write: $file\n");
close(FILE);
#Perl read and write to a file
#+>allows writing and reading, but replaces/overwrites the
#data in the file if the file exists. Creates it if it doesn't exist.
open(FILE, "+>$file" ) or die ("Can't write or read:$file \n");
close(FILE);
PHP code doesn’t display properly within WordPress, so here is an image of the code
Ok, here is the scoop. I was working on a project using Ruby and needed to grab three characters from a string skipping one character in between.
ex –> “123456789″ would become 234 and 567
I thought this would be a great opportunity to try out blocks in Ruby and test open classes
class String
def blocker(sizeOfGroup,offset)
while(val=self.slice!(0..offset.abs-1))
break if val.to_s.length < 1
yield self.slice!(0..(sizeOfGroup.abs-1))
end
end
end
here is the code I used to test with
string = "12345678910"
ary=[]
string.blocker(3,-1){|v| ary.push(v)}
ary.each{|i|puts i}
puts "her is ary "+ary.inspect
And this is the result.
>>> test.rb
234
678
10
her is ary ["234", "678", "10"]
This was definitely a fun experiment and I can't wait to try out more stuff. If you haven't played around with blocks, give it a try...you just might like it.

