Re: Perl Tech meeting Tues Oct 14th - Shell-Shocker CGI and Perl DoS bugs

2014-10-13 Thread Bill Ricker
While today is a holiday for some, tomorrow is Boston.PM anyway.
(Worse, next month we're on 11/11.)
And Boston Perl Monger's 2nd Tuesday comes as late as possible this month,
so falls the day before BLU 3rd Wednesday.
   (I hear some operating system also issues patches that day, doesn't
affect me.)

TOPIC: Shell-Shocker CGI and Perl DoS bugs
DATE: Tuesday, October 14
TIME: 7:00 – 10:00 PM
ROOM: E51-376
SPEAKER: Bill Ricker (lead)

We will examine the implications for the ShellShock BASH bug for Perl
-- it's much wider than just about BASH CGI or even Perl CGI scripts
-- and also a recently discovered/fixed but comparably long-lurking
Perl DoS bug in a core module (Data::Dumper stack smash CVE-2014-4330)
and how is it possibly remotely triggerable.

The good news is ShellShocker was slightly over-hyped; unlike
Heartbleed, this one does NOT generally affect the Internet of Things,
you internet-enabled toaster is likely immune. But Windows and Mac are
not entirely immune to this Linux bug.

[ Anyone who has examined either bug or its implications is welcome to
contribute or co-present - contacting me off-list is recommended,
although in our interactive style I'll cheerfully include ambush
collaborators. ]

Boilerplate details

Tech Meetings are held on the 2nd Tuesday of every month at MIT
building E51, Sloan School Tang Center [not the other Tang building!]
nearer to Kendall Sq than Mass Ave.
 (directions http://boston-pm.wikispaces.com/MIT+Directions).
Talk begins at 7:30.
Refreshments in the hallway prior.
RSVP for count encouraged but not required, to bill.n1...@gmail.com or
Boston-PM list, by 4pm Tuesday.


(NOTE: we're staying in the wider room 376 where we were in summer,
after being in squarish 372 for winter/spring.)

website - boston.pm.org

___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss/


Re: Perl vs. Python question...

2009-07-14 Thread Lloyd Kvam
On Tue, 2009-07-14 at 15:32 -0400, Joshua Judson Rosen wrote:
> > The simplistic self.foo = self.compute_foo() will trigger a call to
> > __getattr__, so you can't use that within __getattr__.
> 
> That's not true; it *will*, however, trigger a call to __settattr__,
> if it exists; that's what you're thinking of :)
> 
> cf. http://docs.python.org/reference/datamodel.html#object.__setattr__
> 
> __getattr__, however, is free to just do `self.foo = ...'.

Thanks for the correction.

-- 
Lloyd Kvam
Venix Corp
DLSLUG/GNHLUG library
http://dlslug.org/library.html
http://www.librarything.com/catalog/dlslug
http://www.librarything.com/rsshtml/recent/dlslug
http://www.librarything.com/rss/recent/dlslug

___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss/


Re: Perl vs. Python question...

2009-07-14 Thread Joshua Judson Rosen
Lloyd Kvam  writes:
>
> On Mon, 2009-07-13 at 22:59 -0400, Paul Lussier wrote:
> > Lloyd Kvam  writes:
> > 
> > > You've already gotten two useful responses.  I'd just like to add that
> > > typically, the object attributes are referenced directly:
> > > rect.length * rect.width
> > 
> > Lloyd, thanks. But what if the attribute isn't set yet?  If I have
> > self.foo, and self.foo hasn't yet been set, I want it to go and get set,
> > then return the correct value.
> 
> If the initial set value is a simple constant, make it a class attribute
> with the default value.  The object can override the attribute with a
> different value when that value is determined.
> > 
> > I get the impression the __getattr__() method helps here, 
> 
> If the value will be computed on demand, __getattr__ is one way to go.
> def __getattr__(self, attr):
> if attr == 'foo':
> return self.compute_foo()
> elif 
> else:
> raise AttributeError( attr + ' is invalid name')
> 
> This is the 'traditional' approach.  __getattr__ is *only* called when
> an attribute is not found.  If you wanted to save the computed value, so
> that __getattr__ was no longer used:
>   self.__dict__['foo'] = self.compute_foo()
>   return self.foo
> 
> The simplistic self.foo = self.compute_foo() will trigger a call to
> __getattr__, so you can't use that within __getattr__.

That's not true; it *will*, however, trigger a call to __settattr__,
if it exists; that's what you're thinking of :)

cf. http://docs.python.org/reference/datamodel.html#object.__setattr__

__getattr__, however, is free to just do `self.foo = ...'.

-- 
Don't be afraid to ask (Lf.((Lx.xx) (Lr.f(rr.
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss/


Re: Perl vs. Python question...

2009-07-14 Thread Paul Lussier
Lloyd Kvam  writes:

> If the value will be computed on demand, __getattr__ is one way to go.
> def __getattr__(self, attr):
> if attr == 'foo':
> return self.compute_foo()
> elif 
> else:
> raise AttributeError( attr + ' is invalid name')
>
> This is the 'traditional' approach.  __getattr__ is *only* called when
> an attribute is not found.  If you wanted to save the computed value, so
> that __getattr__ was no longer used:
>   self.__dict__['foo'] = self.compute_foo()
>   return self.foo
>
> HTH

Very much so!

--
Thanks,
Paul
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss/


Re: Perl vs. Python question...

2009-07-14 Thread Lloyd Kvam
On Mon, 2009-07-13 at 22:59 -0400, Paul Lussier wrote:
> Lloyd Kvam  writes:
> 
> > You've already gotten two useful responses.  I'd just like to add that
> > typically, the object attributes are referenced directly:
> > rect.length * rect.width
> 
> Lloyd, thanks. But what if the attribute isn't set yet?  If I have
> self.foo, and self.foo hasn't yet been set, I want it to go and get set,
> then return the correct value.

If the initial set value is a simple constant, make it a class attribute
with the default value.  The object can override the attribute with a
different value when that value is determined.
> 
> I get the impression the __getattr__() method helps here, 

If the value will be computed on demand, __getattr__ is one way to go.
def __getattr__(self, attr):
if attr == 'foo':
return self.compute_foo()
elif 
else:
raise AttributeError( attr + ' is invalid name')

This is the 'traditional' approach.  __getattr__ is *only* called when
an attribute is not found.  If you wanted to save the computed value, so
that __getattr__ was no longer used:
self.__dict__['foo'] = self.compute_foo()
return self.foo

The simplistic self.foo = self.compute_foo() will trigger a call to
__getattr__, so you can't use that within __getattr__.


The new-style python classes allow for cleaner dispatching of your
attribute computations using properties, but for a small number of
names, __getattr__ will do just fine.  If there is no setter method and
foo is always computed, your class could be coded:

foo = property( compute_foo)

> I just don't
> quite get it yet.

HTH
> 
> --
> Thanks,
> Paul
-- 
Lloyd Kvam
Venix Corp
DLSLUG/GNHLUG library
http://dlslug.org/library.html
http://www.librarything.com/catalog/dlslug
http://www.librarything.com/rsshtml/recent/dlslug
http://www.librarything.com/rss/recent/dlslug

___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss/


Re: Perl vs. Python question...

2009-07-13 Thread Paul Lussier
Lloyd Kvam  writes:

> You've already gotten two useful responses.  I'd just like to add that
> typically, the object attributes are referenced directly:
> rect.length * rect.width

Lloyd, thanks. But what if the attribute isn't set yet?  If I have
self.foo, and self.foo hasn't yet been set, I want it to go and get set,
then return the correct value.

I get the impression the __getattr__() method helps here, I just don't
quite get it yet.

--
Thanks,
Paul
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss/


Re: Perl vs. Python question...

2009-07-13 Thread Bill McGonigle
On 07/11/2009 11:44 PM, Paul Lussier wrote:
> In perl, I can use the AUTOLOAD feature to dynamically create methods,
> something like this:

It looks like in perl6 you get this for free.  I'm just getting started
with it though.

-Bill

-- 
Bill McGonigle, Owner   Work: 603.448.4440
BFC Computing, LLC  Home: 603.448.1668
http://www.bfccomputing.com/Cell: 603.252.2606
Twitter, etc.: bill_mcgonigle   Page: 603.442.1833
Email, IM, VOIP: b...@bfccomputing.com
Blog: http://blog.bfccomputing.com/
VCard: http://bfccomputing.com/vcard/bill.vcf
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss/


Re: Perl vs. Python question...

2009-07-13 Thread Lloyd Kvam
On Sat, 2009-07-11 at 23:44 -0400, Paul Lussier wrote:
> How do I create dynamically created methods in python classes?
> 
> For example, if I have a number of member variables which I want to
> get
> or set, I don't want to have to create getters and setters for each
> attribute, since the code would largely be the same, just the variable
> I'm dealing with would be different.

You've already gotten two useful responses.  I'd just like to add that
typically, the object attributes are referenced directly:
rect.length * rect.width
to compute area.  Do not use: rect.get_length() * rect.get_width().

getter/setter methods get created when you some code is needed to
control access:
room.celsius
room.fahrenheit
computes the proper value from a single stored temperature (in Kelvin?).
The code still looks like a direct reference to the attribute.  You have
a choice of using __getattr__/__getattribute__/__setattr__ 
or properties as suggested in the other email responses.

-- 
Lloyd Kvam
Venix Corp
DLSLUG/GNHLUG library
http://dlslug.org/library.html
http://www.librarything.com/catalog/dlslug
http://www.librarything.com/rsshtml/recent/dlslug
http://www.librarything.com/rss/recent/dlslug

___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss/


Re: Perl vs. Python question...

2009-07-12 Thread Steven W. Orr
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

On 07/11/09 23:44, quoth Paul Lussier:
> Hi Folks,
> 
> How do I create dynamically created methods in python classes?
> 
> For example, if I have a number of member variables which I want to get
> or set, I don't want to have to create getters and setters for each
> attribute, since the code would largely be the same, just the variable
> I'm dealing with would be different.
> 
> In perl, I can use the AUTOLOAD feature to dynamically create methods,
> something like this:
> 
>   sub AUTOLOAD {
> my ($self, @args) = @_;
> my $method = $AUTOLOAD;
> $method =~ s/.*:://;
> if ($method ne 'DESTROY') {
>   # Return the structure/value pointed to by $self->{KEY}, or, set it
>   # if it's not a ref to something else.
>   if (exists $self->{"_$method"} && !ref($self->{"_$method"})) {
> eval("*$AUTOLOAD = "
>  . "sub {"
>. "  my (\$self, \$value) = assertMinMaxArgs(1, 2, \...@_);"
>  . "  if (\$value) {"
>  . "\$self->{\"_\$method\"} = \$value;"
>  . "  }"
>  . "  return \$self->{\"_\$method\"}"
>  . "}");
>   }
>   goto &$AUTOLOAD;
> }
>   }
> 
> What this AUTOLOAD sub does is this:
> 
>  - First, it strips everything before the :: leaving just the methodname
>(in perl, method names look like: CLASS::method() )
>  - Then, it looks to see if there exists a member variable
>$self->{_}, and that it's not a reference to something
>  - Then, it creates an anonymous sub (== a lambda in python I think)
>Each anonymous sub looks like this:
> 
> sub {
>   my ($self, $value) = assertMinMaxArgs(1, 2, @_);
>   if ($value) {
>  $self->{_$method} = $value;
>   }
>   return $self->{_$method}
> 
> Essentially, it works like this.  If I have a member variable _foo, and
> I want to either set or get _foo, I call a method $self->foo().  If I
> call it as $self->foo(bar), the _foo gets set to bar, otherwise, I get
> back the current value of _foo.  So, the anonymous sub above, gets
> re-written as:
> 
> sub foo {
>   my ($self, $value) = assertMinMaxArgs(1, 2, @_);
>   if ($value) {
>  $self->{_foo} = $value;
>   }
>   return $self->{_foo}
> 
> I can basically create 1 method which will automagically create for me,
> getter and setter methods for any member variable I create in my class.
> (this is extremely similar, if not identical, to lisp macros!)
> 
> For some reason I didn't think python had this capability, but someone
> mentioned to me it did, but I'm not quite sure how I'd write it.
> 
> Does anyone have any ideas?

In the Python Coookbook, on (my) page 252 is a section called Section 6.8:
"Avoiding Boilerplate Accessors for Properties".

http://www.ubookcase.com/book/Oreilly/Python.Cookbook.2nd.edition/0596007973/pythoncook2-chp-6-sect-8.html

The code they provide is this:

def xproperty(fget, fset, fdel=None, doc=None):
if isinstance(fget, str):
attr_name = fget
def fget(obj): return getattr(obj, attr_name)
elif isinstance(fset, str):
attr_name = fset
def fset(obj, val): setattr(obj, attr_name, val)
else:
raise TypeError, 'either fget or fset must be a str'
return property(fget, fset, fdel, doc)

but the discussion is important to read and fully understand before you think
you can just plug it in.

- --
Time flies like the wind. Fruit flies like a banana. Stranger things have  .0.
happened but none stranger than this. Does your driver's license say Organ ..0
Donor?Black holes are where God divided by zero. Listen to me! We are all- 000
individuals! What if this weren't a hypothetical question?
steveo at syslang.net
-BEGIN PGP SIGNATURE-
Version: GnuPG v2.0.10 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org

iEYEARECAAYFAkpaP+kACgkQRIVy4fC+NyRqtQCeLV5oscJqOGQ0zME7KXjvM8n2
HZsAn1OcpB0aif6K1rTbchwdV7GDzn7k
=gJni
-END PGP SIGNATURE-
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss/


Re: Perl vs. Python question...

2009-07-12 Thread Joshua Judson Rosen
Paul Lussier  writes:
>
> Hi Folks,
> 
> How do I create dynamically created methods in python classes?
> 
> For example, if I have a number of member variables which I want to get
> or set, I don't want to have to create getters and setters for each
> attribute, since the code would largely be the same, just the variable
> I'm dealing with would be different.

Rather than implementing a whole bunch of similar `get_*()' and
`set_*()' methods in Python, you can just define __getattr__() and
__setattr__():

http://docs.python.org/reference/datamodel.html#object.__getattr__

How's that? Perfect fit? :)

Alternately (e.g.: something other than `getters and setters'): can't
you just create a single method that takes an `extra' parameter?

Even if you really do really want to `lots of methods' interface, I'd
still start with unified dispatcher-method--then the other methods
would just be simple wrappers, e.g.:

class C:
def do_stuff(self, key, *args):
   print 'doing %s stuff...' % key

do_x = lambda self, *args: self.do_stuff('x', *args)
do_y = lambda self, *args: self.do_stuff('y', *args)
do_z = lambda self, *args: self.do_stuff('z', *args)


You could even set all of those `C.do_*' attributes (which become
methods) automatically, e.g.:

for key in ('xray', 'yankee', 'zulu'):
def do_predispatched_stuff_stuff(self, *args):
return self.do_stuff(key, *rags)

setattr(C, key, do_predispatched_stuff)

-- 
Don't be afraid to ask (Lf.((Lx.xx) (Lr.f(rr.
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss/


Re: Perl best practices

2007-09-17 Thread Ben Scott
On 9/13/07, Paul Lussier <[EMAIL PROTECTED]> wrote:
> For all those just tuning in, Ben and I are in violent and vocal
> agreement with each other, and at this point are merely quibbling over
> semantics :)

  Hey, now, I came here for an argument, and I demand to get one!  And
it better be more than just simple contradiction, too.  I expect a
connected series of statements intended to establish a proposition!
;-)

  (And they say Perl and Python have nothing in common.  ;-)  )

> To avoid LTS and backslashitis in a regexp, I tend to do something like:
>m|/foo/bar|/bar/baz|g;

  The pipe (|) is another often-used regexp syntax character, though.
If I was going to use a single alternate character for m//, I'd prolly
use a bang (!).  But I like balanced pairs -- {} or or [] or <> or ()
-- because they nicely identify the start and end of the thing, rather
than simply delimiting it.  And if it's a substitution, they let you
separate the pattern from the replacement with whitespace.  I
frequently use that to line things up for visual structure (e.g., that
condense_type() function I posted).

> Agreed, though, we ... do things like this slightly differently,
> completely avoiding the $_ dilemma:

  That actually wouldn't work for the code I posted, which is
