[#313454] Request for Block local methods, and Proc syntax — Patrick Li <patrickli_2001@...>

So after using Ruby for a little over two months, I've made the complete

20 messages 2008/09/01

[#313477] Looking for a regular pattern — Zhao Yi <youhaodeyi@...>

Which pattern represents any characters including space, \t \n?

23 messages 2008/09/01
[#313486] Re: Looking for a regular pattern — "Thomas Wieczorek" <wieczo.yo@...> 2008/09/01

On Mon, Sep 1, 2008 at 10:20 AM, Zhao Yi <youhaodeyi@gmail.com> wrote:

[#313489] Re: Looking for a regular pattern — Sebastian Hungerecker <sepp2k@...> 2008/09/01

Thomas Wieczorek wrote:

[#313490] Re: Looking for a regular pattern — Zhao Yi <youhaodeyi@...> 2008/09/01

Sebastian Hungerecker wrote:

[#313493] Re: Looking for a regular pattern — Sebastian Hungerecker <sepp2k@...> 2008/09/01

Zhao Yi wrote:

[#313496] Re: Looking for a regular pattern — Zhao Yi <youhaodeyi@...> 2008/09/01

Sebastian Hungerecker wrote:

[#313516] Parsing a CSV file column-wise — Chris Lowis <chris.lowis@...>

Is there a short-cut to parsing a CSV file column-wise using any of

14 messages 2008/09/01

[#313724] Hash optimization question — Roger Pack <rogerpack2005@...>

Are there any libraries that overcome this problem:

11 messages 2008/09/03

[#313890] How do I quickly search the end of a huge text file? — Brian Green <gallagherjb@...>

I am trying to create a ruby script that will search a maya ascii file

11 messages 2008/09/05

[#313897] Need a 40 LOC (ignoring comments) to be shorter -- suggestions wanted — RichardOnRails <RichardDummyMailbox58407@...>

Hi All,

12 messages 2008/09/05

[#313946] Who's Charles angry at? — Joshua Ballanco <jballanc@...>

Well, I just came across this in my feed reader:

17 messages 2008/09/05

[#314002] Is Ruby good at GUI develop? — Zhao Yi <youhaodeyi@...>

I want to choose a script to develop a GUI program. I want to know more

18 messages 2008/09/06
[#314011] Re: Is Ruby good at GUI develop? — James Britt <james.britt@...> 2008/09/06

Zhao Yi wrote:

[#314395] Re: Is Ruby good at GUI develop? — Jason Cameron <cameronjc2000@...> 2008/09/10

James Britt wrote:

[#314061] any way to write it in one line ? — Erwin <yves_dufour@...>

works = Array.new

17 messages 2008/09/06

[#314083] json for extjs (without rails) — Gurpal 2000 <gurpal@...>

Hi

14 messages 2008/09/07

[#314090] find a button using mechanize — Li Chen <chen_li3@...>

Hi all,

21 messages 2008/09/07
[#314116] Re: find a button using mechanize — Lex Williams <etaern@...> 2008/09/07

Li Chen wrote:

[#314117] Re: find a button using mechanize — Lex Williams <etaern@...> 2008/09/07

Lex Williams wrote:

[#314126] Re: find a button using mechanize — Li Chen <chen_li3@...> 2008/09/07

Lex Williams wrote:

[#314164] Re: find a button using mechanize — Lex Williams <etaern@...> 2008/09/07

Li Chen wrote:

[#314167] Re: find a button using mechanize — Li Chen <chen_li3@...> 2008/09/07

Lex Williams wrote:

[#314185] Re: find a button using mechanize — Lex Williams <etaern@...> 2008/09/08

Li , I wouldn't try to find a form by searching after it's button .

[#314233] Re: find a button using mechanize — Li Chen <chen_li3@...> 2008/09/08

Hi Lex,

[#314253] Re: find a button using mechanize — Lex Williams <etaern@...> 2008/09/08

Li , please post examples . What is it you want to extract ? From what

[#314133] regular expression match and exclude — Azalar --- <pteale@...>

I am parsing a web page full of image links that also contain links to

13 messages 2008/09/07

[#314199] FileUtils.chdir thread safety — Mr_Tibs <tiberiu.motoc@...>

Hi,

20 messages 2008/09/08
[#314285] Re: FileUtils.chdir thread safety — Mr_Tibs <tiberiu.motoc@...> 2008/09/08

Darn it! It would seem like a good idea.

[#314328] Re: FileUtils.chdir thread safety — "Robert Klemme" <shortcutter@...> 2008/09/09

2008/9/9 Mr_Tibs <tiberiu.motoc@gmail.com>:

[#314360] Re: FileUtils.chdir thread safety — Charles Oliver Nutter <charles.nutter@...> 2008/09/09

Robert Klemme wrote:

[#314299] Drake: Distributed Rake — quixoticsycophant@...

= DRAKE -- Distributed Rake

43 messages 2008/09/09

[#314470] How to operate on 2 arrays simultaneously? — "Patrick Doyle" <wpdster@...>

There has got to be a more elegant solution than this. Suppose I have

19 messages 2008/09/10

[#314529] How to check if a webpage exists — Davide Benini <nutsmuggler@...>

This probably is trivial, but I have been googling for almost 2hs

22 messages 2008/09/10
[#314533] Re: How to check if a webpage exists — "Todd Benson" <caduceass@...> 2008/09/10

On Wed, Sep 10, 2008 at 4:38 PM, Davide Benini <nutsmuggler@hotmail.com> wrote:

[#314534] Re: How to check if a webpage exists — "Axel Etzold" <AEtzold@...> 2008/09/10

[#314572] Re: How to check if a webpage exists — Davide Benini <nutsmuggler@...> 2008/09/11

[#314575] Re: How to check if a webpage exists — Peña, Botp <botp@...> 2008/09/11

RnJvbTogRGF2aWRlIEJlbmluaSBbbWFpbHRvOm51dHNtdWdnbGVyQGhvdG1haWwuY29tXSANCiMg

[#314577] Re: How to check if a webpage exists — Davide Benini <nutsmuggler@...> 2008/09/11

Thanks for your super-fast answer :)

[#314584] Re: How to check if a webpage exists — "Axel Etzold" <AEtzold@...> 2008/09/11

-------- Original-Nachricht --------

[#314585] Re: How to check if a webpage exists — Davide Benini <nutsmuggler@...> 2008/09/11

Hi Axel,

[#314586] Re: How to check if a webpage exists — Peña, Botp <botp@...> 2008/09/11

RnJvbTogRGF2aWRlIEJlbmluaSBbbWFpbHRvOm51dHNtdWdnbGVyQGhvdG1haWwuY29tXSANCiMg

[#314538] pass by reference in each loop — Xiong Chiamiov <xiong.chiamiov+ruby_forum@...>

I have a list of variables that I need to pass through a modifying

19 messages 2008/09/10
[#314574] Re: pass by reference in each loop — Pedro Silva <ei04065@...> 2008/09/11

Hi,

[#314659] Re: pass by reference in each loop — Xiong Chiamiov <xiong.chiamiov+ruby_forum@...> 2008/09/11

Pedro Silva wrote:

[#314660] Re: pass by reference in each loop — Robert Klemme <shortcutter@...> 2008/09/11

On 11.09.2008 23:12, Xiong Chiamiov wrote:

[#314663] Re: pass by reference in each loop — Xiong Chiamiov <xiong.chiamiov+ruby_forum@...> 2008/09/11

Robert Klemme wrote:

[#314563] How to detect blocking? — David Masover <ninja@...>

I've been (barely, occasionally) writing an Actor system for Ruby.

16 messages 2008/09/11
[#314567] Re: How to detect blocking? — Robert Klemme <shortcutter@...> 2008/09/11

On 11.09.2008 06:48, David Masover wrote:

[#314677] Re: How to detect blocking? — David Masover <ninja@...> 2008/09/12

On Thursday 11 September 2008 01:33:25 Robert Klemme wrote:

[#314843] Garbage collecting threads? (was: How to detect blocking?) — David Masover <ninja@...> 2008/09/13

Suppose I start a worker thread, like so:

[#314869] Re: Garbage collecting threads? — Robert Klemme <shortcutter@...> 2008/09/14

On 13.09.2008 22:59, David Masover wrote:

[#314898] Re: Garbage collecting threads? — David Masover <ninja@...> 2008/09/14

On Sunday 14 September 2008 03:24:53 Robert Klemme wrote:

[#314566] How to use this Combinatorial testing technique — Surya <surya5kn@...>

Hi Friends,

13 messages 2008/09/11

[#314590] Advanced conditionals — "Alain m. Lafon" <preek.aml@...>

Hi there,

14 messages 2008/09/11

[#314776] Beginner User having issue with converting char to ASCII — Nick Bo <bornemann1@...>

I am working on this assignment and this is the first class I have used

9 messages 2008/09/12

[#314826] RubyConf hotel: Only single-bed rooms available at group rate? — James Britt <james.britt@...>

Yesterday, the day or the day after I got the RubyConf E-mail giving me

14 messages 2008/09/13
[#314835] Re: RubyConf hotel: Only single-bed rooms available at group rate? — "Gregory Brown" <gregory.t.brown@...> 2008/09/13

On Sat, Sep 13, 2008 at 12:32 PM, James Britt <james.britt@gmail.com> wrote:

[#314838] Re: RubyConf hotel: Only single-bed rooms available at group rate? — James Britt <james.britt@...> 2008/09/13

Gregory Brown wrote:

[#314842] Re: RubyConf hotel: Only single-bed rooms available at group rate? — "Craig Demyanovich" <cdemyanovich@...> 2008/09/13

My partners and I were only able to book a non-smoking room with 1 king bed

[#314856] Re: RubyConf hotel: Only single-bed rooms available at group rate? — James Britt <james.britt@...> 2008/09/14

Craig Demyanovich wrote:

[#314861] A new database access framework for any Ruby (Iron or J) — Post-no-reply Tudbc <post-no-reply@...>

I would like to introduce my new exciting research in TUDBC (Truly

10 messages 2008/09/14

[#314877] how do deal with huge numbers and keep them accurate? — Tomi Zzzz <tomi_z@...>

Hello all, I wrote the following code:

10 messages 2008/09/14

[#314984] how to stream or write data into a tar.gz file as if the data were from files? — bwv549 <jtprince@...>

I have a gazillion little files in memory (each is really just a chunk

13 messages 2008/09/15

[#314989] Getting Employer to Pay for RubyConf — "Clinton D. Judy" <cdj@...>

So I'm just finishing my first year at a real job, and thinking about

15 messages 2008/09/15

[#315083] ANTLR Target for Ruby — arcadio <arcadiorubiogarcia@...>

Hi everyone,

29 messages 2008/09/16
[#315595] Re: ANTLR Target for Ruby — Clifford Heath <no@...> 2008/09/21

arcadio wrote:

[#315598] Re: ANTLR Target for Ruby — "Eric Mahurin" <eric.mahurin@...> 2008/09/21

On Sun, Sep 21, 2008 at 7:56 AM, Clifford Heath <no@spam.please.net> wrote:

[#315110] Gem program -- cannot install libxslt-ruby-0.3.6.gem — Robert Heller <heller@...>

I am trying to install some version of libxslt-ruby on my CentOS 4.7

9 messages 2008/09/17

[#315124] How to clean an xml files from non-utf-8 chars? — Krzysieq <krzysieq@...>

Hi,

19 messages 2008/09/17

[#315125] Threads preventing garbage collection? — Brian Candler <b.candler@...>

I wondered if someone can explain the following behaviour to me.

12 messages 2008/09/17

[#315203] Reseach paper on Ruby. Need references. — Suneel Suneel <suneelgv@...>

Hi,

12 messages 2008/09/18

[#315221] Suggestion for string parsing — Me Me <emanuelef@...>

Hi all,

18 messages 2008/09/18
[#315223] Re: Suggestion for string parsing — Chris Lowis <chris.lowis@...> 2008/09/18

> But I'm sure there's a better way, even considering that the number of

[#315224] Re: Suggestion for string parsing — Me Me <emanuelef@...> 2008/09/18

Thans for answering,

[#315227] Re: Suggestion for string parsing — Peña, Botp <botp@...> 2008/09/18

RnJvbTogTWUgTWUgW21haWx0bzplbWFudWVsZWZAdGlzY2FsaS5pdF0gDQojIEkgd2FzIHRoaW5r

[#315226] Preserve insert order in a Hash — Me Me <emanuelef@...>

Hi,

20 messages 2008/09/18
[#315228] Re: Preserve insert order in a Hash — Peña, Botp <botp@...> 2008/09/18

RnJvbTogTWUgTWUgW21haWx0bzplbWFudWVsZWZAdGlzY2FsaS5pdF0gDQojIEkgd291bGQgbGlr

[#315249] at_exit handler *except* for fatal runtime error — synergism <synergism@...>

How do we execute a handler (I assume via at_exit) when a program

16 messages 2008/09/18

[#315250] why one array continues to grow after repeated call — Li Chen <chen_li3@...>

Hi all,

21 messages 2008/09/18
[#315259] Re: why one array continues to grow after repeated call — "Rick DeNatale" <rick.denatale@...> 2008/09/18

On Thu, Sep 18, 2008 at 8:41 AM, Li Chen <chen_li3@yahoo.com> wrote:

[#315311] Re: why one array continues to grow after repeated call — Randy Kramer <rhkramer@...> 2008/09/18

On Thursday 18 September 2008 09:01 am, Rick DeNatale wrote:

[#315326] Re: why one array continues to grow after repeated call — Brian Candler <b.candler@...> 2008/09/18

> The statement "Line 4 might look like an assignment to the variable a,

[#315342] Re: why one array continues to grow after repeated call — Randy Kramer <rhkramer@...> 2008/09/18

On Thursday 18 September 2008 02:52 pm, Brian Candler wrote:

[#315287] short regexp question — Fritzek <fritz.thielemann@...>

Hi folks

19 messages 2008/09/18

[#315458] RDoc 2.2.0 released — Tony Strauss <tony.strauss@...>

RDoc 2.2.0 now is available!

20 messages 2008/09/19

[#315460] One-Liners Mashup (#177 again) — Matthew Moss <matthew.moss@...>

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

46 messages 2008/09/19
[#315474] Re: [QUIZ] One-Liners Mashup (#177 again) — "Bill Kelly" <billk@...> 2008/09/20

[#315478] Re: [QUIZ] One-Liners Mashup (#177 again) — James Gray <james@...> 2008/09/20

On Sep 19, 2008, at 9:32 PM, Bill Kelly wrote:

[#315476] update a field in CSV file using fastercsv — Li Chen <chen_li3@...>

Hello everyone,

11 messages 2008/09/20

[#315527] for or each? — tekwiz <twarlick@...>

I just used the new roodi gem to check out some of my code that has a

38 messages 2008/09/20
[#315532] Re: for or each? — Phlip <phlip2005@...> 2008/09/20

Phlip wrote:

[#315553] Re: for or each? — Joe Wfel <joe@...> 2008/09/20

It's interesting that array access using 'each' seems to be much

[#315750] Protecting Ruby code — Sasha Bee <rubyman77@...>

We are just starting a new project and it is going to be a commercial

13 messages 2008/09/23

[#315818] Small, simple Ruby applications and sample code? — Double Minus <nathan.wisman@...>

Hi all,

16 messages 2008/09/24

[#315867] Rake dependencies unknown prior to running tasks — Joe Wfel <joe@...>

Say I don't know what all the dependencies are until I've already

13 messages 2008/09/24
[#315872] Re: Rake dependencies unknown prior to running tasks — Mike Gold <mike.gold.4433@...> 2008/09/24

Joe W旦lfel wrote:

[#315873] Re: Rake dependencies unknown prior to running tasks — Mike Gold <mike.gold.4433@...> 2008/09/24

Mike Gold wrote:

[#315912] Getting the right class with inheritance and super() — "Kyle Schmitt" <kyleaschmitt@...>

I'm wondering what the _right_ way is to go about getting the right

12 messages 2008/09/24
[#315941] Re: Getting the right class with inheritance and super() — David Masover <ninja@...> 2008/09/25

On Wednesday 24 September 2008 15:45:13 Kyle Schmitt wrote:

[#315920] Guy Decoux. — "Jean-Fran輟is Tr穗" <jftran@...>

Hello,

32 messages 2008/09/24

[#315954] Gem update on Windows is broken? — Charles Roper <reachme@...>

When I issue the "gem update" command on Windows, whenever it gets to a

17 messages 2008/09/25
[#316019] Re: Gem update on Windows is broken? — Eric Hodel <drbrain@...7.net> 2008/09/25

On Sep 25, 2008, at 01:22 AM, Charles Roper wrote:

[#316027] How to get terminal dimensions without using curses or ncurses? — Kenneth McDonald <kenneth.m.mcdonald@...>

I'd like to be able to print to terminal and do some reasonable

9 messages 2008/09/25

[#316033] How to make Ruby _THE_ scripting language of choice, fold in SQLite — John Carter <john.carter@...>

Much has been written about the OOP / RDBMS impedance mismatch....

20 messages 2008/09/25
[#316046] Re: How to make Ruby _THE_ scripting language of choice, fold in SQLite — David Masover <ninja@...> 2008/09/26

On Thursday 25 September 2008 18:43:31 John Carter wrote:

[#316051] Re: How to make Ruby _THE_ scripting language of choice, fold in SQLite — Clifford Heath <no@...> 2008/09/26

David Masover wrote:

[#316068] my ears are burning... ;) — parrt@...

Hi Gang, sorry I seem to have pissed off the ruby gang. :) Never

13 messages 2008/09/26

[#316106] Cookie Monster (#178) — "Matthew Moss" <matthew.moss@...>

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

17 messages 2008/09/26

[#316144] RubyGems 1.3.0 — Eric Hodel <drbrain@...7.net>

Note! Some versions of RubyGems have a bug that will prevent

15 messages 2008/09/26

[#316316] ruby1.9 block scope — Daniel DeLorme <dan-ml@...42.com>

I could have sworn that one of the firm changes in ruby 1.9 was that

45 messages 2008/09/29
[#316321] Re: ruby1.9 block scope — Yukihiro Matsumoto <matz@...> 2008/09/29

Hi,

[#316323] Re: ruby1.9 block scope — Daniel DeLorme <dan-ml@...42.com> 2008/09/29

Yukihiro Matsumoto wrote:

[#316325] Re: ruby1.9 block scope — Yukihiro Matsumoto <matz@...> 2008/09/29

Hi,

[#316347] Re: ruby1.9 block scope — Daniel DeLorme <dan-ml@...42.com> 2008/09/29

Yukihiro Matsumoto wrote:

[#316365] Re: ruby1.9 block scope — Nobuyoshi Nakada <nobu@...> 2008/09/29

Hi,

[#316386] Re: ruby1.9 block scope — Daniel DeLorme <dan-ml@...42.com> 2008/09/30

Nobuyoshi Nakada wrote:

[#316401] Re: ruby1.9 block scope — Yukihiro Matsumoto <matz@...> 2008/09/30

Hi,

[#316430] Re: ruby1.9 block scope — "David A. Black" <dblack@...> 2008/09/30

Hi --

[#316470] Re: ruby1.9 block scope — Daniel DeLorme <dan-ml@...42.com> 2008/09/30

David A. Black wrote:

[#316486] Re: ruby1.9 block scope — Mike Gold <mike.gold.4433@...> 2008/09/30

[#316495] Re: ruby1.9 block scope — Yukihiro Matsumoto <matz@...> 2008/09/30

Hi,

[#316499] Re: ruby1.9 block scope — Mike Gold <mike.gold.4433@...> 2008/09/30

Yukihiro Matsumoto wrote:

[#316392] Revision control for Ruby — thiagobrandam <thiagobrandam@...>

Does anyone know any good revision control tool/software for Ruby?

25 messages 2008/09/30

[#316450] Real world ruby programs to learn from — Fernando Perez <pedrolito@...>

Hi,

12 messages 2008/09/30

[#316526] Mode method for Array — Glenn <glenn_ritz@...>

Hi,

21 messages 2008/09/30
[#316533] Re: Mode method for Array — Trans <transfire@...> 2008/09/30

[#316536] Re: Mode method for Array — Erik Veenstra <erikveen@...> 2008/10/01

[#316552] Re: Mode method for Array — Brian Candler <b.candler@...> 2008/10/01

Shame that the standard Hash#invert doesn't handle duplicate values

[#316564] Re: Mode method for Array — Erik Veenstra <erikveen@...> 2008/10/01

And since we all love speed, we tend to avoid inject. (For

Re: Optimization help - reading out of /proc on Solaris

From: Ken Bloom <kbloom@...>
Date: 2008-09-18 22:47:23 UTC
List: ruby-talk #315352
Brian Candler <b.candler@pobox.com> wrote:
>> Anyway, below is the code. I ran it through the profiler, but the top
>> two most costly ops were Dir.foreach, which I don't see any way to
>> optimize*, and the loop that gathers environment information, which I
>> again see no way to optimize.
> 
> Could you post your profiling? If you run using "time", how much user 
> CPU versus system CPU are you using?
> 
> Have you tried using Dir.open.each instead of Dir["/foo/*"]? Maybe 
> globbing is expensive.
> 
> Your environment loop does a fresh sysread(1024) for each var=val pair, 
> even if you've only consumed (say) 7 bytes from the previous call. You 
> would make many fewer system calls if you read a big chunk and chopped 
> it up afterwards. This may also avoid non-byte-aligned reads.
> 
> I would also be tempted to write one long unpack instead of lots of 
> string slicing and unpacking. The overhead here may be negligible, but 
> the code may end up being smaller and simpler. e.g.
> 
>  struct = ProcTableStruct.new(*psinfo.unpack(<<PATTERN))
> i i i i
> i i i i
> i i L L
> L x4i ss
> ..etc
> PATTERN
> 
> Perhaps you could combine it with your struct building, e.g.
> 
>      FIELDS = [
>         [:flag,"i"],      # process flags (deprecated)
>         [:nlwp,"i"],      # number of active lwp's in the process
>         ...
>         [:size,"s"],      # size of process in kbytes
>         [:rssize,"s"],    # resident set size in kbytes
>         [nil,"X4"],       # skip pr_pad1
>         ... etc
> 
> HTH,
> 
> Brian.

Here's a concept for metaprogramming that that I was able to generate
mostly by running regexes to transform the code. I've only tackled
/proc/#{file}/psinfo, but it should be fairly simple to extend to
the other files as well

# The Sys module serves as a namespace only.
module Sys

   # The ProcTable class encapsulates process table information.
   class ProcTable

      # The version of the sys-proctable library
      VERSION = '0.8.0'

      private

      PRNODEV = -1 # non-existent device

       
      #Dissecting the format of this, we have a symbol mapping to an unpack format string segment
      #the @ sign followed by a number indicates the offset in the string, and the text following that number is the format
      #of the data to unpack
      FIELDS=[
            [:flag , "@0 i"],
            [:nlwp , "@4 i"],
            [:pid , "@8 i"],
            [:ppid , "@12 i"],
            [:pgid , "@16 i"],
            [:sid , "@20 i"],
            [:uid , "@24 i"],
            [:euid , "@28 i"],
            [:gid , "@32 i"],
            [:egid , "@36 i"],
            [:addr , "@40 L"],
            [:size , "@44 L"],
            [:rssize , "@48 L"],
            [:ttydev , "@56 i"],
            [:pctcpu , "@60 S"],
            [:pctmem , "@62 S"],
            [:start , "@64 L"],
            [:time , "@72 L"],
            [:ctime , "@80 L"],
#note that the A format specifier automatically does what the #strip method does
#so I don't have to call .strip in the ps method
            [:fname , "@88 A16"],
            [:psargs , "@104 A80"],
            [:wstat , "@184 i"],
            [:argc , "@188 i"],
            [:argv , "@192 L"],
            [:envp , "@196 L"],
            [:dmodel , "@200 C"],
            [:taskid , "@204 i"],
            [:projid , "@208 i"],
            [:nzomb , "@212 i"],
            [:poolid , "@216 i"],
            [:zoneid , "@220 i"],
            [:contract , "@224 i"],
            [:lwpid , "@236 i"],
            [:wchan , "@244 L"],
            [:stype , "@248 C"],
            [:state , "@249 C"],
            [:sname , "@250 a1"],
            [:nice , "@251 C"],
            [:syscall , "@252 S"],
            [:pri , "@256 i"],
            [:clname , "@280 A8"],
            [:name , "@288 A16"],
            [:onpro , "@304 i"],
            [:bindpro , "@308 i"],
            [:bindpset , "@308 i"]
      ]

      field_names,format_strings=FIELDS.transpose

      eval <<-"end;"
        def first_pass_fill string
          struct=ProcTableStruct.new

          #{ field_names.collect{|x| "struct.#{x}"}.join(", ") } = string.unpack "#{format_strings.join ' '}"
        end
      end;

      #repeat the above with a new array instead of FIELDS and a new method name
      #for any other file you want to unpack this way

=begin
This eval will define a function with the following code. The arrays and
metaprogramming are just an easier way to manage the format string and
fieldnames that you can understand them when maintenence time comes around.

        def first_pass_fill string
          struct=ProcTableStruct.new

          struct.flag, struct.nlwp, struct.pid, struct.ppid, struct.pgid,
          struct.sid, struct.uid, struct.euid, struct.gid, struct.egid, struct.addr,
          struct.size, struct.rssize, struct.ttydev, struct.pctcpu, struct.pctmem,
          struct.start, struct.time, struct.ctime, struct.fname, struct.psargs,
          struct.wstat, struct.argc, struct.argv, struct.envp, struct.dmodel,
          struct.taskid, struct.projid, struct.nzomb, struct.poolid, struct.zoneid,
          struct.contract, struct.lwpid, struct.wchan, struct.stype, struct.state,
          struct.sname, struct.nice, struct.syscall, struct.pri, struct.clname,
          struct.name, struct.onpro, struct.bindpro, struct.bindpset = string.unpack "@0
          i @4 i @8 i @12 i @16 i @20 i @24 i @28 i @32 i @36 i @40 L @44 L @48 L @56 i
          @60 S @62 S @64 L @72 L @80 L @88 A16 @104 A80 @184 i @188 i @192 L @196 L @200
          C @204 i @208 i @212 i @216 i @220 i @224 i @236 i @244 L @248 C @249 C @250 a1
          @251 C @252 S @256 i @280 A8 @288 A16 @304 i @308 i @308 i"
        end
=end

      public

      ProcTableStruct = Struct.new("ProcTableStruct", *field_names)

      #if you have multiple files you're reading from with their field names
      #in multiple different variables, you'll want to replace field_names
      #with some array concatentation
      

      # In block form, yields a ProcTableStruct for each process entry that you
      # have rights to. This method returns an array of ProcTableStruct's in
      # non-block form.
      #                
      # If a +pid+ is provided, then only a single ProcTableStruct is yielded or
      # returned, or nil if no process information is found for that +pid+.
      #
      # Example:
      #         
      #   # Iterate over all processes
      #   ProcTable.ps do |proc_info| 
      #      p proc_info             
      #   end           
      #      
      #   # Print process table information for only pid 1001
      #   p ProcTable.ps(1001)                               
      #                       
      def self.ps(pid = nil)
         array = block_given? ? nil : []
         Dir.foreach("/proc") do |file|
            next if file =~  \D  # Skip non-numeric entries under / proc

            # Only return information for a given pid, if provided
            if pid
               next unless file.to_i == pid
            end
               
            # Skip over any entries we don't have permissions to read
            begin
               psinfo = IO.read("/proc/#{file}/psinfo")
            rescue StandardError, Errno::EACCES
               next
            end
               

            #the first pass fill just gets the raw data and unpacks it
            struct = first_pass_fill psinfo
            #now we do the transformations we need on the few fields that need it
            struct.pctcpu= (struct.pctcpu*100).to_f / 0x8000
            struct.pctmem= (struct.pctmem*100).to_f / 0x8000
            struct.start=Time.at(struct.start)
            #the fields that needed stripping were handled by unpack

            #repeat the above for other files that we need to deal with

            if block_given?
               yield struct
            else
               array << struct
            end
         end   
            
         pid ? array[0] : array
      end                      
   end
end


-- 
Chanoch (Ken) Bloom. PhD candidate. Linguistic Cognition Laboratory.
Department of Computer Science. Illinois Institute of Technology.
http://www.iit.edu/~kbloom1/

In This Thread

Prev Next