I’ve started a new ruby blog. Whereas this one tends to longer posts (and not just ruby), the other is intended for short, tight pieces which focus on a single idea. In general they will be in the format of “mini sagas“. I’m shooting for daily updates on it.
Are you limited in what software you can use at work? This article details how to have a web based tool suite for mysql. It currently has the following tools:
- AjaxMyTop — a php implementation of mytop (think top for mysql) which runs in a browser.
- rbdb — a phpmyadmin work-alike in progress. It’s the result of the 2008 Rails Rumble contest.
So you’ve noticed that both a php and a ruby application are included. Pretty spiffy, eh?
The magick partly lies in the container — I’m using GlassFish v3 prelude. Another piece is Quercus, a Java implementation of PHP 5. JRuby is used for ruby.
Continue reading ‘Web Based Portable mysql tool suite’
This is a how-to for using jmx and rrd4j, a java implementation of rrdtool, to report on app server statistics.
Thanks to Jeff Mesnil(author of jmx4r), Werner Schuster (JMX the Ruby way with jmx4r), sishen (JRobin sucks), and the rrd4j team.
You’ll need the following:
- JVM 1.5 or higher — JRE is not enough, you also need the JDK. Remember to set your
JAVA_HOME— JRuby needs it. - JRuby — I’m using 1.1.4. Note: You need to be sure to set the
JRUBY_HOMEand make sure that${JRUBY_HOME}/bincomes in$PATHprior to any other ruby installation. Otherwise, your results will be indeterminate. - jmx4r — this is a gem and can be installed by
jruby -S gem install jmx4r
- rrd4j — in order to get this, you need to create an account on java.net. Once you’ve done that, you can download the library via subversion:
svn co https://rrd4j.dev.java.net/svn/rrd4j/trunk rrd4j --username <em>username</em>
Replace
usernamewith your java.net username. You’ll need ant to build it:cd rrd4j/rrd4j; ant
Or you can download the jars: rrd4j jars
- An application which responds to jmx queries — this example is using jconsole since it is a standard part of the java distribution in 1.5 and after.
Before we do much else, let’s verify that jconsole is working:
jconsole -J-Dcom.sun.management.jmxremote.port=64850 -J-Dcom.sun.management.jmxremote.authenticate=false -J-Dcom.sun.management.jmxremote.ssl=false
Choose for the port some large nuimber… Your screen will look something like this for 1.5 (ignore the cutoff bits, I’m writing this on chibi):
Ok, now that we’ve got that going, let’s attempt connecting via jmx4r…
$ jruby -S jirb irb(main):001:0> require 'rubygems' => true irb(main):002:0> require 'jmx4r' => true irb(main):003:0> require 'java' => false irb(main):004:0> JMX::MBean.establish_connection :host => "localhost", :port => 64850 => #<#:0x1bd06a0 @java_object=javax.management.remote.rmi.RMIConnector$RemoteMBeanServerConnection@12f9ee1> irb(main):005:0> memory =JMX::MBean.find_by_name "java.lang:type=Memory" => #"NonHeapMemoryUsage", "verbose"=>"Verbose", "object_pending_finalization_count"=>"ObjectPendingFinalizationCount", "heap_memory_usage"=>"HeapMemoryUsage"}, @mbsc=#<#:0x1bd06a0 @java_object=javax.management.remote.rmi.RMIConnector$RemoteMBeanServerConnection@12f9ee1>, @operations={"gc"=>["gc", []]}, @object_name=#> irb(main):006:0> memory.heap_memory_usage => # irb(main):012:0> memory.heap_memory_usage.keys => #<#:0x129dcc0 @java_object=[committed, init, max, used]> irb(main):015:0> memory.heap_memory_usage.to_s => "javax.management.openmbean.CompositeDataSupport(compositeType=javax.management.openmbean.CompositeType(name=java.lang.management.MemoryUsage,items=((itemName=committed,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=init,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=max,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=used,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)))),contents={committed=7569408, init=0, max=66650112, used=3952968})" irb(main):020:0> memory.heap_memory_usage["committed"] => 7569408 irb(main):021:0> #trigger a gc irb(main):022:0* memory.gc => nil irb(main):023:0> memory =JMX::MBean.find_by_name "java.lang:type=Memory" => #"NonHeapMemoryUsage", "verbose"=>"Verbose", "object_pending_finalization_count"=>"ObjectPendingFinalizationCount", "heap_memory_usage"=>"HeapMemoryUsage"}, @mbsc=#<#:0x1bd06a0 @java_object=javax.management.remote.rmi.RMIConnector$RemoteMBeanServerConnection@12f9ee1>, @operations={"gc"=>["gc", []]}, @object_name=#> irb(main):024:0> memory.heap_memory_usage["committed"] => 7569408 irb(main):026:0> memory.heap_memory_usage["max"] => 66650112 irb(main):027:0> memory.heap_memory_usage["used"] => 4210824 irb(main):028:0> exit $
Cool! now we’re making progress!
More about methods, it’s inspired/spurred by a comment on methods, public_methods, and private_methods by Pit Captain. It also corrects some misconceptions I had (and may have (wrongly) given others).
I’ve added a new category, “eating crow” for this and any other postings where I step back and re-evaluate my posts. This is to keep me honest, and, if y’all would, please feel free to tell me when it’s time to “eat crow”.
Continue reading ‘Class is Class, and Instance, Instance, and never the twain shall meet’
Ruby’s Object has a method, methods. You can use it to see the methods which an object has. Sort of. In this post I’m examining methods, public_methods, and private_methods as well as some of their implications.
Continue reading ‘methods, public_methods, and private_methods’
I have a neglectful relationship with inject. That is, I neglect to remember that it exists, having worked for so long with other languages which are “unfamiliar with the concept”. Amos King’s blog entry on Inject & Me – BFFs got me to thinking that ucat (see cat on steroids (or cat on a hot ruby roof)) could use inject as opposed to the each_byte. So, instead of
def non_printing(line) proc = "" line.each_byte do |c| proc += case c when (0 .. 8): "^#{(c + 64).chr}" when (10 .. 11): "^#{(c + 64).chr}" when (13 .. 26): "^#{(c + 64).chr}" when (27 .. 31): "^#{%w([ \\ ] ^ _)[c - 27]}" when 127: "^?" when ((c & 128) == 128): "M-0#{c.to_s(8)}" else c.chr end end proc end
I can do:
def non_printing(line) line.split("").map{|c|c[0]}.inject("") do |s,c| s += case c when (0 .. 8): "^#{(c + 64).chr}" when (10 .. 11): "^#{(c + 64).chr}" when (13 .. 26): "^#{(c + 64).chr}" when (27 .. 31): "^#{%w([ \\ ] ^ _)[c - 27]}" when 127: "^?" when ((c & 128) == 128): "M-0#{c.to_s(8)}" else c.chr end end end
I still think there needs to be a better way — going from string to an array of strings mapped to an array of bytes so that I can process it via inject seems to be awkward. So, I do some searching and find Object#enum_for (let me plug gotAPI — it’s a great tool for searching a large number of API’s) and come up with:
def non_printing(line) line.enum_for(:each_byte).inject("") do |s,c| s += case c when (0 .. 8): "^#{(c + 64).chr}" when (10 .. 11): "^#{(c + 64).chr}" when (13 .. 26): "^#{(c + 64).chr}" when (27 .. 31): "^#{%w([ \\ ] ^ _)[c - 27]}" when 127: "^?" when ((c & 128) == 128): "M-0#{c.to_s(8)}" else c.chr end end end
That seems cleaner to me. One of the things I love about ruby is that there’s usually more way than one to do something. And it’s often quicker, like in Unix, to go with what you know rather than making it more elegant. However, I also like that it’s easy to write elegant code.
And elegant code is a thing of beauty.
You can download the updated version of ucat.rb (you may need to rename it to ucat.rb)
I got to thinking about SuperIO and how it could be used as a swiss army chainsaw to open files, whereever they might be on the net. From there, my fevered mind got to thinking about cat and how the two could be used together. That said, I present ucat — a universal cat, if you will, which does not need to be herded, but rather will do as you ask. It’s expecting to be able to find SuperIO, so you’ll need to make it available.
Continue reading ‘cat on steroids (or cat on a hot ruby roof)’
Quotes can provide inspiration or food for thought. In this entry, I’m examining the use of open-uri and feed-normalizer to get a random quote which could be used as either a thought for the day or a “fortune” replacement.
In this blog entry, dear reader, we examine the statemachine and treetop gems via an old standby, a Zork imitation. And, despite the title, you won’t find a grue.
$ ruby adventure.rb This is the beginning. Like all tales, there's a beginning, a middle and an end.... Paths lead n. What do you want to do? n This is a path in the forest, it looks fairly well travelled. You see a clearing to the east Paths lead w, n, e, s. What do you want to do? e This is a clearing. You can actually see the sky here. Compared to the deep dark forest, it seems a relief. A path can be seen to the west. Paths lead w, n, e, s. You see the following: letter. What do you want to do? get letter Ok, you pick up the letter. What do you want to do? w This is a path in the forest, it looks fairly well travelled. You see a clearing to the east Paths lead w, n, e, s. What do you want to do? w You're lost in the depths of the forest. You're not sure where you are, nor how to get out of there. Paths lead w, n, e, s. What do you want to do? quit
Continue reading ‘A “grue”some look at Statemachine and Treetop’
Yesterday, I posted an article entitled Break my code, please, wherein I posted a very fragile piece of code, with the challenge to find ways in which to break it.
What follows is a discussion of the code and why it is bad/fragile/easily broken…..
Continue reading ‘Why my code is broken….. (break my code redux)’
- administrivia (6)
- books (1)
- Computers (2)
- css (3)
- eating crow (1)
- games (1)
- glassfish (1)
- gotchas (17)
- howto (2)
- idiocy (3)
- javascript (4)
- jboss (5)
- jruby (7)
- Just Enough Programming (7)
- life hacking (2)
- mini sagas (1)
- miscellany (1)
- monitoring (1)
- mysql (1)
- philosophy (4)
- php (1)
- programming (17)
- rails (7)
- rants (2)
- refactoring (1)
- ruby (14)
- tips (9)
- tools (2)
- torquebox (1)
- Uncategorized (9)
- utilities (3)
- web (5)
- web design (3)