performing multiple transformations on the same string repeatedly.
The fact that you missed that concerns me.  *That's* a sign of
inadequate clarity.  Looking at the code, I don't see a way to make
that clearer in the code itself, so I guess it needs a comment to that
effect.  Phooey.  (In my thinking, ideal code needs *no* comments,
because it's so obvious what's going on.  Obviously, that's a
theoretical ideal, and not something that happens in practice, but I
think it makes a good goal.)

  Unrelated to the above, I think there is an observation to be made
here about "sophisticated" solutions also adding complexity.  KISS, as
the saying goes.  By introducing variables and loops and control
structures, you're making things more complex, to no gain that I can
see.  A simple list of s/// operations does the same thing, and does
not require any additional cognition on the part of the reader.  (It
might even be more efficient at runtime, although that would depend on
how smart Perl's optimizer is.)

> ... by we, I mean the company which currently puts food on my table ...

  I didn't know Stop and Shop used Perl...  ;-)

> Once readability has been achieved, the next
> priority ought to be future maintenance and extensibility, IMO.

  Yup.

> Alas, assertNumArgs() is a part of a huge
> home-grown library of routines we have.

  Everybody has these.  They're extremely useful.

>>> The compelling argument is this: It should be blatantly obvious to
>>> whomever is going to be maintaining your code in 6 months what you
>>> were thinking
>>
>>   I do not think I could agree with you more here.  The thing you seem
>> to be ignoring in my argument is that "clarity" is subjective and
>> often depends on context.  :)
>
> I'm not ignoring it.  I'm saying that where you have stopped because
> you think it is sufficiently clear can in fact be made cleaner and
> clearer for the sakes of both clarity and future maintenance.

  No, I'm saying that clarity is subjective and depends on context,
and what you deem "clearer" I deem "less clear".

> There are only a finite number of options for any given command [such as 
> tar].  The
> same is not true for writing perl code.

  True, but I think my point still stands.  Verbosity does not equal
clarity, and indeed, verbosity sometimes interferes with readability.

  (My choice of tar was, perhaps, a bad example, because I do agree
with your argument WRT to your AMANDA example.)

-- Ben
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss/


Re: Perl best practices

2007-09-14 Thread Paul Lussier
Lloyd Kvam <[EMAIL PROTECTED]> writes:

> On Thu, 2007-09-13 at 23:58 -0400, Paul Lussier wrote:
>> For all those just tuning in, Ben and I are in violent and vocal
>> agreement with each other, and at this point are merely quibbling over
>> semantics :) 
>
> As an old Python guy who knows just enough Perl to get it wrong, this
> has been educational (and even fun).

I'm glad you enjoyed it!  That's why I wrote it.  I feel that perl has
a bad reputation for being "ugly".  I believe it's a myth.  One can
write ugly code in any language.  Python went so far as to put white
space restrictions place to "enforce" clean code.  While that may work
to some extent, I've seen ugly python code.

I, by no means, claim my way is the best or only way.  I don't even
claim what I posted will work completely correctly.  I was merely
trying to demonstrate that there are better ways to write any code
such that it is both elegant and pleasing to look at as well as
maintain and extend.

I would love to see other's interpretations of Ben's code, in any language.

How would you accomplish the same in awk, python, ruby, java, C, etc.?

-- 
Seeya,
Paul
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss/


Re: Perl best practices

2007-09-14 Thread Paul Lussier
[EMAIL PROTECTED] (Kevin D. Clark) writes:

> Bill Ricker writes:
>
>> I highly recommend Damian Conway's book of same title, "Perl Best
>> Practices", which recommends a much tamer, consistent readable style
>> within a workgroup than he uses in his own code (depending on context)
>> -- he suggests one style but encourages each group to decide for
>> themselves and take his list of 255 practices as a template for their
>> own local standard.
>
> I will second this.  Great book by a great author.

Ahm, fellas, we've got a fence-post error here :)

This response to Ben is what started all it all:

  Paul Lussier <[EMAIL PROTECTED]> writes:

  > "Ben Scott" <[EMAIL PROTECTED]> writes:
  >
  >>   You don't need to put parenthesis around arguments to split, and you
  >> don't need to explicitly specify the default pattern match target
  >> ($_).
  >
  > Unfortunately, you both "don't *need* to" and "*can* do" anything in
  > perl.  Often at the same time!  This is what leads to very difficult
  > to read, and more difficult to maintain perl code.
  [...]
  > I highly recommend Damian Conway's book "Perl Best Practices", which
  > outlines these and many other useful pieces of advice.

So, Kevin is really thirding ;)
-- 
Seeya,
Paul
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss/


Re: Perl best practices (was: question ... Split operator in Perl)

2007-09-14 Thread Kevin D. Clark

Bill Ricker writes:

> I highly recommend Damian Conway's book of same title, "Perl Best
> Practices", which recommends a much tamer, consistent readable style
> within a workgroup than he uses in his own code (depending on context)
> -- he suggests one style but encourages each group to decide for
> themselves and take his list of 255 practices as a template for their
> own local standard.

I will second this.  Great book by a great author.

Regards,

--kevin
-- 
GnuPG ID: B280F24E  Error messages
alumni.unh.edu!kdc  strewn across my terminal.
A vein starts to throb.
   -- Coy.pm
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss/


Re: Perl best practices (was: question ... Split operator in Perl)

2007-09-14 Thread Bill Ricker
I highly recommend Damian Conway's book of same title, "Perl Best
Practices", which recommends a much tamer, consistent readable style
within a workgroup than he uses in his own code (depending on context)
-- he suggests one style but encourages each group to decide for
themselves and take his list of 255 practices as a template for their
own local standard.

http://www.oreilly.com/catalog/perlbp/

-- 
Bill
[EMAIL PROTECTED] [EMAIL PROTECTED]
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss/


Re: Perl best practices

2007-09-14 Thread Lloyd Kvam
On Thu, 2007-09-13 at 23:58 -0400, Paul Lussier wrote:
> For all those just tuning in, Ben and I are in violent and vocal
> agreement with each other, and at this point are merely quibbling over
> semantics :) 

As an old Python guy who knows just enough Perl to get it wrong, this
has been educational (and even fun).

Thanks.

-- 
Lloyd Kvam
Venix Corp

___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss/


Re: Perl best practices

2007-09-13 Thread Paul Lussier

For all those just tuning in, Ben and I are in violent and vocal
agreement with each other, and at this point are merely quibbling over
semantics :)

"Ben Scott" <[EMAIL PROTECTED]> writes:

>   Er, yes.  "blah" in this case was meta-syntactic, and I was still
> thinking of the first example in this discussion, which had LTS
> (Leaning Toothpick Syndrome).  I will use // if the regexp doesn't
> suffer from LTS.  I use m{} or s{}{} when the regexp otherwise
> contains slashes.

Something about the use {} and () in regexps really bothers me.  I
think it's because in general, perl overloads too many things to begin
with.  To use {} for regexp delimiting is confusing and completely
non-intuitive to me. They are meant to denote either a hash element or
a code block.  Trying to make my mind use them for regexps hurts :)

To avoid LTS and backslashitis in a regexp, I tend to do something like:

   m|/foo/bar|/bar/baz|g;

The | is close enough to / that it's instantly clear to me.

> "A foolish consistency is the hobgoblin of little minds."  -- Ralph
> Waldo Emerson

Yeah, what the old, dead guy said :)

> As a completely non-contrived example, here is an illustration of
> when I think implicit use of $_ is very appropriate.
[...]
> sub condense_type($) {
> # condense a MIME content type to something shorter, for people
> $_ = $_[0];
> s{^text/plain$} {text};
> s{^text/html$}  {html};
> s{^text/css$}   {css};
> s{^text/javascript$}{jscript};
> s{^text/xml$}   {xml};
> s{^text/}   {};
> s{^image/.*}{image};
> s{^video/.*}{video};
> s{^audio/.*}{audio};
> s{^multipart/byteranges}{bytes};
> s{^application/}{};
> s{^octet-stream$}   {binary};
> s{^x-javascript$}   {jscript};
> s{^x-shockwave-flash$}  {flash};
> s{\*/\*}{stars};# some content gets marked */*
> return $_;
> }
>
> I could have used a regular named variable (say, $type) and
> repeated "$type =~" over and over again for 14 lines.  I believe
> that would actually harm the readability of the code.

Agreed, though, we (by we, I mean the company which currently puts
food on my table :) do things like this slightly differently,
completely avoiding the $_ dilemma:

  $match = shift;
  %mimeTypes = 
('^text/plain$'  => "text"   ,
 '^text/html$'   => "html"   ,
 '^text/css$'=> "css"   ,
 '^text/javascript$' => "jscript",
 '^text/xml$'=> "xml"   ,
 '^text/'=> ""  ,
 '^image/.*' => "image"  ,
 '^video/.*' => "video"  ,
 '^audio/.*' => "audio"  ,
 '^multipart/byteranges' => "bytes"  ,
 '^application/' => ""  ,
 '^octet-stream$'=> "binary" ,
 '^x-javascript$'=> "jscript",
 '^x-shockwave-flash$'   => "flash"  ,
 '*/*'   => "stars"  ,# some content gets marked */*
);

  foreach my $mtype (keys %mimeTypes) {
if ($mtype =~ /$match/)
  return $mimeType{$mtype};
}
  }

Also, the foreach could be written as:

  map { ( $match =~ /$_/) && return $mimeTypes{$_}} keys %mimeTypes

Though I find this completely readable, it suffers from the problem
that it's not easily extensible.  If you decide you need to do more
processing within the loop, the foreach is much easier to extend.  You
just plonk another line in there and operate on the already existing
variables.  With the map() style loop, this becomes more difficult.

So, though I love map(), I would have to argue this is not the best
place to use it.  Once readability has been achieved, the next
priority ought to be future maintenance and extensibility, IMO.

>   As a counter-example from the same script, here's something using
> explicit names and grouping which isn't strictly needed, because I
> find it clearer:
>
> sub condense_size($) {
> # consense a byte-count into K/M/G
> my $size = $_[0];
> if($size > $gigabyte) { $size = ($size / $gigabyte) . "G"; }
> elsif ($size > $megabyte) { $size = ($size / $megabyte) . "M"; }
> elsif ($size > $kilobyte) { $size = ($size / $kilobyte) . "K"; }
> return $size;
> }

I tend to like this style too, though I'd use a slightly different
syntax.  It's otherwise exactly the same.

  my $size = shift;
  ($size > $gigabyte) && { return (($size/$gigabyte) . "G")};
  ($size > $megabyte) && { return (($size/$megabyte) . "M")};
  ($size > $kilobyte) && { return (($size/$kilobyte) . "K")};

Or, perhaps, if you wanted to be a little more cleverer:

  my  %units = ($gigabyte => sub { int($_[0]/$gigabyte) . 'G'},
$megabyte => sub { int($_[0]/$megabyte) . 'M'},
$kilobyte => sub { int($_[0]/$kilobyte) . 'K'},
 );

  foreach my $base (sort {$b <=> $a } keys %units) {
if ($size > $base) {
  print ($units{$base}->($size),"\n");
  last;
}
  }

This last approach is both too clever by 1, but also, slightl

Re: Perl best practices

2007-09-13 Thread Ben Scott
On 13 Sep 2007 12:10:58 -0400, Kevin D. Clark <[EMAIL PROTECTED]> wrote:
> If I write anything else, it would just be a combination of me
> nit-picking for no purpose and hot air.

  Welcome to the Internet!   ;-)

-- Ben
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss/


Re: Perl best practices

2007-09-13 Thread Ben Scott
On 9/13/07, Paul Lussier <[EMAIL PROTECTED]> wrote:
> When writing code which will be used, looked at, modified, and
> maintained by a group of people, it is best to agree upon and strictly
> adhere to a common set of coding standards.

  Yes.  But when the designated group of people is "all of humanity",
the problem of agreeing on said standards becomes difficult.  :)

> I find both of these bothersome :)  *I* prefer:
>
> @foo = split (/blah/);

  Er, yes.  "blah" in this case was meta-syntactic, and I was still
thinking of the first example in this discussion, which had LTS
(Leaning Toothpick Syndrome).  I will use // if the regexp doesn't
suffer from LTS.  I use m{} or s{}{} when the regexp otherwise
contains slashes.

> @foo = split (/blah/);
> @foo = split (/blah/, $actualVariableName);
> The former implies $_, which need not be explicitly stated in this case.

  Right.  That's exactly what I was saying.  ;-)

> map { grep { ... $_ } $_ } @foo;
>
> Which $_ is which, and where is each getting it's data from?

  Like I said, I use things like parenthesis, braces, named variables,
etc., liberally when I find the meaning/intent is not obvious in
context.  But it's a case-by-case call, not an absolute, inviolable
rule.

  "A foolish consistency is the hobgoblin of little minds."  -- Ralph
Waldo Emerson

  As a completely non-contrived example, here is an illustration of
when I think implicit use of $_ is very appropriate.  It's from a
Squid log analysis tool I wrote, where I wanted to condense the MIME
content type into something smaller and more appropriate for a log
report.  Here's the code (as usual, view in a monospace font to get
this to line up properly):

sub condense_type($) {
# condense a MIME content type to something shorter, for people
$_ = $_[0];
s{^text/plain$} {text};
s{^text/html$}  {html};
s{^text/css$}   {css};
s{^text/javascript$}{jscript};
s{^text/xml$}   {xml};
s{^text/}   {};
s{^image/.*}{image};
s{^video/.*}{video};
s{^audio/.*}{audio};
s{^multipart/byteranges}{bytes};
s{^application/}{};
s{^octet-stream$}   {binary};
s{^x-javascript$}   {jscript};
s{^x-shockwave-flash$}  {flash};
s{\*/\*}{stars};# some content gets marked */*
return $_;
}

  I could have used a regular named variable (say, $type) and repeated
"$type =~" over and over again for 14 lines.  I believe that would
actually harm the readability of the code.  I find it clearer with use
of implicit $_, because it puts the focus on the fact that I'm doing a
bunch of transformations on the same thing, over and over again.

  As a counter-example from the same script, here's something using
explicit names and grouping which isn't strictly needed, because I
find it clearer:

sub condense_size($) {
# consense a byte-count into K/M/G
my $size = $_[0];
if($size > $gigabyte) { $size = ($size / $gigabyte) . "G"; }
elsif ($size > $megabyte) { $size = ($size / $megabyte) . "M"; }
elsif ($size > $kilobyte) { $size = ($size / $kilobyte) . "K"; }
return $size;
}

>> Explicitly specifying $_ over and over again just clutters up the
>> code with pointless syntax.  It's one more thing my brain has to
>> recognize and process.
>
> Right, which is why you shouldn't depend upon $_ in these contexts and
> explicitly state a variable name ...

  A named variable would be *two* more things.  ;-)

>   s/(^\s*|\s*$)//g; # trim leading/trailing whitespace

  Er, yah, that would be even better.  Not sure why I didn't just use
s/// with /g when I wrote that the first time around.

  (The actual script in my ~/bin/ has several lines of comments
explaining certain design decisions, but that's one one of them.)

>   my $file = shift;

  You're using an implicit argument to shift there.  ;-)

> The compelling argument is this: It should be blatantly obvious to
> whomever is going to be maintaining your code in 6 months what you
> were thinking

  I do not think I could agree with you more here.  The thing you seem
to be ignoring in my argument is that "clarity" is subjective and
often depends on context.  :)

>> I write Perl programs with the assumption that the reader
understands Perl ...
>
> ... even those who *claim* to know the language, often times are
> just fooling themselves.

  I'm not going to penalize the competent because there are others who
are incompetent.

>> Many say similar things about Unix.  Or Emacs.  :-) I'm don't argue
>> that one approach is right and the other wrong, but I do think that
>> both approaches have their merits.
>
> Which approaches are you talking about?  Approaches to learning, or to
> writing?

  Yes.  :)

  Let me restate: A pattern which is powerful and easy-to-use is
sometimes unavoidably non-obvious.

  Or perhaps an example of a similar principle in a different context:
When invoking tar from a shell script, which of the following do you
prefer?

tar --create --gzip --verbose -

Re: Perl best practices

