ruby-mine

exploring the mine

phpBB+Thunderbird+Ruby+MacOS = bbNotify

von murphy am 15.09.2007 (23 Uhr)

Ein kleines Ruby-Script soll aktiven phpBB-Neutzern dabei helfen, schnell und einfach über Neuigkeiten informiert zu werden. Eine Lösung von murphy speziell für Thunderbird und MacOS.


Vollständigen Artikel lesen...
 
Kommentare (1)

PHP Kompatibilität

von bovi am 11.05.2007 (01 Uhr)

(nur zur Sicherheit:)

Vorsicht, dieser Code ist der Nachbau einer PHP-Sicherheitslücke. Bitte nicht benutzen!

Aus aktuellem Anlass eine Nachbesserung im Verhalten von require:

require 'open-uri'

module Kernel
  alias_method :require_old, :require

  def require params
    if params =~ /\A(ftp|http[s]?)/
      eval open(params).read
    else
      require_old params
    end
  end
end

Hier zum Test:

require 'http://www.ruby-mine.de/assets/2007/5/10/remote_1.rb' 
#=> i'm far away

Anhang von murphy

Vergiss nicht:

require 'cgi'
cgi = CGI.new
for name, value in cgi.params 
  eval("#{name}=#{value}")
end
 
Kommentare (8)

Ruby und Unicode

von murphy am 28.01.2007 (22 Uhr)

Nichts neues, aber dennoch mal interessant: Unicode-Zeichen in Ruby-Programmen.


Vollständigen Artikel lesen...
 
Kommentare (2)

Is This Ruby? Yes!

von murphy am 03.11.2006 (02 Uhr)

ruby -c

Is this Ruby? Yes! Rails is for many in this world Fast Enough: We got sites actually doing millions of dynamic page views per day; amazing. Maybe you end up being with the Yahoo or Amazon front page; it's unlikely that an off-the-shelve framework in ANY language will do you much good. You' ll probably have to roll your own. But sure. I'd like free CPU cycles too. I just happen to care much more about free developer cycles and am willing to trade the former for the latter - What';s your opinion?

25 x warning: parenthesize argument(s) for future version
Syntax OK

Ich glaube, sowas geht echt nur in Ruby ^_^
Der Text ist von David Heinemeier Hansson, hab nur ein bisschen umformuliert.

Korrektur: PHP akzeptiert das natürlich auch. Weil kein <? drin vorkommt.

 
Kommentare (7)

Ein höllisch ineffizienter Zufalls-String-Generator

von murphy am 10.10.2006 (02 Uhr)
a = 'AAAA'
rand(26**a.size).times { a.succ! }
puts a
 
Kommentare (3)

Counter ohne Ruby mit Ruby

von murphy am 15.08.2006 (03 Uhr)

Licenser (aka Heinz N. Gies, ein alter Schulfreund von mir) hat endlich ein Blog! Dort beschreibt er einen originellen One-Liner, mit dem man die Rails-Logs zu einer einfach Besucherstatistik auswerten kann:

cat log/production.log | grep "^Processing" | \\
awk '{print $4}' | sort -u | wc | awk '{print $1}'


Vollständigen Artikel lesen...
 
Kommentare (2)

:Einzeiler.reloaded

von bovi am 13.07.2006 (21 Uhr)
Für alle Fans der Perlchen Einzeiler gibt es eine kleine Liste von Ruby Verwandten. Ich persönlich hätte die cat Befehle in Ruby implementiert, aber die Unix Leute lieben halt Ihre Pipes.
 
Kommentare (1)

dont do ... end

von murphy am 09.07.2006 (19 Uhr)

Syntax-Sonntag! Heute:

Blöcke Auskommentieren mit Ruby

Der einfache Kommentar in Ruby ist bekannt:

# Ich gehe bis zum Zeilenende.

Eigentor.create :author => 'Petit'  # ^_^

# Gibt eine zufällige natürliche Zahl zurück.
def random_number
  23
end
Ruby hat eine zweite, weniger bekannte Kommentar-Variante:

=begin
= Mehrzeilige Kommentare
* waren wohl ursprünglich für die Dokumentation vorgesehen
* haben sich aber nicht durchgesetzt
* man benutzt stattdessen RDoc-Kommentarblöcke mit vielen #.
=end

