Visualizzazione post con etichetta Ruby. Mostra tutti i post
Visualizzazione post con etichetta Ruby. Mostra tutti i post

venerdì 14 gennaio 2011

Ruby: flatten directory [ENG]

We've organized files in subdirectories according to tags and according to creation date. What if you would like to flatten a tree, moving all files from the sub-directories into a single directory?

"Move all the files from the tree starting at source_dir"
"into dest_dir out of the tree"
def flatten(source_dir, dest_dir)
 Dir.foreach(source_dir) do |filename|
    # exclude current dir and parent dir
    if (!filename.eql?(".") and !filename.eql?("..")) 
     if File.directory?(filename) # subdirectory
       flatten(filename, dest_dir) # recursively flatten subdir
     else #file
       dirname = File.dirname(filename)
       filenameonly = filename[(dirname.length-1)..-1]
       old_name = source_dir + "/" + filename
       new_name = dest_dir + "/" + filenameonly
       puts("moving '#{old_name}' to '#{new_name}'")
       File.rename(old_name, new_name) 
     end
    end
  end
end

# read line parameters

source_dir = ARGV.shift
# default source dir is current dir
if (source_dir == nil) 
  source_dir = "."
end

dest_dir = ARGV.shift
# default destination dir current dir
if (dest_dir == nil)
  dest_dir = "."
end 

flatten(source_dir, dest_dir)

martedì 18 novembre 2008

Google SketchUp & Ruby [ENG]

Google pulled another rabbit out of the hat. Google SketchUp is a full-fledged desktop CAD software with a user friendly GUI. The truly interesting part is the Ruby API which allows to create plugins very easily. I'll give that a try as soon as possible.

giovedì 23 ottobre 2008

AriaDSL Autologin /1

Per poter accedere a Internet con la connessione Ariacom (a.k.a. AriaDSL) occorre ogni volta accedere a una pagina web di login - generata dall'antenna/router - in cui inserire username e password (peraltro uguali per tutti gli utenti). Questa procedura è piuttosto noiosa e tempo fa, in pieno spirito automatizzare a ogni costo, mi misi a studiare il problema, illudendomi che fosse di semplice e rapida soluzione.

La prima idea fu quella di inviare in POST i due parametri tramite uno script Ruby alla pagina di login:

require 'net/http'
require 'uri'
res = Net::HTTP.post_form(URI.parse('http://login.ariadsl.it/login'), {'username'=>'ariadsl', 'password'=>''})
puts res.body

Purtroppo... invalid username or password.

La cosa richiedeva un'analisi più approfondita. Osservando il sorgente della pagina di login notai un interessante frammento legato alla submit del form:

function doLogin() 
{
document.sendin.username.value = document.login.username.value;
document.sendin.password.value = hexMD5('\231' + document.login.password.value + '\077\131\115\326...[SNIP]...\210\040\053\053\173\066\024');
document.sendin.submit();
return false;
}

Quindi:

  1. la password apparentemente "vuota" è in realtà accompagnata da alcuni caratteri aggiunti proditoriamente dallo script
  2. la password viene convertita con una funzione di hash MD5 lato client prima di essere inviata al router

Senza darmi per vinto modificai la pagina salvata in modo che la action del form puntasse a una pagina PHP su WampServer creata appositamente per fare il dump dei parametri della request. Copiai il parametro 'password' e lo incollai nello script Ruby ma... invalid username or password.

Piuttosto perplesso esaminai di nuovo la pagina e... sorpresa (ma fino a un certo punto)! I caratteri di controllo presenti nella pagina erano diversi! Evidentemente vengono generati dal router di volta in volta.

La faccenda stava diventando sempre più interessante... (continua)

mercoledì 6 agosto 2008

Ruby: file sieve [ENG]

I use this rough but simple script to organize the files from a folder into a tree of folders according to the file name. Whene I create a file I add some "tags" to its name. The script moves a file with this name:

[tag1-tag2-tag3] file.ext
to this directory:
tag1/tag2/tag3/file.ext
buildind the tree as it goes.

"Moves the 'tagged' files to the appropriate dir"
def sieve_files(source_dir, dest_dir)
  # default source dir is current dir
  if (source_dir == nil) 
    source_dir = "."
  end
  # default destination dir is "./file_sieve"
  if (dest_dir == nil)
    dest_dir = "/file_sieve"
  end
  pattern = Regexp.new("\\[.*\\].*") # picks file with a "[tag]"
  Dir.foreach(source_dir) do |filename|
    if pattern.match(filename)
      tag = filename[1, filename.index(']')-1] # gets the "[tag]"
      clean_filename = filename[filename.index(']')+2, filename.length].strip() # gets the file name
      dir_structure = tag.split('-') # use tag to determine folder structure
      old_name = source_dir + "/" + filename # builds the directory tree
      new_name = implode(dest_dir, dir_structure) + clean_filename # builds the full path to the file
      create_dir(dest_dir, dir_structure) # creates the directory tree
      File.rename(old_name, new_name) # moves the file
    end
  end
end

"Create path string concatenating the path components" 
"(and stripping them of white spaces)"
def implode(base_dir, dirlist)
  res = base_dir + "/"
  dirlist.each { |item| res += item.strip() + "/"}
  res
end

"Create a directory tree"
def create_dir(base_dir, dirlist)
  dir_to_create = base_dir + "/"
  Dir.mkdir(dir_to_create) unless (File.exist?(dir_to_create))
  dirlist.each do |item|
    dir_to_create += item.strip() + "/"
    Dir.mkdir(dir_to_create) unless (File.exist?(dir_to_create))
  end
end

source_dir = ARGV.shift
dest_dir = ARGV.shift 
sieve_files(source_dir, dest_dir)

venerdì 22 febbraio 2008

Why's (poignant) guide to Ruby

Segnalo un tutorial decisamente originale su Ruby: Why's (poignant) guide to Ruby

NOTA: Il link segnalato è un mirror HTML; Why ha lasciato il libro incompleto, a metà 2009 ha messo offline il sito ed è quasi scomparso da Internet... v. wikipedia

Eclipse Plugin: Ruby Development Tools

Un ottimo plug-in per Eclipse per chi programma in Ruby:
Ruby Development Tools - http://rubyeclipse.sourceforge.net/
Eclipse Update Site - http://updatesite.rubypeople.org/release