2007-09-13 Thread Kevin D. Clark

Paul Lussier writes:

>  (/me waiting for Kevin to pipe in here in 4...3...2...1... ;)

Ben and Paul are competent Perl programmers.  They write good code.
Code should be written to be clear.  While it is nice if code written
in a given language is understandable by people who don't know the
language, this property isn't guaranteed.  Cryptic one-liners can be
hard to follow, but they can also be beautiful and useful.

If I write anything else, it would just be a combination of me
nit-picking for no purpose and hot air.

Kind regards,

--kevin
-- 
GnuPG ID: B280F24E It is best to forget the great sky
alumni.unh.edu!kdc And to retire from every wind
 -- Mumon
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss/


Re: Perl best practices

2007-09-13 Thread Paul Lussier
"Ben Scott" <[EMAIL PROTECTED]> writes:

>   Personally, in the proper context, I find this:

When writing code which will be used, looked at, modified, and
maintained by no one else, doing whatever makes you happy and more
efficient makes sense, and is more efficient and expedient.

When writing code which will be used, looked at, modified, and
maintained by a group of people, it is best to agree upon and strictly
adhere to a common set of coding standards.  This makes the entire
group more eficient.  The personal likes and/or dislikes of anyone
person may or may not bother anyone else in the group.


>   @foo = split m{blah};
>
> to be easier to read and comprehend at a glance than this:
>
>   @foo = split (m{blah}, $_);


I find both of these bothersome :)  *I* prefer:

@foo = split (/blah/);
or: @foo = split (/blah/, $actualVariableName);

The former implies $_, which need not be explicitly stated in this case.
The latter clearly denotes where you're getting your data from.

$_ has a *lot* of magical properties which can really screw things up,
especially in cases like:

   map { grep { ... $_ } $_ } @foo;

Which $_ is which, and where is each getting it's data from?  This is
where the use of named variables I find to be better than just
depending upon built-ins like $_.

> Explicitly specifying $_ over and over again just clutters up the
> code with pointless syntax.  It's one more thing my brain has to
> recognize and process.

Right, which is why you shouldn't depend upon $_ in these contexts and
explicitly state a variable name (which should also be my'ed into the
proper scope :)

>   I don't arbitrarily assign to $_ and use it at random, the way some
> people do.  And I do make use of parenthesis, braces, and such, even
> when they are not needed, when I find it makes the code clearer.  But
> I also leave them out when I find it makes the code clearer.

No arguments with that.  In general, IMO, clarity is of the utmost
importance.  There are many "best practices" which can help aid
clarity though.  I find one such practice is to always use func(args)
because it makes it blatantly obvious you're calling a function.
(perhaps the one exception is with print, but even then, I find myself
very often using it there too.  To me:

print (join("\s", "Some text", func(args), "more text",),
   "\n"
  );

is far more readable than
print join " ", "Some text", func(args), "more text", "\n";

In the former, if I need to add "stuff" to the join, it's blatantly
obvious where it goes.  In the latter, it is not.

>   For a slightly less contrived example, take a script which trims
> leading and trailing whitespace from each line in an input file.  I
> already have one implementation, and I just wrote up another one.
[...]
>   Assuming the reader is familiar with the language, which do you
> think will be easier/quicker to comprehend?

Both of these hurt my eyes! :)

This one is short and sweet:

> #!/usr/bin/perl -wp
> s/^[\x20\t]*//; # trim leading space
> s/[\x20\t]*$//; # trim trailing space

but I'd rewrite it as:

  #!/usr/bin/perl -p

  s/(^\s*|\s*$)//g; # trim leading/trailing whitespace


For a script which optionally took stdin, I'd write it as:

  #!/usr/bin/perl -w

  use English;

  my $file = shift;
  my $FH; 
 
  if (!$file) {
*FH = *STDIN;
  } else {
open(FH, "$file") || die("Could not open $file: $ERRNO\n";
  }

  while (my $line = ) {
$line =~ s/(^\s*|\s*$)//g; # trim leading/trailing whitespace
print("$line\n");
  }
  close(FH);


> It may be true that someone who *isn't* familiar with Perl would
> find it easier to puzzle out the meaning of the longer version.

I'm fairly comfortable with perl.  I could puzzle out the meaning
fairly easily.  And I'll even concede that as far as most perl, it's
pretty good.  But, as is true I'm sure even with my own code, there's
always room for improvement :)

 (/me waiting for Kevin to pipe in here in 4...3...2...1... ;)

> But I don't find that a particularly compelling argument.

The compelling argument is this: It should be blatantly obvious to
whomever is going to be maintaining your code in 6 months what you
were thinking :) The easier you make it up front to read your code and
discern your mindset, the less time it take the maintainer in 6
months.  Many times, that future maintainer is *you* :)

> I write Perl programs with the assumption that the reader
> understands Perl, the same way I am assuming readers of this message
> understand English.  :)

Ahh, yes.  But as the superintendent of the Lawrence, MA, School
system has recently shown, even those who *claim* to know the
language, often times are just fooling themselves.  Just "axe" him :)

> This may mean Perl, as practiced, is harder to learn than a language
> which is more rigid and always verbose.

I think perl is incredibly easy to learn if you learn from a good
source.  The documentation is one such source.  Other people's code is
mo

Re: Perl best practices (was: question ... Split operator in Perl)

2007-09-13 Thread Ben Scott
On 9/13/07, John Abreau <[EMAIL PROTECTED]> wrote:
>> s/^[\x20\t]*//; # trim leading space
>> s/[\x20\t]*$//; # trim trailing space
>
> Any particular reason to use [\x20\t] instead of \s ?

  \s would also eat newlines and similar.  At a minimum, it would have
to explicitly print with "\n" and use the -n switch instead of the -p
switch.  Which would be fine.  But if the file contains non-native
line endings, it can result in those getting mangled, or so I've
found.  I've got a lot of such files hanging around on my system.
Just eating space and tab worked better for me.

  OTOH, \s should eat other kinds of in-line whitespace that might be
encountered, including anything Unicode dishes up.  So that might be
better for some situations.

  YMMV.  Or, since this is Perl we're talking about: TIMTOWTDI.  ;-)

-- Ben
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss/


Re: Perl best practices (was: question ... Split operator in Perl)

2007-09-12 Thread John Abreau

On Wed, September 12, 2007 9:37 pm, Ben Scott said:

> s/^[\x20\t]*//; # trim leading space
> s/[\x20\t]*$//; # trim trailing space
>

Any particular reason to use [\x20\t] instead of \s ?


-- 
John Abreau / Executive Director, Boston Linux & Unix
IM: [EMAIL PROTECTED] / [EMAIL PROTECTED] / [EMAIL PROTECTED] / [EMAIL 
PROTECTED]
Email [EMAIL PROTECTED] / WWW http://www.abreau.net / PGP-Key-ID 0xD5C7B5D9
PGP-Key-Fingerprint 72 FB 39 4F 3C 3B D6 5B E0 C8 5A 6E F1 2C BE 99


-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.

___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss/


Re: Perl CGI charset magic thingy (was: How to be an expert)

2006-06-13 Thread Mark Komarinski
On Tue, Jun 13, 2006 at 09:31:14AM -0400, Ben Scott wrote (and I 
changed):
> >... but, if so, then I don't understand why.  Anyone care to give
> >me their interpretation?  [From /usr/share/perl5/Bugzilla/CGI.pm]
> >
> >$self->charset(Param('utf8') ? 'UTF-8' : '');
> 
>  Well, that looks like the ternary operator (conditional expression).
> To break it out:
> 
> if (Param('utf8')) {
>   $self->charset("UTF-8");
>   }
> else {
>   $self->charset(""); # empty string
>   }
> 

Fixed it for you.  I think.

-Mark


signature.asc
Description: Digital signature


Re: perl - sometimes it *does* resemble line noise... (long)

2006-05-12 Thread Paul Lussier
[EMAIL PROTECTED] (Kevin D. Clark) writes:

> Paul Lussier writes:
>
>> And there you have it. 'return map {...} map {...} grep {...}
>> split(...);' Short, concise, no need for a bunch of temp variables
>> that only get used once and thrown away.  I like it.  Others, well,
>> not so much :)
>
> If this is production code (not "write-once" code) in my opinion the
> original version of the code that you presented is preferable.

As I stated earlier on in the post, what I started with and ended up
with was largely the same.  The multi-map/grep/split thing was the
result of a couple refactorings before I came to the same conclusion
:)

> I say this, of course, as somebody who is an enthusiastic Perl
> programmer.  Code that is hard to understand and maintain will
> eventually either get rewritten or junked.

Yep, that's why I ended up using a bunch of temp. variables in the
end.  Readability/maintainability was enhanced greatly at little/no
cost.

-- 
Seeya,
Paul
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: perl - sometimes it *does* resemble line noise... (long)

2006-05-12 Thread Kevin D. Clark

Paul Lussier writes:

> And there you have it. 'return map {...} map {...} grep {...}
> split(...);' Short, concise, no need for a bunch of temp variables
> that only get used once and thrown away.  I like it.  Others, well,
> not so much :)

If this is production code (not "write-once" code) in my opinion the
original version of the code that you presented is preferable.

I say this, of course, as somebody who is an enthusiastic Perl
programmer.  Code that is hard to understand and maintain will
eventually either get rewritten or junked.

Just another Perl hacker,

--kevin
-- 
GnuPG ID: B280F24E And the madness of the crowd
alumni.unh.edu!kdc Is an epileptic fit
   -- Tom Waits

___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: perl and network addresses

2006-04-03 Thread Jason Stephenson

Kevin D. Clark wrote:


Another thing to be aware of (but which hasn't come up...yet...in this
thread) is that all of the test code that I see here uses signed
integers for the bit operations (~ << etc.).  The C spec. specifically
states that the results of such expressions is system dependent (and
hence unportable).


FWIW, I also changed my test program to use unsigned integers, and got 
the same results.--The sall instruction is working as advertised on my 
Pentium III.

___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: perl and network addresses

2006-04-03 Thread Kevin D. Clark

Stephen Ryan writes:

> Ooh, here's something interesting.  I first tried a test with constants,
> and got the warning: left shift count >= width of type" out of gcc.
> Then I rewrote the thing to use a loop, and I got correct results out of
> it.  (This is all on an Athlon64X2.)
>
> When you described getting the same results for 0 and 32, I tried it
> again on my wife's laptop, a Celeron M, and got the same results you
> did; just out of curiosity, I looked it up, and gcc generates a 'sall'
> instruction to do the actual bit-shift, which on the 80386, PIII and
> Celeron M (according to Intel's documentation, your test, and my test,
> respectively) all ignore everything but the low 5 bits on the shift
> count.  The 64-bit Athlon64 apparently doesn't, though, even though I'm
> supposedly running in 32-bit compatibility mode.  Huh.
>
> Yet another demonstration of the dangers of of assuming specific
> bit-sizes for int, I suppose.

Another thing to be aware of (but which hasn't come up...yet...in this
thread) is that all of the test code that I see here uses signed
integers for the bit operations (~ << etc.).  The C spec. specifically
states that the results of such expressions is system dependent (and
hence unportable).

That warning message you saw was gcc doing an OK job warning you of a
possible problem.  When you added the loop you bamboozled the compiler,
but the underlying issue (however small) still remained.

Just another compiler guy...

--kevin
-- 
GnuPG ID: B280F24E And the madness of the crowd
alumni.unh.edu!kdc Is an epileptic fit
   -- Tom Waits

___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: perl and network addresses

2006-03-31 Thread Stephen Ryan
On Fri, 2006-03-31 at 21:00 -0500, Jason Stephenson wrote:
> Stephen Ryan wrote:
> > hostmask = (1 << (32 - n)) - 1
> > netmask = ~ hostmask
> 
> Doh! That's so obvious, so obviously, I overlooked it. ;)

Well, yes, of course :-)

> > 
> > 1 << (32 - n) in binary is (n-1) '0' bits, a '1', then (32 - n) '0'
> > bits.  Subtracting 1 from that gives n '0' bits followed by (32 - n) '1'
> > bits.  The 'not' operator flips all the bits for the netmask.
> > 
> > This works for /1 through /32 networks, even though some of those are
> > nonsensical.  A /0 might break this because of overflow (1 << (32 -n)
> > overflows a 32-bit integer); theoretically, it should work even for /0
> > so long as 1 << (32-n) returns 0 (32-bit gcc 4.0 on my Athlon64 desktop
> > computes this correctly, but complains 'warning: left shift count >=
> > width of type' while compiling.  Anyway, if you're running a /0, you've
> > got other, bigger problems.
> 
> Using gcc 3.4.4 on a 32-bit Pentium III, I get no warnings when 
> compiling your test program, even with -Wall. When it runs, 0 gives the 
> same result as 32, so it overflows (silently) on my machine.

Ooh, here's something interesting.  I first tried a test with constants,
and got the warning: left shift count >= width of type" out of gcc.
Then I rewrote the thing to use a loop, and I got correct results out of
it.  (This is all on an Athlon64X2.)

When you described getting the same results for 0 and 32, I tried it
again on my wife's laptop, a Celeron M, and got the same results you
did; just out of curiosity, I looked it up, and gcc generates a 'sall'
instruction to do the actual bit-shift, which on the 80386, PIII and
Celeron M (according to Intel's documentation, your test, and my test,
respectively) all ignore everything but the low 5 bits on the shift
count.  The 64-bit Athlon64 apparently doesn't, though, even though I'm
supposedly running in 32-bit compatibility mode.  Huh.

Yet another demonstration of the dangers of of assuming specific
bit-sizes for int, I suppose.

___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: perl and network addresses

2006-03-31 Thread Jason Stephenson

Stephen Ryan wrote:

Can anyone think of a better way to blit an arbitrary number of bits 
from 0 to 1?



Well, let's see

Taking advantage of the fact that all of the '1' bits are at the end of
the hostmask, you've actually almost gotten it already.

hostmask = (1 << (32 - n)) - 1
netmask = ~ hostmask


Doh! That's so obvious, so obviously, I overlooked it. ;)



1 << (32 - n) in binary is (n-1) '0' bits, a '1', then (32 - n) '0'
bits.  Subtracting 1 from that gives n '0' bits followed by (32 - n) '1'
bits.  The 'not' operator flips all the bits for the netmask.

This works for /1 through /32 networks, even though some of those are
nonsensical.  A /0 might break this because of overflow (1 << (32 -n)
overflows a 32-bit integer); theoretically, it should work even for /0
so long as 1 << (32-n) returns 0 (32-bit gcc 4.0 on my Athlon64 desktop
computes this correctly, but complains 'warning: left shift count >=
width of type' while compiling.  Anyway, if you're running a /0, you've
got other, bigger problems.


Using gcc 3.4.4 on a 32-bit Pentium III, I get no warnings when 
compiling your test program, even with -Wall. When it runs, 0 gives the 
same result as 32, so it overflows (silently) on my machine.


If you're running a /0, you really must be Root. ;)

I'm going to limit the input on my network calculator and throw an error 
on IPv4 net masks that are not between /8 and /30 inclusive. The reason 
being that < /8 and > /30 don't really give valid IPv4 networks.


Cheers and thanks,
Jason

___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: perl and network addresses

2006-03-31 Thread Stephen Ryan
On Thu, 2006-03-30 at 20:35 -0500, Jason Stephenson wrote:
> Paul Lussier wrote:
> 
> > Yes, more or less.  Between you and Jason I've been able to come up
> > with exactly what I need.  Thanks a lot for all your help.  Why I
> > couldn't see this for myself is beyond me.  Of course, this week has
> > been full of me "missing the details" to the point where I somehow
> > managed to mail my taxes to myself from work the other day rather than
> > to my accountant :) So, just in case you wondered, the USPS system is
> > working at peak efficiency !
> 
> You're very welcome to the help, and we all have those weeks. It took me 
> a while to realize what your real question was.
> 
> Once I figured out your question, it was actually rather  interesting: 
> adding network addresses to interpolate between different networks. 
> Trying to answer it allowed me to discover some facts about IPv4 
> addresses and masks, so I got to learn something, too.
> 
> The thing that I found most interesting is if you use the one or two 
> digit kind of "mask," i.e. /19, you can determine how many addresses are 
> on the network via the following C code: addresses = 1 << (32 - n). 
> Where n is the part of the mask after the /.
> 
> I wish I could find a faster way to blit the bits to make the "real" 
> mask from the /N style than using a for loop. Only alternative I can 
> think of is to use a switch on the 33 possibilities (0-32).--Of course, 
> anything < /8 and > /30 doesn't make a "real" network.
> 
> Can anyone think of a better way to blit an arbitrary number of bits 
> from 0 to 1?

Well, let's see

Taking advantage of the fact that all of the '1' bits are at the end of
the hostmask, you've actually almost gotten it already.

hostmask = (1 << (32 - n)) - 1
netmask = ~ hostmask

1 << (32 - n) in binary is (n-1) '0' bits, a '1', then (32 - n) '0'
bits.  Subtracting 1 from that gives n '0' bits followed by (32 - n) '1'
bits.  The 'not' operator flips all the bits for the netmask.

This works for /1 through /32 networks, even though some of those are
nonsensical.  A /0 might break this because of overflow (1 << (32 -n)
overflows a 32-bit integer); theoretically, it should work even for /0
so long as 1 << (32-n) returns 0 (32-bit gcc 4.0 on my Athlon64 desktop
computes this correctly, but complains 'warning: left shift count >=
width of type' while compiling.  Anyway, if you're running a /0, you've
got other, bigger problems.

> Now, I'm working on a network calculator application that will support 
> IPv6 as well. I should probably do it in JavaScript, uh, sorry, AJAX, so 
> that the "Web 2.0" people will notice. ;)
> 
> Cheers,
> Jason
> ___
> gnhlug-discuss mailing list
> gnhlug-discuss@mail.gnhlug.org
> http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss
#include 

int main()
{
  int n;
  int netmask,hostmask;

  for (n=0;n<=32;n++)
{
  hostmask = (1 << (32 -n)) - 1;
  netmask = ~hostmask;

  printf("n: %d  netmask: 0x%08x  hostmask: 0x%08x\n",n,netmask,hostmask);
}
  return 0;
}


Re: perl and network addresses

2006-03-30 Thread Jason Stephenson

Paul Lussier wrote:


Yes, more or less.  Between you and Jason I've been able to come up
with exactly what I need.  Thanks a lot for all your help.  Why I
couldn't see this for myself is beyond me.  Of course, this week has
been full of me "missing the details" to the point where I somehow
managed to mail my taxes to myself from work the other day rather than
to my accountant :) So, just in case you wondered, the USPS system is
working at peak efficiency !