Ziemlich unhandlich, wenn man einfach etwas auskommentieren möchte. Zudem kann man diese mehrzeiligen Kommentare nicht schachteln.

Häufig möchte man einen Ruby-Block ausklammern – ein if, ein def, eine Klasse. Wie macht man das am einfachsten?


Vollständigen Artikel lesen...
 
Kommentare (1)

:to_src

von bovi am 10.06.2006 (00 Uhr)

Die meißten von euch kennen bestimmt den Begriff Reflection. Hinter diesem Wort versteckt sich in der Informatik die Möglichkeit, das eigene Programm zur Laufzeit zu inspizieren. Ruby stellt uns hierfür einige Methoden zur Verfügung:

#kennt dieses Objekt die Methode 'length'?
'ich String, du nix'.respond_to?(:length)

#Welche Methoden besitzt dieses Objekt?
%w{ich array , so what ?}.methods

Wie man sieht, kann man schon eine Menge von einem Objekt erfahren. Jedoch bilden diese Informationen nur einen Bruchteil des gesamten Spektrums. Stellt euch vor ihr stellt euch vor einen Spiegel. Auf Anhieb seit ihr natürlich erfreut, dass ihr euer Antlitz erblicken könnt. Wäre es jedoch nicht erstrebenswert, wenn Ihr auch euren knackigen Po optisch erforschen könntet? Hierfür gibt es ja diesen tollen Trick: Man stelle sich vor einen Spiegel und positioniere hinter sich einen weiteren. Nun kann man, wenn man sich ein wenig dreht, teilweise seinen Rücken sehen… Mhhhh… Man kann natürlich auch einen Freund bitten mithilfe der Handykamera ein Bild zu schießen. Dies sollte auch einfacher sein, denn wer hat heutzutage noch einen Spiegel? An dieser Stelle, ergibt sich nun die folgende Behauptung: Wenn wir einfach durch einen zweiten Spiegel eine Introspektion unseres gesamten Körpers durchführen können, müsste dies doch bei Ruby ähnlich einfach funktionieren.

Ich spreche von Code und ich meine Code


Vollständigen Artikel lesen...
 
Kommentare (4)

ruby -h

von murphy am 04.05.2006 (00 Uhr)

Heute habe ich wieder gesehen, wie nützlich Ruby-Einzeiler sind. Das Kommando ruby akzeptiert die aus Perl bekannten Schalter-e, -n und -p.

Reales Beispiel aus der LaTeX-Welt

Hinweis: Ich hoffe doch mal, jeder kennt LaTeX!

Mein Arbeitgeber (und Prof) hat uns die TeX-Quellen seiner Vorlesung gegeben. Ich wollte herausfinden, wofür er die notes-Umgebung bisher eingesetzt hat. Dafür hätte ich mehrere Dokumente einzeln öffnen und nach solchen Blöcken durchssuchen müssen:

\begin{notes}
Beispiel:
$\phi:=\exists x( Ryz\wedge \forall y(\neg y\eq x\vee  Ryz))$.
\end{notes}

Wir sind doch nicht mehr im Mittelalter! Konsole öffnen, Ruby fragen:

ruby -ne "print if /\\\\begin\\{notes\\}/ .. /\\\\end\\{notes\\}/" *.tex
\begin{notes}[1A]
  Beispiele an der Tafel
\end{notes}
\begin{notes}[1B]
  Beweis an der Tafel
\end{notes}
\begin{notes}[1C]
  Abgeleitete Regeln werden mit zwei Buchstaben bezeichnet

	Beweise an der Tafel
...

Voilà! Sämtliche Daten, die mich interessieren, werden herausgefiltert.

Am Besten man schickt das gleich an einen Editor, damit man in Ruhe lesen kann:

ruby -ne "..." *.tex | gvim -c "set ft=tex" -

Außerdem brauchten wir noch eine Dokumentation zur Makro-Datei, in der allerhand Abkürzungen in der Form

\\nc{\\Bigmid}{\\;\\Big|\\;}

standen. Einen Prototyp erzeugte ich ebenfalls sehr einfach mittels ruby -ne. 5 Minuten später war das Dokument fertig.

Fazit

Gerade wer Ruby als Hochsprache einsetzt und objektorientiert programmiert, der vergisst leicht, dass Ruby auch eine Scriptsprache ist. Ruby kann praktisch alles, was Perl kann, nur einfacher. Und Perl kann alles, was die Shell kann, nur einfacher.