You're very welcome to the help, and we all have those weeks. It took me 
a while to realize what your real question was.


Once I figured out your question, it was actually rather  interesting: 
adding network addresses to interpolate between different networks. 
Trying to answer it allowed me to discover some facts about IPv4 
addresses and masks, so I got to learn something, too.


The thing that I found most interesting is if you use the one or two 
digit kind of "mask," i.e. /19, you can determine how many addresses are 
on the network via the following C code: addresses = 1 << (32 - n). 
Where n is the part of the mask after the /.


I wish I could find a faster way to blit the bits to make the "real" 
mask from the /N style than using a for loop. Only alternative I can 
think of is to use a switch on the 33 possibilities (0-32).--Of course, 
anything < /8 and > /30 doesn't make a "real" network.


Can anyone think of a better way to blit an arbitrary number of bits 
from 0 to 1?


Now, I'm working on a network calculator application that will support 
IPv6 as well. I should probably do it in JavaScript, uh, sorry, AJAX, so 
that the "Web 2.0" people will notice. ;)


Cheers,
Jason
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: perl and network addresses

2006-03-30 Thread Paul Lussier
"Ben Scott" <[EMAIL PROTECTED]> writes:

>> The 10.0.32/19 is an interesting beast.  The systems which live on it
>> have 2 NICs, the primary eth0, which *always* have a 10.0.32/19
>> based address (currently restricted to 10.0.33/24 for some reason?!),
>  
>
>   As far as that restriction goes, I've read of crufty old code which
> assume everything follows the old classful model, with strict
> boundaries  even for subnets.   It might be that.

To be honest, I think it's more that we just don't have more 255 hosts
on that network... yet.  We're about to get 50 more systems in which
will bring us up to 251.  After that, things may well get interesting :)

>   As for the rest... wow... funky.  I do hope all that multi-homing to
> the same network is for test/simulation procedures.  :)

Pretty much.  It's to simulate how our product actually works.
Though, our product uses this type of setup in a very restricted and
controlled manner on a "backend", completely separate and private
network.  In theory, one installation of our product could approach
255+ hosts in a single installation, in practice, the number of hosts
in a single install is rarely more than 10.

>   Okay, in return for taking the time and effort to explain all that,
> I took the time to figure out how to get Perl to convert IP addresses.
>  Hopefully the following sample code will help you out:

[ code elided ]

>   Is that even close to what you were thinking of?

Yes, more or less.  Between you and Jason I've been able to come up
with exactly what I need.  Thanks a lot for all your help.  Why I
couldn't see this for myself is beyond me.  Of course, this week has
been full of me "missing the details" to the point where I somehow
managed to mail my taxes to myself from work the other day rather than
to my accountant :) So, just in case you wondered, the USPS system is
working at peak efficiency !
-- 

Seeya,
Paul
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: perl and network addresses

2006-03-29 Thread Ben Scott
On 3/28/06, Paul Lussier <[EMAIL PROTECTED]> wrote:
> It's confusing.

  Sure is!  Wow, that's one wacky setup.  :)

> The 10.0.32/19 is an interesting beast.  The systems which live on it
> have 2 NICs, the primary eth0, which *always* have a 10.0.32/19
> based address (currently restricted to 10.0.33/24 for some reason?!),
 

  As far as that restriction goes, I've read of crufty old code which
assume everything follows the old classful model, with strict
boundaries  even for subnets.   It might be that.

  As for the rest... wow... funky.  I do hope all that multi-homing to
the same network is for test/simulation procedures.  :)

  Okay, in return for taking the time and effort to explain all that,
I took the time to figure out how to get Perl to convert IP addresses.
 Hopefully the following sample code will help you out:

!/usr/bin/perl -w
use Socket qw(inet_aton inet_ntoa);
# address and mask in ASCII decimal dotted-quad notation
$addr = '10.0.32.42';
$mask = '255.255.224.0'; # 19
print ("addr: $addr/$mask\n");
# convert to "string" (which is really the four bytes of a 32-bit int)
$addr = inet_aton($addr);
$mask = inet_aton($mask);
# convert to native integers
# the 'N' tells unpack the string is 32-bit int, network order)
$addr = unpack('N', $addr);
$mask = unpack('N', $mask);
# use binary math to mask out net and host parts
$net  = $addr & $mask;
$host = $addr & ~$mask; # ~$m = complement of mask (binary NOT)
# convert to "string" form
$net  = pack('N', $net);
$host = pack('N', $host);
# convert to ASCII dotted-quad notation
$host = inet_ntoa($host);
$net  = inet_ntoa($net);
# survey says...
print ("net : $net\n");
print ("host: $host\n");

  Is that even close to what you were thinking of?

-- Ben

___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: perl and network addresses

2006-03-28 Thread Paul Lussier
Jason Stephenson <[EMAIL PROTECTED]> writes:

> I'd suggest looking up how to configure VLANs on whatever you're
> using for a router.--I know you mentioned a FreeBSD firewall
> earlier.

You must have missed the part where I said "we don't have a router",
"we're migrating to a comletely new network", and, most importantly:

   "Ultimately, the ability to support "network addition" using
something wacky like a /19 is entirely my own intellectual
curiosity"

:)

-- 

Seeya,
Paul
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: perl and network addresses

2006-03-28 Thread Jason Stephenson

Paul Lussier wrote:


Errr, no, just the opposite actually.  Trying to *prevent* routing
from a very existent router :)


Sounds to me like what you really need is a router with VLAN capability. 
If I understand correctly, it sounds like you're trying to implement VLANs.


Your setup actually sounds very similar to something that we're 
designing for all the libraries in our consortium. Right now, each site 
has a Class C (/24) on a 10.10.*. In the near future, we plan to 
implement each site having a Class B (/16) with different class Cs for 
each VLAN. For example, if a site is now on 10.10.32.0, it will move to 
10.32.0.0 with something like 10.32.0.0/24 reserved for network 
equipment, 10.32.10.0/24 for the staff, 10.32.20.0/24 for the public, 
10.32.30.0/24 for staff wireless, 10.32.40.0/24 for public wireless, 
etc.--The Dracut Public Library will be our first test case, since 
they're moving (back) into their renovated building next month.


Without VLANs setup in the router, I can't imagine how that would work 
to prevent traffic among the various 10.32.0.0 "subnets." I suppose you 
could simulate it with some really complicated routing rules.


At this point, my knowledge on the matter of networking begins to recede 
into nothingness. I can set up a simple Linux or *BSD router/firewall. I 
can do the math (poorly, but that's what computers are for). I can even 
use the socket() interface, but configuring fancy-shmancy, complicated 
network topologies is beyond my current abilities.


I didn't design the above mentioned topology, nor did I figure out the 
configuration in the Cisco routers that we buy. However, I'm promised by 
our contractor that they'll show me enough so I can break things. ;)


Long story made slightly longer, I'd suggest looking up how to configure 
VLANs on whatever you're using for a router.--I know you mentioned a 
FreeBSD firewall earlier.


Cheers,
Jason "Can't-the-network-for-the-wires" Stephenson
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: perl and network addresses

2006-03-28 Thread Jason Stephenson

Paul Lussier wrote:

Jason Stephenson <[EMAIL PROTECTED]> writes:



It seems to me that the answer is that your IP addresses are limited
to the range of 10.0.32.0 to 10.0.63.255 with 10.0.0.0 being the
network address and 10.255.255.255 being the broadcast address, no?



Err, you've got the IP addresses wrong.  It's 10.32.0.0/16, but
segmented on a /19 boundary. I need to be able to calculate the "next"
network, which for 10.32.0.0/19, would be 10.64.0.0/19, then take the
host portion and "add" it to this new network such that any given host
has the same host portion on all networks it may exist on.


Doesn't matter. I got the network address wrong, too. ;)

You want to interpolate the address of one host to another network, is 
that it?



___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: perl and network addresses

2006-03-28 Thread Paul Lussier
"Ben Scott" <[EMAIL PROTECTED]> writes:

> On 3/28/06, Paul Lussier <[EMAIL PROTECTED]> wrote:
>> If you really want the long convoluted discussion, I'll be glad to
>> post it, I just figured no on would care.
>
>   Well, everyone here knows *I* thrive on long, convoluted
> discussions.  I'm also curious if you're trying to route packets
> through a non-existant gateway again.  ;-)

Errr, no, just the opposite actually.  Trying to *prevent* routing
from a very existent router :)
-- 

Seeya,
Paul
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: perl and network addresses

2006-03-28 Thread Paul Lussier
"Ben Scott" <[EMAIL PROTECTED]> writes:

>   Well... okay... but it's the *why* that makes me wonder.  :)
>
>   I hope it's something interesting, and not just that he's trying to
> say that he's been assigned the addresses in the range 10.0.32.0/19 on
> the 10.0.0.0/16 network.  That would be *so* boring.  :)

Well, since you've asked, I'm sure you'll regret it :)

I'll try to be as brief and concise, yet clear as possible.
It's confusing.

We have no internal router.  Just a legacy BSD box acting as a firewall.

The internal network, for there really is only one, is 10.0.0.0/16.

When it was set up, the 10.0.0 space was allocated along CIDR
boundaries on the premise that someday we would have a router to
separate un-like network traffic.  As a result, we have something like
this:

Address/CIDR block| Function | Address Range Defined
--
10.0.0/22 | Dev/infrastructure servers   | 10.0.0.0  - 10.0.3.255
10.0.4/22 | Mgmt/admin desktops, Mac laptops | 10.0.4.0  - 10.0.7.255
10.0.8/22 | Dev desktops | 10.0.8.0  - 10.0.11.255
10.0.12/24| Network hardware | 10.0.12.0 - 10.0.12.255
10.0.13/24| Printers | 10.0.13.0 - 10.0.13.255
10.0.14/24| MS-OS systems| 10.0.14.0 - 10.0.14.255
10.0.32/19| Dev lab systems  | 10.0.32.0 - 10.0.63.255


This allocates a generous portion of addresses to various uses, and,
if need be, subdivide based on /24 boundaries if we wanted to. 

The 10.0.32/19 is an interesting beast.  The systems which live on it
have 2 NICs, the primary eth0, which *always* have a 10.0.32/19 based
address (currently restricted to 10.0.33/24 for some reason?!), and a
secondary eth1 which has a primary address of 10.106.XX.YY where XX.YY
are the same as the 10.0.XX.YY, and where XX is currently always
33. i.e.  host 10.0.33.124 has an eth1 IP of 10.106.33.124.

Here's the *really* confusing part.  Every system's eth1 *also* has 10
virtual/alias IPs of 10.[96-105].XX.YY.  If you recall, I mentioned
not having a router.  Have I mentioned that the number of hosts in the
10.33/16 range is somewhere around 300, with another 50-100 being
added in the next 2 months? :) Both NICs in all systems are
essentially on one ethernet network!

At any given time, these hosts can have both eth0 and eth1 up, plus
any number of the 10 alias IPs up.  We are actually about to cut over
to a new network configuration this week.  However, as the saying
goes, "There's nothing more permanent than a temporary solution." and
dev has basically evolved their testing infrastructure to *require*
this flat network scheme.  I'm currently testing things to make sure
"nothing breaks" in the transition.  One of the things our product
does is look at the list of currently configured interfaces, take the
"highest" IP and "add 1" to the network portion to obtain a new IP on
a different network, but retaining the host portion of the IP.
Basically, there's a multi-host negotiation which takes place and
figures out a "back-channel" to communicate over.  Since name
resolution is not possible either via DNS, /etc/hosts, or other means,
the only reliable means any two hosts have of reliably talking to each
other is making sure that any given host keeps the same host portion
of it's IP address on all networks.

Does this help clarify things?  Ultimately, the ability to support
"network addition" using something wacky like a /19 is entirely my own
intellectual curiosity, since in-house everything is on a /16 making
it trivial.  But it's one of those problems I can neither figure out,
nor let go of :)

As someone said to me yesterday, "IP addresses were never designed to
be manipulated, merely assigned and used!" :)

-- 

Seeya,
Paul
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: perl and network addresses

2006-03-28 Thread Paul Lussier
Jason Stephenson <[EMAIL PROTECTED]> writes:

> It seems to me that the answer is that your IP addresses are limited
> to the range of 10.0.32.0 to 10.0.63.255 with 10.0.0.0 being the
> network address and 10.255.255.255 being the broadcast address, no?

Err, you've got the IP addresses wrong.  It's 10.32.0.0/16, but
segmented on a /19 boundary. I need to be able to calculate the "next"
network, which for 10.32.0.0/19, would be 10.64.0.0/19, then take the
host portion and "add" it to this new network such that any given host
has the same host portion on all networks it may exist on.
-- 

Seeya,
Paul
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: perl and network addresses

2006-03-28 Thread Ben Scott
On 3/28/06, Jason Stephenson <[EMAIL PROTECTED]> wrote:
> Of course, after looking back through the thread, I see Ben has already
> pretty much answered the above. ;)

  "Repetition is the very soul of the net." -- from alt.config

> Paul is using a network that is restricted to using a /19 netmask for
> addressing, but it is really using a /16 when configured. So, he wants
> to limit address to 10.0.32.0/19 but needs to configure broadcast and
> network addresses for 10.0.32.0/16. Why he needs to do that, I have no
> idea and wouldn't need to know. ;)

  Well... okay... but it's the *why* that makes me wonder.  :)

  I hope it's something interesting, and not just that he's trying to
say that he's been assigned the addresses in the range 10.0.32.0/19 on
the 10.0.0.0/16 network.  That would be *so* boring.  :)

> It seems to me that the answer is that your IP addresses are limited to
> the range of 10.0.32.0 to 10.0.63.255 with 10.0.0.0 being the network
> address and 10.255.255.255 being the broadcast address, no?

  Well, /16 means the first two octets are the network portion and the
last two octets are the host portion.  So the broadcast address (with
CIDR)  would be 10.0.255.255.  Of course, 10.0.32.0/16 would normally
be written 10.0.0.0/16, because, again, the third octet is part of the
host portion.  The host portion is really irrelevant when talking
about network numbers.  Convention says we fill the host portion with
zeros.

-- Ben

___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: perl and network addresses

2006-03-28 Thread Ben Scott
On 3/28/06, Paul Lussier <[EMAIL PROTECTED]> wrote:
> If you really want the long convoluted discussion, I'll be glad to
> post it, I just figured no on would care.

  Well, everyone here knows *I* thrive on long, convoluted
discussions.  I'm also curious if you're trying to route packets
through a non-existant gateway again.  ;-)

>>   perl -we '$a = inet_addr("192.0.2.42");'
>>
>> but it complained that inet_addr is not defined.
>
> You likely need to use -MSocket, and then figure out which of the
> correct functions in there are analogous to inet_addr.  The ones which
> leap to mind are inet_ntoa and inet_aton.  There doesn't seem to be an
> inet_addr.

  Hmmm Well, I just tried that quickly, but it looks like Perl's
inet_aton() function results in something that Perl thinks is a
string, not a long integer.  (Probably because inet_aton() is defined
in terms of a pointer to character(s), in typical C fashion.)  I don't
know how to tell Perl to treat the result as the integer it is (so I
can do binary operations on it).

  Or maybe I'm using it wrong.

-- Ben

___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: perl and network addresses

2006-03-28 Thread Jason Stephenson

Paul Lussier wrote:

Python <[EMAIL PROTECTED]> writes:


Would it help to convert to 32-bit integers?  



I might.  I'll try that.


It will definitely help. If you get the "netmask" and address both in 
32-bit integers, then calculating the network and broadcast addresses is 
very straightforward. Here's some sample code:


network = address & netmask;
broadcast = address | ~netmask;

The above is C, but should work in Perl, too.

Of course, after looking back through the thread, I see Ben has already 
pretty much answered the above. ;)






I think I understand the arithmetic.  I do not really understand what
you are trying to do.



That's okay, neither do I ;)

(If you really want the long convoluted discussion, I'll be glad to
post it, I just figured no on would care.  Of course, I also often
misunderstimate the intellectual curiosity of fellow geeks :)


I think Paul explained it pretty well in his first post. Let me explain 
to see if I really understand.


Paul is using a network that is restricted to using a /19 netmask for 
addressing, but it is really using a /16 when configured. So, he wants 
to limit address to 10.0.32.0/19 but needs to configure broadcast and 
network addresses for 10.0.32.0/16. Why he needs to do that, I have no 
idea and wouldn't need to know. ;)


Ben's previous message pretty much explains how to solve this.

It seems to me that the answer is that your IP addresses are limited to 
the range of 10.0.32.0 to 10.0.63.255 with 10.0.0.0 being the network 
address and 10.255.255.255 being the broadcast address, no?


Cheers,
Jason
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: perl and network addresses

2006-03-28 Thread Paul Lussier
"Ben Scott" <[EMAIL PROTECTED]> writes:

>   I tried
>
>   perl -we '$a = inet_addr("192.0.2.42");'
>
> but it complained that inet_addr is not defined.  I suspect there's a
> module somewhere you need to pull in.  Hopefully this is enough to get
> you started.

You likely need to use -MSocket, and then figure out which of the
correct functions in there are analogous to inet_addr.  The ones which
leap to mind are inet_ntoa and inet_aton.  There doesn't seem to be an
inet_addr.
-- 

Seeya,
Paul
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: perl and network addresses

2006-03-28 Thread Paul Lussier
Python <[EMAIL PROTECTED]> writes:

> Would it help to convert to 32-bit integers?  

I might.  I'll try that.

> I think I understand the arithmetic.  I do not really understand what
> you are trying to do.

That's okay, neither do I ;)

(If you really want the long convoluted discussion, I'll be glad to
post it, I just figured no on would care.  Of course, I also often
misunderstimate the intellectual curiosity of fellow geeks :)
-- 

Seeya,
Paul
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: perl and network addresses

2006-03-27 Thread Ben Scott
On 3/27/06, Paul Lussier <[EMAIL PROTECTED]> wrote:
> I'm stumped.  I've got a network address space of 10.0.32/19.  How
> ever, this space is carved up using a /16 netmask.

  HUH?

> Given an address, say 10.0.33.189, I want to get the "network" and
> "host" portion of the address.

  (1) Red Hat provides a nifty utility called "ipcalc" that will do
that for you.  E.g.:

$ ipcalc -b -m -n -p 10.0.33.189/19
NETMASK=255.255.224.0
PREFIX=19
BROADCAST=10.0.63.255
NETWORK=10.0.32.0
$

  (2) I find it's a lot easier to conceptualize this stuff if you
write it out in binary notation (view using a fixed-width font):

/19 = 255.255.224.0

010.000.033.189 = 1010  0011 1001
255.255.224.000 =   1110 
Net portion = 1010  0010 
Node portion=   0001 1001

  (3) You mentioned Perl, but this is the same in most programming
languages: It's simple binary arithmetic and Boolean logic.  All you
need are AND and NOT (complement).  The trickier part is usually
converting from dotted-quad notation to binary storage.  Fortunately,
Unix provides a function for that: inet_addr(2).  C code looks like
this:

/* includes */
#include 
#include 
#include 
#include 
/* main program */
int main() {
/* variables */
unsigned int a;  /* address */
unsigned int m;  /* mask */
unsigned int n;  /* node */
/* get address and mask, in network byte order */
a = inet_addr("192.0.2.42");
m = inet_addr("255.255.255.0");
/* find node portion by AND'ing with complement of net-mask */
n = a & (~m);
/* convert to host byte order */
n = ntohl(n);
/* print result as decimal integer */
printf("node=%d\n", n);
}

  I tried

perl -we '$a = inet_addr("192.0.2.42");'

but it complained that inet_addr is not defined.  I suspect there's a
module somewhere you need to pull in.  Hopefully this is enough to get
you started.

-- Ben

___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: perl and network addresses

2006-03-27 Thread Python
On Mon, 2006-03-27 at 14:25 -0500, Paul Lussier wrote:
> Hi all,
> 
> I'm stumped.  I've got a network address space of 10.0.32/19.  How
> ever, this space is carved up using a /16 netmask.  In otherwords, the
> /19 netmask was simply used to *allocate* the space from 10.0.32.0 to
> 10.0.63.255, but we actually *use* the space with a /16 netmask (yes,
> this means that 10.0.8.10 is in the *same* physical network as
> 10.0.33.93!).
> 
> Given an address, say 10.0.33.189, I want to get the "network" and
> "host" portion of the address.  given that I'm really on a /16, it's
> fairly easy to split the IP at 10.0 and 33.189.  However, I want to be
> able to do the same thing on the /19 as well.  Once I have the network
> and host portions of the address, I need to increment the network
> portion by 1 block, then re-apply the host portion.
> 
> For example, given the address 10.0.33.189/16:
> 
> Network = 10.0   Host = 33.189
>+ 1
>  -
>   10.1 + $HOST = 10.1.33.189
Would it help to convert to 32-bit integers?  

When you add 1 here, you are really adding 2 ** 17.  Your host mask is 
int('1' * 16, 2)
So newIP = oldIP + 2 ** 17
newhost = newIP & hostmask

> 
> And, given the address 10.0.33.189/19:

With a /19, you are adding 2**14
hostmask = int('1' * 13, 2)

Converting a.b.c.d (base 256) to integer is left as an exercise for the
reader.  Perhaps you do not really care about the host mask.  You can
simply convert the newIP back to base-256 notation.

I think I understand the arithmetic.  I do not really understand what
you are trying to do.

> 
> Network = 10.0.32   Host = 1.189
>   + 1
> -
>   10.0.64 + $HOST = 10.1.65.189
> 
> And, given the address 10.0.35.189/19:
> Network = 10.0.32   Host = 3.189
>   + 1
> -
>   10.0.64 + $HOST = 10.1.67.189
> 
> Getting the "next" network block isn't too tough, Net::Netmask does
> that for me.  What I can't quite figure out is how to get the host
> portion, and then add it to the new network portion.  For a classful
> address it's fairly simple, for CIDR address, not so much...
> 
> All ideas are welcome and appreciated :)
> 
> Thanks,
-- 
Lloyd Kvam
Venix Corp

___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: Perl v. Python (was OO.o, was METRO, was...)

2006-03-17 Thread John Abreau

Ben Scott wrote:


  The feeling I have is that Python has only started to get
"mainstream attention" in the past few years, while Perl became
popular sooner.  If true, one wonders why.  And if true, that might
also account for some of the "buzz" around Python; Perl isn't as
"interesting", being more established.  It might also be that Perl is
seen more as a "boring every-day problem solver".



Perl leveraged a lot from shell scripting; for someone already 
proficient in ksh, awk, and sed, it was extremely simple to transition 
to perl. Essentially, you didn't have to start from scratch; perl felt 
like the same old familiar shell scripting, minus the pain of wrestling 
with awk and sed.


--
John Abreau / Executive Director, Boston Linux & Unix
ICQ 28611923 / AIM abreauj / JABBER [EMAIL PROTECTED] / YAHOO abreauj
Email [EMAIL PROTECTED] / WWW http://www.abreau.net / PGP-Key-ID 0xD5C7B5D9
PGP-Key-Fingerprint 72 FB 39 4F 3C 3B D6 5B E0 C8 5A 6E F1 2C BE 99
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: Perl v. Python (was OO.o, was METRO, was...)

2006-03-17 Thread Ben Scott
On 3/17/06, Ted Roche <[EMAIL PROTECTED]> wrote:
>> Nor did I take it as such.  And I was merely observing that, though
>> the languages are both roughly the same age, Perl has significantly
>> more mind-share than Python.
>
> OTOH, other development circles I hang out in are all abuzz about
> Python and Ruby. Perl just sort of "is". Lots of *innovative* things
> seems to be showing up in Python.

  The feeling I have is that Python has only started to get
"mainstream attention" in the past few years, while Perl became
popular sooner.  If true, one wonders why.  And if true, that might
also account for some of the "buzz" around Python; Perl isn't as
"interesting", being more established.  It might also be that Perl is
seen more as a "boring every-day problem solver".

  Do note that the objective factual content of the above paragraph is zero.  :)

-- Ben
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: Perl v. Python (was OO.o, was METRO, was...)

2006-03-17 Thread Christopher Schmidt
On Fri, Mar 17, 2006 at 12:56:13PM -0500, Drew Van Zandt wrote:
> Google: Python vs. Perl

Well Python wins, of course. Google uses Python in way more places than
it uses Perl...

Oh, you probably were using Google as a verb, and not a noun...

-- 
Christopher Schmidt
Web Developer
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: Perl v. Python (was OO.o, was METRO, was...)

2006-03-17 Thread Drew Van Zandt
Google: Python vs. Perl

Of course python is also a normal English-language word...

--DTVZ
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: Perl v. Python (was OO.o, was METRO, was...)

2006-03-17 Thread Michael ODonnell


> It depends upon the minds you're citing.  Google cites 290 million
> hits on Python versus 365 million on Perl, so you could argue
> that's an edge or around a 4:5 ratio.

Possibly.  Of course, those stats might also be an indication
that Perl is (or "many Perl programs are") so much more
confusing than Python that it results in that many millions
more desperate WWW searches for help in understanding it.;->







N.B.  I'm just fanning the flames since I don't know either language...
 
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: Perl include question

2005-12-07 Thread Paul Lussier
Dan Coutu <[EMAIL PROTECTED]> writes:

> Piece of cake. You need to use the FindBin module that is included in
> the default Perl distribution. Do this:
>
> #!/usr/bin/perl
> use FindBin qw($Bin);
> use lib "$Bin";
> use myinclude;
>
> This assumes that your module is named myinclude.pm and is in the same
> directory as your perl script.

I was just about to make this same recommendation.  We've got hundreds
of thousands of lines of perl code here at work, and this is where I
first discovered the FindBin module.  We use it extensively here, and
probably wouldn't be able to do things nearly as easily without it.

Almost every script we write has:

   use FindBin;
   use lib "/build/perl/lastrun/lib";
   use lib "$FindBin::Bin/../../../perl/lib";
   use lib $FindBin::Bin;

It's really nice to not have to worry about your modules not being found :)

-- 

Seeya,
Paul
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: Perl include question

2005-12-05 Thread Jeff Macdonald
On 12/5/05, Dan Coutu <[EMAIL PROTECTED]> wrote:
> use FindBin qw($Bin);
> use lib "$Bin";
> use myinclude;

all of my perl code does basically this, but I stick things in a lib directory:

/some/directory/myapp
/some/directory/myapp/lib

so the use lib line above would turn into

use lib "$Bin/lib";

makes things a little easier to manage.

--
Jeff Macdonald
Ayer, MA
___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: Perl include question

2005-12-05 Thread Thomas Charron
On 12/5/05, Cole Tuininga <[EMAIL PROTECTED]> wrote:
On Mon, 2005-12-05 at 15:59 -0500, Thomas Charron wrote:> use lib '.';Doesn't this assume you're executing the script from its own directory?
In other words, wouldn't this break if I did something like:../otherpath/script.pl
 
  Yeppers..  ;-)  It was a quick reply, didn't have time to fully explain it.  But it's all in the use lib line.  ;-)
 
  Thomas 


Re: Perl include question

2005-12-05 Thread Kevin D. Clark

Cole Tuininga writes:

> I have a module (call it MyMod.pm) that I want to use in a program, but
> I can't install it in with the rest of the perl libraries.  For reasons
> that are too boring to get into, the only guarantee I have is that it
> will be in the same directory as the executable script.
>
> How can I set up my include path (within the perl script) to make sure
> that the directory of the executable is in the include path?  I can't
> hard code it because the location might be different on different
> machines (different mount points).


Try this:

  #!/usr/bin/perl

  BEGIN {
$dirname = $0;
$dirname =~ s#(.*/).*#$1#;
eval "use lib qw($dirname)";
  }

  use MyMod;


Hope this helps,

--kevin
-- 
GnuPG ID: B280F24E

___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: Perl include question

2005-12-05 Thread Dan Coutu
On Mon, 2005-12-05 at 15:59 -0500, Thomas Charron wrote:
> use lib '.';
>  
>   Thomas
> 
Note that this will use your current directory as the place it looks for
your module. The current directory would happen to depend on wherever
you happen to have last done a cd to. That may not be what you really
want. Chances you really want the module to be in the same directory as
the perl script itself, or a directory relative to it. For that FindBin
is the way to go.

Dan


> On 12/5/05, Cole Tuininga <[EMAIL PROTECTED]> wrote: 
> How can I set up my include path (within the perl script) to
> make sure
> that the directory of the executable is in the include
> path?  I can't 
> hard code it because the location might be different on
> different
> machines (different mount points).

___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: Perl include question

2005-12-05 Thread Cole Tuininga
On Mon, 2005-12-05 at 15:59 -0500, Thomas Charron wrote:
> use lib '.';

Doesn't this assume you're executing the script from its own directory?
In other words, wouldn't this break if I did something like:

../otherpath/script.pl


-- 
"The best firewall is a pair of wire cutters."
-Unknown, from the net

Cole Tuininga
Lead Developer
Code Energy, Inc
[EMAIL PROTECTED]
PGP Key ID: 0x43E5755D


___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: Perl include question

2005-12-05 Thread Dan Coutu
On Mon, 2005-12-05 at 15:25 -0500, Cole Tuininga wrote:
> How can I set up my include path (within the perl script) to make sure
> that the directory of the executable is in the include path?  I can't
> hard code it because the location might be different on different
> machines (different mount points).
> 
Piece of cake. You need to use the FindBin module that is included in
the default Perl distribution. Do this:

#!/usr/bin/perl
use FindBin qw($Bin);
use lib "$Bin";
use myinclude;

This assumes that your module is named myinclude.pm and is in the same
directory as your perl script.

For more details use "perldoc FindBin" on the command line.

Dan

___
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: Perl include question

2005-12-05 Thread Thomas Charron
use lib '.'; 
  Thomas
 