Wer ruby -h mit perl -h vergleicht, könnte Ruby für einen Perl-Klon halten.

Top 10 Interpreterschalter

Hier die zehn (für mich) wichtigsten Optionen:

1. -w
Ist durch Warnungs-Ignorierende Software wie Rails und RedCloth etwas aus der Mode gekommen. Dennoch: Schaltet die Warnungen an und beachtet sie, wenn ihr selbst entwickelt!
2. -e "puts 'Hello, World!'"
Code direkt ausführen.
3. -Ilib
Erweitert den Suchpfad (aka $:) um lib. Sehr nützlich, wenn man Ruby auf Verzeichnisse hinweisen will, die sie sonst nicht durchsuchen würde.
4. -rdatei.rb
Läd die Datei per require. Funktioniert nicht für Gems.
5. -rubygems
Da Gems sich manchmal überaschend verhalten und ich gerne auch mal ohne sie arbeiten möchte (zu Testzwecken, weil Ruby ohne schneller startet, weil $" dann nicht so unübersichtlich ist), habe ich das automatische Laden von RubyGems auf meinem System abgeschaltet. Hiermit aktiviere ich es wieder.
6. -n
Das Script bzw. der -e-Befehl wird mit while gets; ...; end umschlossen. Die globalen Variablen $_ und $. speichern die mit gets gelesene Zeile (mit Zeilenende) und deren Nummer. print, puts, split usw. arbeiten mit $_ als Standardargument. Das erklärt das mystische print if.
7. -d
Setzt $DEBUG auf true. Man kann sehr einfach ein- und ausschaltbaren Debug-Code in sein Programm einbauen, indem man den betreffenden Zeilen if $DEBUG anhängt.
8. -c
Nicht ausführen, sondern nur die Syntax checken. Bei Dateien, die alleine nicht lauffähig sind, ist das nötig (zB funktioniert class Admin::LoginController nicht, wenn das Modul Admin unbekannt ist.)
9. -h
Weil wir alle Hilfe brauchen.
10. -v
Test nach Neuinstallation oder einfach um rauszufinden, dass auf den dummen Sun-Workstations in unserer Uni noch Ruby 1.6.4 läuft.

Ruby the Shell!

 
Kommentare (2)

Kopf oder Zahl?

von murphy am 16.03.2006 (05 Uhr)

Viele Entscheidungen fallen wesentlich leichter, wenn man einfach eine Münze zur Hand nimmt. Das folgende Stück Ruby-Code erledigt das:

puts %w(Kopf Zahl)[rand(2)]

Wer Zufallszahlen lieber aus dem Internet möchte, ändert rand(2) einfach um in:

Net::HTTP.get('random.org',
  '/cgi-bin/randnum?num=1&min=0&max=1').to_i

(require 'net/http' nicht vergessen.)

Und, wenn ihr random.org auch nicht vertraut, dann könnt ihr auch einfach so oft zweimal werfen, bis sich beide Würfe unterscheiden, und dann das erste Ergebnis nehmen (John von Neumanns Idee). Das funktioniert sogar mit einer "gezinkten" Münze.

next until (result = rand(2)) != rand(2)
puts %w(Kopf Zahl)[result]

Links:

Ruby-Mine übernimmt keine Haftung für entstandene Schäden.
 
Kommentare (2)

Einzeiler: Leerzeilen erkennen

von murphy am 08.03.2006 (09 Uhr)

PHP ist recht seltsam: Man kann den HTTP-Header ändern, aber nur wenn man vorher nicht bereits etwas ausgegeben hat. Dafür reicht auch schon eine Leerzeile. Das Problem tauchte bei mir auf, und nun musste ich alle Dateien des Projektes nach demselben Fehler durchsuchen. Folgender Aufruf genügt:

% ruby -e "Dir['*.php'].each { |f| puts f + ' is buggy.' \\
if File.read(f)[/\\n\\s*\\n\\z/] }"

Dir['*.php'] findet dabei alle php-Dateien im Verzeichnis (rekursive Suche in allen Unterverzeichnissen geht mittels '**/*.php'). Dann wird jeder Dateiname ausgegeben, wenn die Datei mit \n\s*\n (einer leeren Zeile) endet.

Korrektur: \z statt $ am Ende der Regexp.

 
Kommentare (0)