On 12/5/05, Cole Tuininga <[EMAIL PROTECTED]> wrote:
How can I set up my include path (within the perl script) to make surethat the directory of the executable is in the include path?  I can't
hard code it because the location might be different on differentmachines (different mount points).


Re: Perl help

2003-07-23 Thread Bob Bell
On Wed, Jul 23, 2003 at 08:18:55AM -0400, Kevin D. Clark <[EMAIL PROTECTED]> wrote:
> [EMAIL PROTECTED] writes:
> > What's the relationship between Perl and C99?
> 
> I don't think that there is a strong relationship.  The Perl source
> code is amazingly portable; it runs on well over 100 platforms.  Most
> of these platforms probably aren't C99 conformant, and so the Perl
> source doesn't depend on C99 features.
> 
> Perl could be enhanced to support these features on C99
> conformant platforms, probably most easily by writing a module.

I mentioned the C99 standard as an international standard for C code
that I suspected most languages printf routines aim to match.  I was
just trying to get more detail on a specfication for printf.

-- 
Bob Bell <[EMAIL PROTECTED]>
-
 "I love deadlines. I like the whooshing sound they make as they fly by."
   -- Douglas Adams, author of _A Hitchhiker's Guide to the Galaxy_
___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: Perl help

2003-07-23 Thread Kevin D. Clark

[EMAIL PROTECTED] writes:

> What's the relationship between Perl and C99?

I don't think that there is a strong relationship.  The Perl source
code is amazingly portable; it runs on well over 100 platforms.  Most
of these platforms probably aren't C99 conformant, and so the Perl
source doesn't depend on C99 features.

Perl could be enhanced to support these features on C99
conformant platforms, probably most easily by writing a module.

Regards,

--kevin
-- 
Kevin D. Clark / Cetacean Networks / Portsmouth, N.H. (USA)
cetaceannetworks.com!kclark (GnuPG ID: B280F24E)
alumni.unh.edu!kdc

___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: Perl help

2003-07-22 Thread Kevin D. Clark

Bob Bell <[EMAIL PROTECTED]> writes:

> On Tue, Jul 22, 2003 at 05:13:03PM -0400, Kevin D. Clark <[EMAIL PROTECTED]> wrote:
> > *3* Interesting fact of the day:  Using binary, it is possible to
> > exactly represent some numbers that cannot be exactly represented
> > in base-10.
> 
> Can you name such a number?  This is un-intuitive to me, since 2 is
> a factor of 10.

I think I goofed: I didn't mean to write "base-2" above.  Instead I
meant to type "different base".

If the statement is amended this way, then I'm sure that I'm correct.


Damn.  I need some sleep.

--kevin
-- 
"I'm on the bike and I go into a rage -- I shriek for about five
 seconds, I shake like mad, my eyes kind of bulge, and I'd never quit.
 That's heart.  That's soul.  That's guts"
-- Lance Armstrong

___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: Perl help

2003-07-22 Thread michael . odonnell


What's the relationship between Perl and C99?

Some insight might be gained from

  man fesetround
___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: Perl help

2003-07-22 Thread Bob Bell
On Tue, Jul 22, 2003 at 05:13:03PM -0400, Kevin D. Clark <[EMAIL PROTECTED]> wrote:
> *3* Interesting fact of the day:  Using binary, it is possible to
> exactly represent some numbers that cannot be exactly represented
> in base-10.

Can you name such a number?  This is un-intuitive to me, since 2 is
a factor of 10.

-- 
Bob Bell <[EMAIL PROTECTED]>
-
 "I love deadlines. I like the whooshing sound they make as they fly by."
   -- Douglas Adams, author of _A Hitchhiker's Guide to the Galaxy_
___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: Perl help

2003-07-22 Thread Bob Bell
On Tue, Jul 22, 2003 at 04:19:17PM -0400, Cole Tuininga <[EMAIL PROTECTED]> wrote:
> However, I'm extremely confused by the following:
> 
> [EMAIL PROTECTED]:~$ perl -e 'print sprintf( "%.2f\n", 0.565 )'
> 0.56
> 
> Can anybody explain why this is not rounding up?  Thanks in advance...

First of all, I don't know why the code isn't simply:
$ perl -e 'printf("%.2f\n", 0.565)'
0.56

or why perl necessarily needs to be part of the solution:
$ printf "%.2f\n" 0.565
0.56
[ The printf command is part of the Single Unix Spec V2 (aka UNIX98) ]

I dug around in the C99 standard, and couldnt't find this referenced
anywhere.  Additionally, I tried playing with more precision, and
turned up the following:
$ perl -e 'printf "%.19f -> %.2f\n", $_, $_ for qw/0.005 0.015 0.025 0.035 0.045/'
0.0050001 -> 0.01
0.0149990 -> 0.01
0.0250010 -> 0.03
0.0350030 -> 0.04
0.0449980 -> 0.04

So I think it's all about the precision of the number as stored as in
its binary representation.

-- 
Bob Bell <[EMAIL PROTECTED]>
-
 "Testing shows the presence, not the absence, of bugs."
   -- Edsger W. Dijkstra, University of Texas
___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: Perl help

2003-07-22 Thread Kevin D. Clark
Stephen Ryan <[EMAIL PROTECTED]> writes:

> Aha!  Google for "round to even" -- it's an IEEE floating point
> computation rule.

Note that many systems *can* do IEEE floating point, but by default
don't, since using the native floating point implementation can yield
better performance.

Regards,

--kevin
-- 
"I'm on the bike and I go into a rage -- I shriek for about five
 seconds, I shake like mad, my eyes kind of bulge, and I'd never quit.
 That's heart.  That's soul.  That's guts"
-- Lance Armstrong

___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: Perl help

2003-07-22 Thread Kevin D. Clark

Cole Tuininga <[EMAIL PROTECTED]> writes:

> Got a perl question for y'all.  I rarely have to do anything with perl,

That's too bad.  

> and I'm sure perl has a good reason for behaving like the following, but
> heck if I can figure it out.
> 
> The perl cookbook suggestions using sprintf for rounding floats.  This
> seemingly works fine:
> 
> [EMAIL PROTECTED]:~$ perl -e 'print sprintf( "%.2f\n", 0.562 )'
> 0.56
> [EMAIL PROTECTED]: perl -e 'print sprintf( "%.2f\n", 0.567 )'
> 0.57
> 
> However, I'm extremely confused by the following:
> 
> [EMAIL PROTECTED]:~$ perl -e 'print sprintf( "%.2f\n", 0.565 )'
> 0.56
> 
> Can anybody explain why this is not rounding up?  Thanks in advance...

The problem is is that you (The Human) see 0.565 as being an exact
floating point number.  Perl, running on The Binary Computer, sees
0.565 as being a character string.  When you implicitly decide to use
"0.565" as a number *1*, Perl, and the underlying system, makes an effort
to convert this character string to the CPU's native floating
representation.  THIS IS NOT AN EXACT PROCESS *2*  *3*.   

Subsequently, when you try to print out the number, and you specify to
sprintf() that you want rounding to occur, it isn't clear what
sprintf() should do in this case -- round up or round down?  Either
choice would be reasonable.

There are many methods of doing rounding, and nearly all of these are
imcompatable.  If rounding is very important to your application, then
you really need to write your own rounding function -- the system
can't do it for you.  *4*


OBTW, your problem isn't specific to Perl.  Perl just uses the
underlying system to do all of the work for you.  C, C++, and yes,
even Python exhibit this behavior as well.

Regards,

--kevin

*1* You are implicitly using floating point, BTW.

*2* WORSE, you might be lulled into the belief that this is an exact
process, since if you attempt to convert this floating point
number to a string with a certain degree of precision, you'll seem
to get your original number back.

*3* Interesting fact of the day:  Using binary, it is possible to
exactly represent some numbers that cannot be exactly represented
in base-10.

*4* I'll be you can find a Math:: library that does what you think is
the right thing here.  Perhaps try Math::FixedPrecision .


-- 
"I'm on the bike and I go into a rage -- I shriek for about five
 seconds, I shake like mad, my eyes kind of bulge, and I'd never quit.
 That's heart.  That's soul.  That's guts"
-- Lance Armstrong

___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: Perl help

2003-07-22 Thread Stephen Ryan
On Tue, 2003-07-22 at 16:41, Stephen Ryan wrote:
> On Tue, 2003-07-22 at 16:36, Erik Price wrote:
> > Cole Tuininga wrote:
> > > Got a perl question for y'all.  I rarely have to do anything with perl,
> > > and I'm sure perl has a good reason for behaving like the following, but
> > > heck if I can figure it out.
> > > 
> > > The perl cookbook suggestions using sprintf for rounding floats.  This
> > > seemingly works fine:
> > > 
> > > [EMAIL PROTECTED]:~$ perl -e 'print sprintf( "%.2f\n", 0.562 )'
> > > 0.56
> > > [EMAIL PROTECTED]: perl -e 'print sprintf( "%.2f\n", 0.567 )'
> > > 0.57
> > > 
> > > However, I'm extremely confused by the following:
> > > 
> > > [EMAIL PROTECTED]:~$ perl -e 'print sprintf( "%.2f\n", 0.565 )'
> > > 0.56
> > 
> > I don't have an answer, Cole, but the same happens in Python and I'd bet 
> > in C as well -- must be a convention of the printf routines:
> > 
> > Python 2.2.2 (#1, Mar  9 2003, 08:18:26)
> > [GCC 3.2 20020927 (prerelease)] on cygwin
> > Type "help", "copyright", "credits" or "license" for more information.
> >  >>> print "%.2f\n" % 0.562
> > 0.56
> > 
> >  >>> print "%.2f\n" % 0.567
> > 0.57
> > 
> >  >>> print "%.2f\n" % 0.565
> > 0.56
> 
> 
> Aha!  Google for "round to even" -- it's an IEEE floating point
> computation rule.

Errm.  I take it back.

$ perl -e 'print sprintf( "%.2f\n", 0.575 )'
0.57

Dunno what's up with that.
___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: Perl help

2003-07-22 Thread Bill Mullen
Erik Price said:
>
> Cole Tuininga wrote:
>> Got a perl question for y'all.  I rarely have to do anything with
>> perl, and I'm sure perl has a good reason for behaving like the
>> following, but heck if I can figure it out.
>>
>> The perl cookbook suggestions using sprintf for rounding floats.  This
>> seemingly works fine:
>>
>> [EMAIL PROTECTED]:~$ perl -e 'print sprintf( "%.2f\n", 0.562 )'
>> 0.56
>> [EMAIL PROTECTED]: perl -e 'print sprintf( "%.2f\n", 0.567 )'
>> 0.57
>>
>> However, I'm extremely confused by the following:
>>
>> [EMAIL PROTECTED]:~$ perl -e 'print sprintf( "%.2f\n", 0.565 )'
>> 0.56
>
> I don't have an answer, Cole, but the same happens in Python and I'd bet
>  in C as well -- must be a convention of the printf routines:
>
> Python 2.2.2 (#1, Mar  9 2003, 08:18:26)
> [GCC 3.2 20020927 (prerelease)] on cygwin
> Type "help", "copyright", "credits" or "license" for more information.
>  >>> print "%.2f\n" % 0.562
> 0.56
>
>  >>> print "%.2f\n" % 0.567
> 0.57
>
>  >>> print "%.2f\n" % 0.565
> 0.56

It's kind of a kludge, but perhaps adding some very small value such as
0.1 just prior to the rounding will get the result you want?

[EMAIL PROTECTED]:~$ perl -e 'print sprintf( "%.2f\n", 0.56501 )'
0.57

-- 
Bill Mullen   [EMAIL PROTECTED]   MA, USA   RLU #270075   MDK 8.1 & 9.0
"Giving money and power to the government is like giving whiskey and
car keys to teenage boys."  - P.J. O'Rourke


___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


RE: Perl help

2003-07-22 Thread Bryan Kate

> Can anybody explain why this is not rounding up?  Thanks in advance...

It view .5 as a round down situation, I have seen it in other languages,
too...

- bryan
___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: Perl help

2003-07-22 Thread Stephen Ryan
On Tue, 2003-07-22 at 16:36, Erik Price wrote:
> Cole Tuininga wrote:
> > Got a perl question for y'all.  I rarely have to do anything with perl,
> > and I'm sure perl has a good reason for behaving like the following, but
> > heck if I can figure it out.
> > 
> > The perl cookbook suggestions using sprintf for rounding floats.  This
> > seemingly works fine:
> > 
> > [EMAIL PROTECTED]:~$ perl -e 'print sprintf( "%.2f\n", 0.562 )'
> > 0.56
> > [EMAIL PROTECTED]: perl -e 'print sprintf( "%.2f\n", 0.567 )'
> > 0.57
> > 
> > However, I'm extremely confused by the following:
> > 
> > [EMAIL PROTECTED]:~$ perl -e 'print sprintf( "%.2f\n", 0.565 )'
> > 0.56
> 
> I don't have an answer, Cole, but the same happens in Python and I'd bet 
> in C as well -- must be a convention of the printf routines:
> 
> Python 2.2.2 (#1, Mar  9 2003, 08:18:26)
> [GCC 3.2 20020927 (prerelease)] on cygwin
> Type "help", "copyright", "credits" or "license" for more information.
>  >>> print "%.2f\n" % 0.562
> 0.56
> 
>  >>> print "%.2f\n" % 0.567
> 0.57
> 
>  >>> print "%.2f\n" % 0.565
> 0.56


Aha!  Google for "round to even" -- it's an IEEE floating point
computation rule.
___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: Perl help

2003-07-22 Thread Erik Price


Cole Tuininga wrote:
Got a perl question for y'all.  I rarely have to do anything with perl,
and I'm sure perl has a good reason for behaving like the following, but
heck if I can figure it out.
The perl cookbook suggestions using sprintf for rounding floats.  This
seemingly works fine:
[EMAIL PROTECTED]:~$ perl -e 'print sprintf( "%.2f\n", 0.562 )'
0.56
[EMAIL PROTECTED]: perl -e 'print sprintf( "%.2f\n", 0.567 )'
0.57
However, I'm extremely confused by the following:

[EMAIL PROTECTED]:~$ perl -e 'print sprintf( "%.2f\n", 0.565 )'
0.56
I don't have an answer, Cole, but the same happens in Python and I'd bet 
in C as well -- must be a convention of the printf routines:

Python 2.2.2 (#1, Mar  9 2003, 08:18:26)
[GCC 3.2 20020927 (prerelease)] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> print "%.2f\n" % 0.562
0.56
>>> print "%.2f\n" % 0.567
0.57
>>> print "%.2f\n" % 0.565
0.56


Erik

___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss


Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-22 Thread pll


In a message dated: Thu, 22 Aug 2002 08:56:37 EDT
"Jerry Feldman" said:

>Burger King's point of Sale system in the early 1970s was a PDP-8M with 4 
>attached registers. No disk, no paper tape, core memory. For the modem, we 
>had to time the 1200 baud with timing loops and send a bit at a time. No 
>UART. We also had to strike the hammers on the printer drum. Keyboard 
>required to reads (row and column). If the system crashed, a service guy 
>had to come in, plug in the paper tape board, and reload the program. 

You know, I just heard someone complaining that the quaility of 
"service" people has taken a drastic drop in the last 20-30 years.
I guess if, to work for Burger King inthe 1970s you needed to be able 
to operate a PDP-8 class machine you'd have to be a whole lot smarter 
than those "touch screen monkeys" they have now-a-days, which 
explains why QoS at the burger joints has gone down hill ;)
-- 

Seeya,
Paul
--
It may look like I'm just sitting here doing nothing,
   but I'm really actively waiting for all my problems to go away.

 If you're not having fun, you're not doing it right!


___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-22 Thread pll


In a message dated: Thu, 22 Aug 2002 09:02:50 EDT
Jon Hall said:

>O.K.:
>
>First you toggle in the BIN loader.  On the PDP-8 this was seventeen
>twelve-bit instructions, so you have to flip (and get ABSOLUTELY CORRECT)
>204 switches, and this was AFTER you toggled in the correct starting address.

Okay, I've got to ask.  Anyone here actually have this 204
switch-toggling sequence *still* memorized after all these years? ;)
-- 

Seeya,
Paul
--
It may look like I'm just sitting here doing nothing,
   but I'm really actively waiting for all my problems to go away.

 If you're not having fun, you're not doing it right!


___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-22 Thread pll


In a message dated: Thu, 22 Aug 2002 00:12:36 EDT
"Bayard R. Coolidge" said:

>[EMAIL PROTECTED] asked:
>
 was Unix ever developed on any of those?
>(meaning the 12-bit PDP-8/PDP-12 architectures)
>
>AFAIK, no. I believe that the original development was
>on some PDP-11's (11/45's?) that Bell Labs had at the time.

I thought they were PDP-7s, no?  If so, then they wouldn't need to 
back-port to the 8, would they?  Though for some reason, I thought 
that the 7 and 11 were closer in architecture and that the 8 was 
totally different than anything else.

>Those, of course, are 16-bit machines. But, I don't ever
>hearing about any "back-porting" to the PDP-8's. At the
>time, it would have been a real PITA, because the I/O
>architectures were totally different.

Different from the 7 *and* 11, or just different from the 11?

-- 

Seeya,
Paul
--
It may look like I'm just sitting here doing nothing,
   but I'm really actively waiting for all my problems to go away.

 If you're not having fun, you're not doing it right!


___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-22 Thread pll


In a message dated: Wed, 21 Aug 2002 19:30:45 EDT
[EMAIL PROTECTED] said:

>  I'm just curious... was Unix ever developed on any of those?  I was pretty
>much under the impression that Unix assumes an 8-bit byte, but I don't
>really have anything to back that up...

It was originally *developed* on a PDP-7 if my memory banks are 
correctly ECC'ed :)

I believe it was ported to the PDP-8 at one point, but I don't 
remember for sure.  I can check my copy of "25 years w/ UNIX" tonight 
when I get home if you wish :)
-- 

Seeya,
Paul
--
It may look like I'm just sitting here doing nothing,
   but I'm really actively waiting for all my problems to go away.

 If you're not having fun, you're not doing it right!


___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-22 Thread Jon Hall


[EMAIL PROTECTED] said:
> All this in 4K memory.

Yeah, but Burger King was not selling as many hamburgers back in those days. :-)

md
-- 
=
Jon "maddog" Hall
Executive Director   Linux International(SM)
email: [EMAIL PROTECTED] 80 Amherst St. 
Voice: +1.603.672.4557   Amherst, N.H. 03031-3032 U.S.A.
WWW: http://www.li.org

Board Member: Uniforum Association, USENIX Association

(R)Linux is a registered trademark of Linus Torvalds in several countries.
(SM)Linux International is a service mark of Linux International, Inc.

___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-22 Thread Jerry Feldman

Actually, WRT: Burger King, the PDP-8 was located under the counter. The 
AMF service guys were equipped with a briefcase mounted paper tape reader, 
and a few other things including the board. The POS maintained inventory, 
hourly sales by product, cash control, as well as the normal POS functions. 
The data was transmitted to Miami every night. There was only a single 
day's storage available. 100% of the software was written in PDP-8 
assembler (Sabre I believe). Program changes were uploaded as necessary. 
All this in 4K memory. 
On 22 Aug 2002 at 9:18, Hewitt Tech wrote:

> Or alternatively the service person could load the appropriate diagnostic
> into a machine and then carry the core memory module to the system that
> needed to be diagnosed. This could be very useful when the system you needed
> to repair was difficult to get at (sitting in a cramped closet, etc.). The
> memory module was easier to get at then trying to plug in a peripheral and
> it's controller. Once you had the core memory plugged into the system you
> would load the starting address of the diagnostic and then hit the "run"
> switch.
> 
> -Alex
> 
> P.S. Geez, I guess I am getting to be "older than dirt"! ;^)
> 
> - Original Message -
> From: "Jerry Feldman" <[EMAIL PROTECTED]>
> To: "Greater NH Linux User Group" <[EMAIL PROTECTED]>
> Sent: Thursday, August 22, 2002 8:56 AM
> Subject: Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]
> 
> 
> > Discussed that last night at the BLU meeting.
> > Many of the PDP-8s did not come with a ROM. To load the executive, you
> > would key in the RIM(ReadInMode) loader on the front panel switches. The
> > RIM loader was a very simple paper tape reader program whose purpose was
> to
> > read in the real paper tape loader. From there you could reload the PDP-8.
> >
> > Burger King's point of Sale system in the early 1970s was a PDP-8M with 4
> > attached registers. No disk, no paper tape, core memory. For the modem, we
> > had to time the 1200 baud with timing loops and send a bit at a time. No
> > UART. We also had to strike the hammers on the printer drum. Keyboard
> > required to reads (row and column). If the system crashed, a service guy
> > had to come in, plug in the paper tape board, and reload the program.
> > On 22 Aug 2002 at 8:36, [EMAIL PROTECTED] wrote:
> > >   Okay, I have to ask: What's a "RIM loader"?
> >
> > --
> > Jerry Feldman <[EMAIL PROTECTED]>
> > Associate Director
> > Boston Linux and Unix user group
> > http://www.blu.org PGP key id:C5061EA9
> > PGP Key fingerprint:053C 73EC 3AC1 5C44 3E14 9245 FB00 3ED5 C506 1EA9
> >
> > ___
> > gnhlug-discuss mailing list
> > [EMAIL PROTECTED]
> > http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss
> >
> 


-- 
Jerry Feldman <[EMAIL PROTECTED]>
Associate Director
Boston Linux and Unix user group
http://www.blu.org PGP key id:C5061EA9
PGP Key fingerprint:053C 73EC 3AC1 5C44 3E14 9245 FB00 3ED5 C506 1EA9

___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-22 Thread Hewitt Tech

Or alternatively the service person could load the appropriate diagnostic
into a machine and then carry the core memory module to the system that
needed to be diagnosed. This could be very useful when the system you needed
to repair was difficult to get at (sitting in a cramped closet, etc.). The
memory module was easier to get at then trying to plug in a peripheral and
it's controller. Once you had the core memory plugged into the system you
would load the starting address of the diagnostic and then hit the "run"
switch.

-Alex

P.S. Geez, I guess I am getting to be "older than dirt"! ;^)

- Original Message -
From: "Jerry Feldman" <[EMAIL PROTECTED]>
To: "Greater NH Linux User Group" <[EMAIL PROTECTED]>
Sent: Thursday, August 22, 2002 8:56 AM
Subject: Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]


> Discussed that last night at the BLU meeting.
> Many of the PDP-8s did not come with a ROM. To load the executive, you
> would key in the RIM(ReadInMode) loader on the front panel switches. The
> RIM loader was a very simple paper tape reader program whose purpose was
to
> read in the real paper tape loader. From there you could reload the PDP-8.
>
> Burger King's point of Sale system in the early 1970s was a PDP-8M with 4
> attached registers. No disk, no paper tape, core memory. For the modem, we
> had to time the 1200 baud with timing loops and send a bit at a time. No
> UART. We also had to strike the hammers on the printer drum. Keyboard
> required to reads (row and column). If the system crashed, a service guy
> had to come in, plug in the paper tape board, and reload the program.
> On 22 Aug 2002 at 8:36, [EMAIL PROTECTED] wrote:
> >   Okay, I have to ask: What's a "RIM loader"?
>
> --
> Jerry Feldman <[EMAIL PROTECTED]>
> Associate Director
> Boston Linux and Unix user group
> http://www.blu.org PGP key id:C5061EA9
> PGP Key fingerprint:053C 73EC 3AC1 5C44 3E14 9245 FB00 3ED5 C506 1EA9
>
> ___
> gnhlug-discuss mailing list
> [EMAIL PROTECTED]
> http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss
>

___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-22 Thread Jon Hall


[EMAIL PROTECTED] said:
> AFAIK, no. I believe that the original development was on some
> PDP-11's (11/45's?)

No, the original development was on a PDP-7, and in assembler.

The second machine it ran on was a PDP-11, also in assembler.  It was after
that port that Dennis wrote "C", to make the next port easier.  I think that
for the most part he succeeded.

[EMAIL PROTECTED] said:
>   Okay, I have to ask: What's a "RIM loader"? 

O.K.:

First you toggle in the BIN loader.  On the PDP-8 this was seventeen twelve-bit
instructions, so you have to flip (and get ABSOLUTELY CORRECT) 204 switches,
and this was AFTER you toggled in the correct starting address.

That BIN loader then loaded in a paper tape that had the RIM loader on it,
which (hopefully) stayed in memory to load in things like an Editor, Assembler
and (eventually) your program.  However, with only 4K words (and poor
programming skills) you usually overwrote the RIM loader with your program
bombing (er, ah) running, so you had to start ALL OVER AGAIN.

Ah, the good old days. :-)

md
-- 
=
Jon "maddog" Hall
Executive Director   Linux International(SM)
email: [EMAIL PROTECTED] 80 Amherst St. 
Voice: +1.603.672.4557   Amherst, N.H. 03031-3032 U.S.A.
WWW: http://www.li.org

Board Member: Uniforum Association, USENIX Association

(R)Linux is a registered trademark of Linus Torvalds in several countries.
(SM)Linux International is a service mark of Linux International, Inc.

___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-22 Thread Jerry Feldman

Discussed that last night at the BLU meeting. 
Many of the PDP-8s did not come with a ROM. To load the executive, you 
would key in the RIM(ReadInMode) loader on the front panel switches. The 
RIM loader was a very simple paper tape reader program whose purpose was to 
read in the real paper tape loader. From there you could reload the PDP-8.

Burger King's point of Sale system in the early 1970s was a PDP-8M with 4 
attached registers. No disk, no paper tape, core memory. For the modem, we 
had to time the 1200 baud with timing loops and send a bit at a time. No 
UART. We also had to strike the hammers on the printer drum. Keyboard 
required to reads (row and column). If the system crashed, a service guy 
had to come in, plug in the paper tape board, and reload the program. 
On 22 Aug 2002 at 8:36, [EMAIL PROTECTED] wrote:
>   Okay, I have to ask: What's a "RIM loader"?

-- 
Jerry Feldman <[EMAIL PROTECTED]>
Associate Director
Boston Linux and Unix user group
http://www.blu.org PGP key id:C5061EA9
PGP Key fingerprint:053C 73EC 3AC1 5C44 3E14 9245 FB00 3ED5 C506 1EA9

___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-22 Thread bscott

On Thu, 22 Aug 2002, at 12:12am, Bayard R. Coolidge wrote:
> Bayard, who tried, but failed to find his old copy of the
> RIM loader...

  Okay, I have to ask: What's a "RIM loader"?

-- 
Ben Scott <[EMAIL PROTECTED]>
| The opinions expressed in this message are those of the author and do not |
| necessarily represent the views or policy of any other person, entity or  |
| organization.  All information is provided without warranty of any kind.  |

___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-21 Thread Bayard R. Coolidge

[EMAIL PROTECTED] asked:

>>> was Unix ever developed on any of those?
(meaning the 12-bit PDP-8/PDP-12 architectures)

AFAIK, no. I believe that the original development was
on some PDP-11's (11/45's?) that Bell Labs had at the time.
Those, of course, are 16-bit machines. But, I don't ever
hearing about any "back-porting" to the PDP-8's. At the
time, it would have been a real PITA, because the I/O
architectures were totally different. Also, by the time
that UNIX was more or less working well enough to distribute
to its users, the PDP-8 was rapidly approaching end-of-life;
DEC had jumped through some really wierd hoops to get it
to address 128kb of memory, and it was clear that that was it.
The PDP-11s, on the other hand, could do that much fairly
easily and was obviously much more extendible. Much of the
development in the mid-70's was to meet some interesting
requirements that customers had voiced, and obviously some
of those customers were running UNIX.

HTH,

Bayard, who tried, but failed to find his old copy of the
RIM loader...
___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-21 Thread bscott

On Wed, 21 Aug 2002, at 6:44pm, Jon Hall wrote:
> To throw a bit (pun un-intentional) more into this discussion, don't
> assume that a "byte" was eight bits.  The PDP-8, Linc-8 and PDP-12 for
> instance, were all twelve bit words, broken down into two six-bit
> characters.

  I'm just curious... was Unix ever developed on any of those?  I was pretty
much under the impression that Unix assumes an 8-bit byte, but I don't
really have anything to back that up...

-- 
Ben Scott <[EMAIL PROTECTED]>
| The opinions expressed in this message are those of the author and do not |
| necessarily represent the views or policy of any other person, entity or  |
| organization.  All information is provided without warranty of any kind.  |

___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-21 Thread Jon Hall

To throw a bit (pun un-intentional) more into this discussion, don't assume
that a "byte" was eight bits.  The PDP-8, Linc-8 and PDP-12 for instance, were
all twelve bit words, broken down into two six-bit characters.

Nevertheless, back in those days saving a few bits for every entry in a symbol
table was worth the time and effort.

md
-- 
=
Jon "maddog" Hall
Executive Director   Linux International(SM)
email: [EMAIL PROTECTED] 80 Amherst St. 
Voice: +1.603.672.4557   Amherst, N.H. 03031-3032 U.S.A.
WWW: http://www.li.org

Board Member: Uniforum Association, USENIX Association

(R)Linux is a registered trademark of Linus Torvalds in several countries.
(SM)Linux International is a service mark of Linux International, Inc.

___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-21 Thread bscott

On Wed, 21 Aug 2002, at 2:52pm, Bill Freeman wrote:
> The description is close.  Radix 50 actually allows you to get three
> characters into a 16 bit word (40*40*40 <= 65536), or 6 into a 32 bit
> word.

  Ya know, I thought a gain of only one character (five characters, vs the
four 8-bit bytes in a 32-bit word) seemed too small, but I didn't actually
do the math.

  Hypothesis: Since "creat" is a system call, and system calls are often
implemented "behind the scenes" by functions with an underscore prefix
(i.e., "_creat"), that might explain where the sixth character went.

  This debate only goes to show why Ken Thompson might well believe that the
biggest mistake he made was spelling "creat" without the trailing "e".  :-)

-- 
Ben Scott <[EMAIL PROTECTED]>
| The opinions expressed in this message are those of the author and do not |
| necessarily represent the views or policy of any other person, entity or  |
| organization.  All information is provided without warranty of any kind.  |

___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-21 Thread Bill Freeman

Mark Komarinski writes:
 > Good thing more colors other than green and amber were invented too.

Newcommer!  We only had black print on those cards and listings.
___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-21 Thread Bill Freeman

[EMAIL PROTECTED] writes:
 >   Way back when 16 kilobytes was a lot of memory, a method for encoding five
 > characters into a single 32-bit machine word was developed.  It was called
 > "Radix-50", or "RAD50".  The 50 is octal, or 40 decimal.  The character set
 > was 26 monocase letters, 10 digits, three special characters, and a null (a
 > total of 40).  This encoding was used in the linkers of various DEC PDP
 > operating systems, which is where Unix was born.
 > 
 >   (That could, of course, be incorrect, but I did find references to
 > Radix-50/RAD50 in some old DEC migration documentation.)

It was also known as "squoze code" around the M.I.T. AI lab.
RAD50 may have originated at DEC, but I wouldn't bet either way.

The description is close.  Radix 50 actually allows you to get
three characters into a 16 bit word (40*40*40 <= 65536), or 6 into a
32 bit word.  5 characters will actually fit into 27 bits (10240
being no greater than 134217728).  That means that you can also have
up to 5 bits of "flags", say, for symbol type, in the same (double 16
bit) word of your symbol table as that which stores the name.  When it
wasn't uncommon to have as little as 4k words (8k bytes) on your
PDP-11/20, people really did care about bit twiddling.

People writing in assembly language for such machines didn't
seem to chaff at such symbol length restrictions.  (Perhaps few of
them could type, and short names were easier.)  Linkers developed for
use with assemblers were pressed into service for linking C because
originally the C compiler produced assembly languagy, and the
assembler was invoked on the output.

Bill
___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-21 Thread bscott

On Wed, 21 Aug 2002, at 10:10am, [EMAIL PROTECTED] wrote:
> Okay, I'll buy that, but why create a linker that only supports 5
> character function names?

  Okay, some Google searches eventually tracked down this explanation:

  Way back when 16 kilobytes was a lot of memory, a method for encoding five
characters into a single 32-bit machine word was developed.  It was called
"Radix-50", or "RAD50".  The 50 is octal, or 40 decimal.  The character set
was 26 monocase letters, 10 digits, three special characters, and a null (a
total of 40).  This encoding was used in the linkers of various DEC PDP
operating systems, which is where Unix was born.

  (That could, of course, be incorrect, but I did find references to
Radix-50/RAD50 in some old DEC migration documentation.)

> I guess I don't fully understand the role of linkers, if this should be an
> obvious thing :)

  A compiler/assembler turns source code into object code modules.  Those
modules are not working programs yet; they have symbolic names instead of
addresses for variables and functions in many places.  You then need to link
the modules together, which includes replacing symbolic names with machine
addresses everywhere.  The output of the linking process is an executable
program.

  Run-time dynamic linking makes things more complex.  *hand wave*

-- 
Ben Scott <[EMAIL PROTECTED]>
| The opinions expressed in this message are those of the author and do not |
| necessarily represent the views or policy of any other person, entity or  |
| organization.  All information is provided without warranty of any kind.  |

___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-21 Thread Mark Komarinski

Good thing more colors other than green and amber were invented too.

-Mark

On Wed, Aug 21, 2002 at 11:00:10AM -0400, Andrew W. Gaunt wrote:
> 
> Back in the early days of computers there weren't
> as many characters to go around and folks had to 
> be very conservative with their use. Since then, more
> have been pulled out of the ground so we can use
> them more liberally.
> 
> -- 
> __
>  | 0|___||.  Andrew Gaunt *nix Sys. Admin., etc.
> _| _| : : }  [EMAIL PROTECTED] - http://www-cde.mv.lucent.com/~quantum
>  -(O)-==-o\  [EMAIL PROTECTED] - http://www.gaunt.org
___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-21 Thread Andrew W. Gaunt


Back in the early days of computers there weren't
as many characters to go around and folks had to 
be very conservative with their use. Since then, more
have been pulled out of the ground so we can use
them more liberally.

-- 
__
 | 0|___||.  Andrew Gaunt *nix Sys. Admin., etc.
_| _| : : }  [EMAIL PROTECTED] - http://www-cde.mv.lucent.com/~quantum
 -(O)-==-o\  [EMAIL PROTECTED] - http://www.gaunt.org

[EMAIL PROTECTED] wrote:
> 
> In a message dated: Tue, 20 Aug 2002 16:43:36 EDT
> [EMAIL PROTECTED] said:
> 
> >  I believe it was Ken Thompson, and I believe the remark was intended to be
> >humorous.  Step back and ask: Why would he spell "create" as "creat" in the
> >first place?  If you are going to type five characters, you might as well
> >type six.  The reason it was spelled "creat" in the first place was the
> >linked only supported five characters.  That has caused much
> >head-scratching, question-asking, and recompiling-due-to-typos; hence the
> >remark about the spelling.
> 
> Okay, I'll buy that, but why create a linker that only supports 5
> character function names? What was it which caused this scenario?
> I guess I don't fully understand the role of linkers, if this should
> be an obvious thing :)
> --
> 
> Seeya,
> Paul
> --
> It may look like I'm just sitting here doing nothing,
>but I'm really actively waiting for all my problems to go away.
> 
>  If you're not having fun, you're not doing it right!
> 
> ___
> gnhlug-discuss mailing list
> [EMAIL PROTECTED]
> http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss
___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: Perl (or Unix vs. MS, actually)

2002-08-21 Thread pll


In a message dated: Tue, 20 Aug 2002 16:52:35 EDT
"Steven W. Orr" said:

>On Tue, 20 Aug 2002 [EMAIL PROTECTED] wrote:
>=>In a message dated: Tue, 20 Aug 2002 15:16:58 CDT
>=>Thomas Charron said:
>=>
>=>For example, in shell, the construct:
>=>
>=> cd /tmp && rm foo
>
>Whotchoo talkin 'bout Willis?
>
>cd == chdir is a builtin command. But point taken.

Okay, bad example :)  How about:

PID=`ps -ef | grep foo | awk '{print $2}'`
kill -9 $PID

That's 4 sub-processes :)

>Actually, debugging bash isn't all that bad. 

I'm not saying it can't be done, but...

>set -x 

isn't the same as a debugger with break points, watches, etc.

>And there is a full blown 
>debugger available for ksh with breakpoints and everything. :-)

Ooh, now *that's* cool!  Thanks!
-- 

Seeya,
Paul
--
It may look like I'm just sitting here doing nothing,
   but I'm really actively waiting for all my problems to go away.

 If you're not having fun, you're not doing it right!


___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-21 Thread pll


In a message dated: Tue, 20 Aug 2002 16:43:36 EDT
[EMAIL PROTECTED] said:

>  I believe it was Ken Thompson, and I believe the remark was intended to be
>humorous.  Step back and ask: Why would he spell "create" as "creat" in the
>first place?  If you are going to type five characters, you might as well
>type six.  The reason it was spelled "creat" in the first place was the
>linked only supported five characters.  That has caused much
>head-scratching, question-asking, and recompiling-due-to-typos; hence the
>remark about the spelling.

Okay, I'll buy that, but why create a linker that only supports 5 
character function names? What was it which caused this scenario?
I guess I don't fully understand the role of linkers, if this should 
be an obvious thing :)
-- 

Seeya,
Paul
--
It may look like I'm just sitting here doing nothing,
   but I'm really actively waiting for all my problems to go away.

 If you're not having fun, you're not doing it right!


___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: Perl (or Unix vs. MS, actually)

2002-08-20 Thread Derek D. Martin

-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

At some point hitherto, [EMAIL PROTECTED] hath spake thusly:
>   Yet you complain about Perl being hard to learn and use, for the same
> reasons, and not just for you, but for everyone?

I absolutely said no such thing.  

Let's make this even simpler.

Mike O'Donnell commented about finding the prospect of learning Perl
daunting.  I attempted to convey to the perlheads here who responded
with incredulity that I too had the same reaction, attempted to learn
it, found that learning *facile* use of it was more difficult than any
other language I'd tried to learn.  I then proceeded to attempt to
explain why *I* found it that way, apparently to no one's
satisfaction.  Suffice it to say that the reasons don't much matter.
Whatever the reason, that was my experience, and so I can sympathize
with anyone who voices those kinds of opinions.

I'm done with this topic.

- -- 
Derek Martin   [EMAIL PROTECTED]
- -
I prefer mail encrypted with PGP/GPG!
GnuPG Key ID: 0x81CFE75D
Retrieve my public key at http://pgp.mit.edu
Learn more about it at http://www.gnupg.org
-BEGIN PGP SIGNATURE-
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org

iD8DBQE9YvRKdjdlQoHP510RAmxvAKCK63cngoBI1lKJMYC1IV7dK/+CMwCdHpEY
DHiXcd02zX933Gi4VoyFNJQ=
=gng9
-END PGP SIGNATURE-
___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-20 Thread Jerry Feldman

Didn't you work with Grace Hopper :-)
"Hewitt Tech" wrote:
> You had "C"? All we had was assembler! You had assembler? All we had was
> ones and zeros! You had ones and zeros? ...
-- 
--
Gerald Feldman <[EMAIL PROTECTED]>
Boston Computer Solutions and Consulting
ICQ#156300 PGP Key ID:C5061EA9
PGP Key fingerprint:053C 73EC 3AC1 5C44 3E14 9245 FB00 3ED5 C506 1EA9

___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: Perl (or Unix vs. MS, actually)

2002-08-20 Thread bscott

On Tue, 20 Aug 2002, at 12:37pm, Derek D. Martin wrote:

[ Several paragraphs of completely irrelevant and bogus argument deleted.  
  I will provide explicit debunking of said argument if so requested. ]

> There are very few Unix commands whose names are completely
> unintelligible, and learning them is much easier than learning the
> difference between $^P and $^B.  At least for me, and I suspect most
> people.

[ ... snip ... ]

> Perhaps.  But I have a very good grasp of regexp and that's definitely
> not what *I* am talking about.

  Okay, so, you have no trouble understanding the Unix environment, which is
inconsistent, obscure, and cryptic.  You have no trouble with regular
expressions, which have, arguably, the most cryptic syntax of any popular
language construct, ever.

  Yet you complain about Perl being hard to learn and use, for the same
reasons, and not just for you, but for everyone?  That does not add up.  Is
Perl cryptic?  Sure.  So are many other things which *you have no problem
with*, which was my point.

  I am willing to bet, dollars to donuts, that the real reason you find Unix
"easy" while Perl is "hard" is that you use Unix every day, day in, and day
out, while Perl is something you only dabble in.  Of course, I cannot prove
that assertion, but I ask you consider it as objectively as you can (if that
is not a complete logical impossibility, which I rather suspect it is).

On Tue, 20 Aug 2002, at 3:01pm, Derek D. Martin wrote:
>  - Perl "grew" rather than being designed.  Its syntax is a
>  mish-mash of features from several other languages and/or utilities
>  all glued together, and as such sometimes seems to be inconsistent
>  with itself.

  Agreed.  But, again, Unix is the same way, and so is MS-Windows, yet we
have no problem telling people they can/should learn those.  Why does Perl
get singled out?

>  - Perl does some things which are commonly done in programming
>languages very, very differently from the rest

  True, but irrelevant.  Compare Python, C, and Scheme, and you'll get a far
bigger diff.  All programming languages are different.

> - Perl has a lot of obscure features and syntax, like the so-called
>  "magic" variables, that don't lend themselves to readable code

  Marginal.

  Mechanisms are in place to eliminate the magic variable problem, because
said magic variables are recognized as cryptic.  What I find more telling is
that, at least in my experience, few of those magic variables are needed in
practice.  I certainly rarely use them.

  It is like complaining about trigraphs in C.  Yes, they are obscure and
cryptic, but nobody uses them, so who cares?

  Can you give an example of anything *other* than the magic variable
problem?  I am starting to think you're just hung up on magic variables, the
way some people get wedged on whitespace in Python.

> - The people who write Perl by and large seem to prefer a style (if
> you can call it that) that promotes neither code readability nor
> education

  Can you back that up with any kind of real evidence?

  My personal theory on this is a bit different.  There are people who like
to write dense, terse, cryptic code.  Perl, being the flexible beast that it
is, lets those people do that to the extreme.  So those people tend to
gravitate to Perl.  You see a lot more such code written in Perl, because
Perl is the best tool to do it in -- a dubious distinction, I'll agree.

  However, just because there are a large number of hacks writing line-noise
in Perl doesn't mean every Perl coder on the planet does it.  I certainly
don't find much of that stuff in the Camel books, other than deliberate
instances of it.

> For all its wiz-bang features that make many tasks which are difficult on
> other languages much easier in perl, it lacks the ability to easily
> manipulate data structures ...

  True, and a recognized problem, and one that is being worked on in Perl 6.  
However, I don't think anyone was suggesting that Perl is the universal fix
to all programming problems.  Perl excels at munching text, working with
dynamic lists of flat data, and associative lookups (among other things).  
The tasks Perl does well are all tasks done frequently in computer programs
as well.

> But many of the features of Perl compound [the problem of reading other
> people's code], making for naturally ugly code.

  I find that Perl often leads to naturally elegant code, when used
properly.  I have to wonder if your problem is just that you hang around too
many lousy Perl hackers.  :-)

-- 
Ben Scott <[EMAIL PROTECTED]>
| The opinions expressed in this message are those of the author and do not |
| necessarily represent the views or policy of any other person, entity or  |
| organization.  All information is provided without warranty of any kind.  |

___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-20 Thread Hewitt Tech

You had "C"? All we had was assembler! You had assembler? All we had was
ones and zeros! You had ones and zeros? ...

-Alex

- Original Message -
From: "Jerry Feldman" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Tuesday, August 20, 2002 4:53 PM
Subject: Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]


> I think you are correct. Create(2) is a system call. Linkage editors those
> days were rather primitive. I think the name limit was either 7 or 8, but
> external names in C were many times autoprefixed with __, such that creat
> became __creat.
> The C language had a limit of 8 characters for a variable name (K&R 2.1).
> (Actually a name could be longer, but only the first 8 were significant).
> I think the only other programmer on this list who might have been writing
> C back then is my granduncle, Alex Hewitt ;-)
>
> On 20 Aug 2002 at 16:43, [EMAIL PROTECTED] wrote:
> >   I believe it was Ken Thompson, and I believe the remark was intended
to be
> > humorous.  Step back and ask: Why would he spell "create" as "creat" in
the
> > first place?  If you are going to type five characters, you might as
well
> > type six.  The reason it was spelled "creat" in the first place was the
> > linked only supported five characters.  That has caused much
> > head-scratching, question-asking, and recompiling-due-to-typos; hence
the
> > remark about the spelling.
>
> --
> Jerry Feldman <[EMAIL PROTECTED]>
> Associate Director
> Boston Linux and Unix user group
> http://www.blu.org PGP key id:C5061EA9
> PGP Key fingerprint:053C 73EC 3AC1 5C44 3E14 9245 FB00 3ED5 C506 1EA9
>
> ___
> gnhlug-discuss mailing list
> [EMAIL PROTECTED]
> http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss
>

___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-20 Thread Steven W. Orr

On Tue, 20 Aug 2002, Jerry Feldman wrote:

=>I think you are correct. Create(2) is a system call. Linkage editors those 
=>days were rather primitive. I think the name limit was either 7 or 8, but 
=>external names in C were many times autoprefixed with __, such that creat 
=>became __creat.
=>The C language had a limit of 8 characters for a variable name (K&R 2.1). 
=>(Actually a name could be longer, but only the first 8 were significant). 
=>I think the only other programmer on this list who might have been writing 
=>C back then is my granduncle, Alex Hewitt ;-)
=>
=>On 20 Aug 2002 at 16:43, [EMAIL PROTECTED] wrote:
=>>   I believe it was Ken Thompson, and I believe the remark was intended to be
=>> humorous.  Step back and ask: Why would he spell "create" as "creat" in the
=>> first place?  If you are going to type five characters, you might as well
=>> type six.  The reason it was spelled "creat" in the first place was the
=>> linked only supported five characters.  That has caused much
=>> head-scratching, question-asking, and recompiling-due-to-typos; hence the
=>> remark about the spelling.

I have to jump in with an old arcana of my own. I used to work at Data
General during Soul of a New Machine days. Their AOS operating system
actually had roots originating from earliest Unix. The deal there was that
all external variables (by convention) were coded in uppercase. Why?  
Because sometimes we needed to assign values at linktime to symbols.  
This was done on the commandline. And the Data General Command Line
Interface (CLI) was case insensitive. So if the symbol wasn't uppercase,
then the linker would be monkeying with the wrong symbol. :-)

-- 
-Time flies like the wind. Fruit flies like a banana. Stranger things have -
-happened but none stranger than this. Does your driver's license say Organ
-Donor?Black holes are where God divided by zero. Listen to me! We are all-
-individuals! What if this weren't a hypothetical question? [EMAIL PROTECTED]


___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



Re: UNIX Arcana [was Re: Perl (or Unix vs. MS, actually) ]

2002-08-20 Thread Jerry Feldman

I think you are correct. Create(2) is a system call. Linkage editors those 
days were rather primitive. I think the name limit was either 7 or 8, but 
external names in C were many times autoprefixed with __, such that creat 
became __creat.
The C language had a limit of 8 characters for a variable name (K&R 2.1). 
(Actually a name could be longer, but only the first 8 were significant). 
I think the only other programmer on this list who might have been writing 
C back then is my granduncle, Alex Hewitt ;-)

On 20 Aug 2002 at 16:43, [EMAIL PROTECTED] wrote:
>   I believe it was Ken Thompson, and I believe the remark was intended to be
> humorous.  Step back and ask: Why would he spell "create" as "creat" in the
> first place?  If you are going to type five characters, you might as well
> type six.  The reason it was spelled "creat" in the first place was the
> linked only supported five characters.  That has caused much
> head-scratching, question-asking, and recompiling-due-to-typos; hence the
> remark about the spelling.

-- 
Jerry Feldman <[EMAIL PROTECTED]>
Associate Director
Boston Linux and Unix user group
http://www.blu.org PGP key id:C5061EA9
PGP Key fingerprint:053C 73EC 3AC1 5C44 3E14 9245 FB00 3ED5 C506 1EA9

___
gnhlug-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss



  1   2   >