Performance comparison

>
> With Most scripting languages which have
> safety protection force the programmer not to
even
> think about the underlying code. With this, this
is
> the proof of why scripting language programmers
are
> not as good as per sey..
>

For me, programming languages are like tools. A
good tradesman uses the
right tools for the job. The right tool is the one
that makes works best
to achieve the desired outcome. A bad tradesman only
is best described as
the one who uses a hammer to put in a screw, 'cause
they only know how to
use hammers, not screw drivers.

Ofcourse, real programmers use microcode, ASM and
FORTH.

This is where I don't understand most people. You can
use any language(scripting or non-scripting) to make
what others consider overkill. Making usage of
available libraries is a good start. Most quit at the
mark of not knowing how to use a library. This is 201%
  untrue. You can use C for anything you use ruby on.
I will use C as an example here. you can make a
gigantic application faster in C than ruby iff you
have proper libraries. One design I like about Ruby is
that it takes less time to write code and complete an
application. Well guess what, you can do the same with
C if you had a nice set of libraries. I am sure most
people talk bad about C are not professional at all.
Think of C not as a hammer, but as an Anything Object.
It can be used for anything(unless you need to pass
assembly to unlock processor code). Restricted
languages which you could not add to would be
considered a hammer, or a screw driver. I think this
explaination pretty much ruins the idea of C being a
hammer, which sounds rediculous in the first place.

···

----------------------------------------
-- Name: David Ross
-- Phone: 865.539.3798
-- Email: drossruby [at] yahoo [dot] com
----------------------------------------

__________________________________
Do you Yahoo!?
New and Improved Yahoo! Mail - 100MB free storage!
http://promotions.yahoo.com/new_mail

Alexey Verkhovsky wrote:

Test/Unit Reporter publishes results of test/unit test suite execution
in HTML and other formats.

You can download Test/Unit Reporter from
http://rubyforge.org/projects/test-report/

Hopefully some people will find it useful.

Most definitely!

Thanks,

···

--
Bil Kleb, Hampton, Virginia

Very nice! I'm just starting to play with Test::Unit, and this'll be
a nice addition to my toolkit.
I've never set up a test suite before, but I managed to figure it out,
and it looks great.

btw... seems you left out a require on the mini-doc page:
require 'test/unit/ui/console/testrunner'

···

On Mon, 30 Aug 2004 03:25:47 +0900, Alexey Verkhovsky <alex@verk.info> wrote:

Test/Unit Reporter publishes results of test/unit test suite execution
in HTML and other formats.

Current implementation includes two formatters:
                                                                                                                             * HTML formatter produces an HTML report. Sample report for Rake unit tests can be seen here: http://test-report.rubyforge.org/rake-report/index.html

* XML formatter formats test suite results in an XML file, using the
same format as Ant junit task. This output then can be passed to Ant
junitreport task to produce an HTML report, or otherwise
analyzed/processed with an XML parser.

You can download Test/Unit Reporter from
http://rubyforge.org/projects/test-report/

Hopefully some people will find it useful.

--
Bill Guindon (aka aGorilla)

Test/Unit Reporter publishes results of test/unit test suite execution
in HTML and other formats.

[...]

You can download Test/Unit Reporter from
http://rubyforge.org/projects/test-report/

Hopefully some people will find it useful.

Since this is my first open-source Ruby project, packaging in this
release is spartan ("non-existent" may be more accurate). I am willing
to put some effort into it, but it's a lot of gadgets to learn. Any help
or advice from someone with expertise in these matters would be highly
appreciated.

One of the premises of the Ruby Production Archive (RPA) is that the
developers need not package for RPA, RPA packages for them[1] :wink:
I have therefore just uploaded it to the preliminary Ruby Production
Archive repos., for use with rpa-base (http://rpa-base.rubyforge.org),
so that it can be installed now with
  rpa install test-report

I will try to keep it up-to-date as you release new versions.

FYI, packaging it for with rpa-base essentially involved writing the
following 'rpafied install.rb' file:

require 'rpa/install'

class Install_test_report < RPA::Install::FullInstaller
    name "test-report"
    version "0.1.0-1"
    classification Library
    build do
        installrdoc %w[README] + Dir["lib/**/*.rb"]
        installexamples "test"
        skip_default Installtests
    end
    description <<EOF
Report the results of a unit test run in HTML and other formats.

The current implementation of test-report includes two formatters:
* an XML formatter which outputs test suite results into an XML file, using
  the same format as a Ant junit task. This output can then be passed to an
  Ant junitreport task to produce an HTML report.
* an HTML formatter which produces an HTML report.
EOF
end

You are not expected to maintain it or anything, so please don't
complain about the lack of docs yet :wink:

[1] at this point a 'soviet Russia'-style joke is tempting; it's been so long
since I quit /. that I don't know if it's in anymore.

···

On Mon, Aug 30, 2004 at 03:25:47AM +0900, Alexey Verkhovsky wrote:

--
Running Debian GNU/Linux Sid (unstable)
batsman dot geo at yahoo dot com

--- Jamis Buck <jgb3@email.byu.edu> wrote:

To clarify, then: David, you are talking about the C
'gets()' function,
correct? I agree that it should be avoided at all
costs. However, Ruby's
"gets()" function does not map directly to a C
"gets()" invocation -- it
does a lot more work, including bounds checking.
Thus, saying "gets()
is unsafe in every language" is rather misleading. I
won't say it is
"safe" in Ruby, since I'm not an expert in this
area, but it is
certainly not as hazardous to use as in vanilla C
code.

(Someone please flame me gently if I've mispoken
anything grossly
regarging Ruby's internals...)

- Jamis

hrm.. well I don't know for sure.. I was told on
freenode #ruby-lang it was insecure when I asked about
it. Though I never actually read through the code to
see.

reading code...

appendline(..) is restricted to 8192 bytes. :slight_smile: Okay,
so it does perform checking. A specification on ruby
would really help :slight_smile: Its really hard reading thousands
of lines of code and trying to understand all of ruby.

Matz: *cough* *cough* you should write what is in your
head and on paper for everybody :slight_smile:

..... <snip>
int cnt = bp - buf;

if (cnt > 0) {
..... </snip>

···

----------------------------------------
-- Name: David Ross
-- Phone: 8965.539.3798
-- Email: drossruby [at] yahoo [dot] com
----------------------------------------

__________________________________
Do you Yahoo!?
New and Improved Yahoo! Mail - 100MB free storage!
http://promotions.yahoo.com/new_mail

I'd say, in any language with exceptions support, handling an exception
where you don't know what to do with it (instead of propagating it up
the stack) is a much more common "shoddy programming technique" than
what you describe.

Variants of this anti-pattern are "Print stack trace and forget", "Wrap
and re-throw" or even "Throw another exception and forget (losing the
stack trace to the original error)".

In most cases main loop or somewhere quite close to that is precisely
the right place to handle exceptions, provided that "ensure" clause (or
Java "finally") is used judiciously to close things like database
connections and other expensive resources.

Alex

···

On Sun, 2004-08-29 at 17:21, Lothar Scholz wrote:

I see a huge problem with this in many Java apps where the normal
reaction is to say: "okay lets throw an exception" but the programmer
never tries to handle it somewhere else then in the main loop with a
catch all clause.

Hello Daniel,

> Hmmm... this sort of reminds me of a post I saw once of someone stating
> that if you didn't write your win32 programs in assembly you were going
> for the easy option and weren't _really_ a good programmer as you
> weren't thinking performance.

> I'm very far from considering myself as the prime example of a great
> programmer:) , however I'm sure that ruby has taught me a lot,
> especially in OO and general design of code. If using C or C++ I simply
> go for the "shortest route" possible to get results. In ruby it's not
> so. It's so flexible and encouraging that you actually _want_ to think
> of various possibilities to solve a problem and find the best fit (short
> term and long term).

No this was not exactly my the point.

  (...)

Ruby is special here because it still is a freak language. Freak in
this context may be substituted with "nerd", "scientist" or "old wise
man". My statement may become more understandable when you look at
the popular scripting languages out there

- PHP
- Java Script
- Perl
- Visual Basic (for Applications)
- TCL
- Python
- Ruby

in this order. And only compare the professionals doing there work
in (at least one of) these languages. At least from my experience in
the last 10 years i see a correlation between the main languages and
there programming skills.

Ok, I get your point and agree with it. I guess what was important for
me was just to point out that part of being good a programmer is picking
the right tool (language) for the task. I have enormous respect for the
"mature" hackers out and have realised it will take me many years of
experience to get anywhere close, including generous helpings of static
languages. However comparisons between static and dynamic languages
sometimes seem unnatural to me. I don't put on my hiking boots to go
dancing. :slight_smile:

  -Daniel

···

On Sun, 2004-08-29 at 15:21, Lothar Scholz wrote:

With Most scripting languages which have
safety protection force the programmer not to

even

think about the underlying code. With this, this

is

the proof of why scripting language programmers

are

not as good as per sey..

For me, programming languages are like tools. A
good tradesman uses the
right tools for the job. The right tool is the one
that makes works best
to achieve the desired outcome. A bad tradesman only
is best described as
the one who uses a hammer to put in a screw, 'cause
they only know how to
use hammers, not screw drivers.

Ofcourse, real programmers use microcode, ASM and
FORTH.

This is where I don't understand most people. You can
use any language(scripting or non-scripting) to make
what others consider overkill. Making usage of
available libraries is a good start. Most quit at the
mark of not knowing how to use a library. This is 201%
  untrue. You can use C for anything you use ruby on.
I will use C as an example here. you can make a
gigantic application faster in C than ruby iff you
have proper libraries. One design I like about Ruby is
that it takes less time to write code and complete an
application. Well guess what, you can do the same with
C if you had a nice set of libraries. I am sure most
people talk bad about C are not professional at all.
Think of C not as a hammer, but as an Anything Object.
It can be used for anything(unless you need to pass
assembly to unlock processor code). Restricted
languages which you could not add to would be
considered a hammer, or a screw driver. I think this
explaination pretty much ruins the idea of C being a
hammer, which sounds rediculous in the first place.

As someone who has done plenty of woodworking and carpentry, I submit that all programming languages are like saws. One might be a handsaw, one a tablesaw, one a handheld circular saw... and so on. Some saws (like a jigsaw) can really only be used properly for specific purposes, but other saws (a handsaw, for instance) can be used for pretty much anything.

But still, you would never see someone cutting out parts for a row of cabinets with their handsaw. And if you see someone cutting out a picture frame with a jigsaw, you *know* they don't know what they're doing. It's important to choose the most appropriate tool for the job.

So you might compare the choice between C and Ruby to the choice between a handsaw and a tablesaw. C does a nice job and you can use it for almost anything, but in many cases it isn't appropriate. If you are creating a short program that copies files or filters text, perhaps Ruby (or one of those *other* languages) is a more appropriate tool for your job. If you are doing intense data processing, and speed is an issue, you might turn to C.

I suspect that eventually, someone will come up with a language that separates algorithms from procedures, in a way that allows better optimizations for number-crunching parts of the code. But this "Universal Saw" is a ways off, I'm sure. It would need to allow the programmer to dynamically (and transparently) trade ease of coding for extra runtime speed.

cheers,
Mark

···

On Aug 29, 2004, at 11:21 AM, David Ross wrote:

----------------------------------------
-- Name: David Ross
-- Phone: 865.539.3798
-- Email: drossruby [at] yahoo [dot] com
----------------------------------------

__________________________________
Do you Yahoo!?
New and Improved Yahoo! Mail - 100MB free storage!
http://promotions.yahoo.com/new_mail

You can use C for anything you use ruby on.

Of course you are right. Ruby is written in C .. QED.

I am sure most
people talk bad about C are not professional at all.

Ever worked as a maintenance programmer? Ever fixed bugs that other
engineers had introduced into the code? Ever found that some of those
bugs where simple stuff, like array bounds violations or null pointer
assignments? Then, have you tried going up to the original coder and
telling them that they are not professional?

There are better ways of coding in C. Try, for example

  http://www-cs-faculty.stanford.edu/~knuth/cweb.html

There are better ways of improving in any language

  http://www.sei.cmu.edu/tsp/psp.html

Both of these approaches have been used by People Who Know A Lot (Knuth
and Humphries) and both have been shown to work (I've used both and know
they work).

Why do more people not use them? Why is our code still riddled with
basic errors?

(Hint: it has nothing to do with the language, though the language will
have an impact. C is less, errrr, helpful, to the less experienced).

···

David Ross <drossruby@yahoo.com> wrote:

--
-mark. (probertm @ acm dot org)

Mauricio, good day!

There was a new release of Test::Unit::Reporter. It is available from
http://rubyforge.org/projects/test-report/

Best regards,
Alex

David Ross wrote:

--- Jamis Buck <jgb3@email.byu.edu> wrote:

To clarify, then: David, you are talking about the C
'gets()' function, correct? I agree that it should be avoided at all
costs. However, Ruby's "gets()" function does not map directly to a C
"gets()" invocation -- it does a lot more work, including bounds checking. Thus, saying "gets() is unsafe in every language" is rather misleading. I
won't say it is "safe" in Ruby, since I'm not an expert in this
area, but it is certainly not as hazardous to use as in vanilla C
code.

(Someone please flame me gently if I've mispoken
anything grossly regarging Ruby's internals...)

- Jamis

hrm.. well I don't know for sure.. I was told on
freenode #ruby-lang it was insecure when I asked about
it. Though I never actually read through the code to
see.

Well, there are lots of ways for something to be insecure. The data from gets is put into a string, which anyone with access to the executing interpreter could intercept and read/modify... I'm certainly no expert on security, but I wouldn't think Ruby should ever be suceptible to buffer overflows, at least. I mean, isn't that one of the nice things about interpreted languages? They kind of protect you from that kind of "low-level" memory management.

- Jamis

···

reading code...

appendline(..) is restricted to 8192 bytes. :slight_smile: Okay,
so it does perform checking. A specification on ruby
would really help :slight_smile: Its really hard reading thousands
of lines of code and trying to understand all of ruby.

Matz: *cough* *cough* you should write what is in your
head and on paper for everybody :slight_smile:

..... <snip>
int cnt = bp - buf;

if (cnt > 0) {
..... </snip>

----------------------------------------
-- Name: David Ross
-- Phone: 8965.539.3798
-- Email: drossruby [at] yahoo [dot] com
----------------------------------------

__________________________________
Do you Yahoo!?
New and Improved Yahoo! Mail - 100MB free storage!
http://promotions.yahoo.com/new_mail

.

--
Jamis Buck
jgb3@email.byu.edu
http://www.jamisbuck.org/jamis

"I use octal until I get to 8, and then I switch to decimal."

I don't put on my

hiking boots to go
dancing. :slight_smile:

I do. :wink:

···

------------------------------------
-- Name: David Ross
-- Phone: 865.539.3798
-- Email: drossruby [at] yahoo [com]
------------------------------------

_______________________________
Do you Yahoo!?
Win 1 of 4,000 free domain names from Yahoo! Enter now.
http://promotions.yahoo.com/goldrush

Hello Alexey,

In most cases main loop or somewhere quite close to that is precisely
the right place to handle exceptions, provided that "ensure" clause (or
Java "finally") is used judiciously to close things like database
connections and other expensive resources.

One of the problems are that far to many Java exceptions are not
exceptions but simple program control flow operations for things that
happen not very often.

As an Eiffel programmer i have of course another opinion to this.

···

--
Best regards, emailto: scholz at scriptolutions dot com
Lothar Scholz http://www.ruby-ide.com
CTO Scriptolutions Ruby, PHP, Python IDE 's

I agree on all points. It is humans who make errors.
To the experienced C is bliss. (* and assembly) (*even
if there is some stress figuring out what is wrong in
the program). After swearing some and hitting the
computer a few times it is okay. Oh and making fun of
the original code and all the bad hacks they did to
make the code work. (=

--David Ross

···

--- Mark Probert <probertm@nospam-acm.org> wrote:

David Ross <drossruby@yahoo.com> wrote:

>
> You can use C for anything you use ruby on.
>
Of course you are right. Ruby is written in C ..
QED.

>
> I am sure most
> people talk bad about C are not professional at
all.
>

Ever worked as a maintenance programmer? Ever fixed
bugs that other
engineers had introduced into the code? Ever found
that some of those
bugs where simple stuff, like array bounds
violations or null pointer
assignments? Then, have you tried going up to the
original coder and
telling them that they are not professional?

There are better ways of coding in C. Try, for
example

http://www-cs-faculty.stanford.edu/~knuth/cweb.html

There are better ways of improving in any language

  Introduction to the Personal Software Process

Both of these approaches have been used by People
Who Know A Lot (Knuth
and Humphries) and both have been shown to work
(I've used both and know
they work).

Why do more people not use them? Why is our code
still riddled with
basic errors?

(Hint: it has nothing to do with the language,
though the language will
have an impact. C is less, errrr, helpful, to the
less experienced).

--
-mark. (probertm @ acm dot org)

__________________________________
Do you Yahoo!?
New and Improved Yahoo! Mail - Send 10MB messages!
http://promotions.yahoo.com/new_mail

Hello Mark,

There are better ways of coding in C. Try, for example

  http://www-cs-faculty.stanford.edu/~knuth/cweb.html

Sorry but the hole idea of literature programming is one of the most
stupid thing i've ever seen in the world of programming.
It does not work and it shows again that Donald E. Knuth is living in a
galaxy far far away.

Adding the redundancy and ambiguity of natural languages is making
the problem worse. Real programs change a lot and under time pressure.
Don't count extensive API specification, because this has nothing to do
with Knuth's CWeb (literate programming).

There are better ways of improving in any language

  http://www.sei.cmu.edu/tsp/psp.html

Both of these approaches have been used by People Who Know A Lot (Knuth
and Humphries)

Sorry i doubt that Knuth has real world experience. Even with a high
IQ a person can be a huge fool - by the way: what was the name of the
chess player with the IQ 180 that is arrested in Japan at the moment ?

and both have been shown to work (I've used both and know
they work).

???
Can you give me one example of a larger program that uses the CWeb
style, lets make it easy and say something with more then 100.000 lines
(a medium scale project) ?

Humphries "Personal Software Process" is nice but has nothing to do with
programming styles or languages. Its a way to get a better time management and
reliable feedback of your tasks. It's all about measuring what is
going wrong and how much you spend for fixing it.
In the later chapters of his Ph.D. he describes things like formal verficiation
etc. but this is AFAIK not part of the PSP.

Why do more people not use them? Why is our code still riddled with
basic errors?

I don't know. I'm using Eiffel.

(Hint: it has nothing to do with the language, though the language will
have an impact. C is less, errrr, helpful, to the less experienced).

Maybe you should read Humphries again. It is about getting your error
rate lower, by finding out which are your problem areas. But he does not
say that you can avoid all errors. He is not that stupid.
And he misses also one special point: Humans are Humans, not constant
working roboters, If you had a bad night, no sex for a month or are
thinking about some stock options while working, you make errors,
exactly this errors that he thinks can be avoided with his
techniques. Read the book from Neil Postman:

Technopoly: The Surrender of Culture to Technology
http://tinyurl.com/3kqe5

and you can find some reasons why his (Humphries) point of view must
be seen as helpful but not as a solution.

···

--
Best regards, emailto: scholz at scriptolutions dot com
Lothar Scholz http://www.ruby-ide.com
CTO Scriptolutions Ruby, PHP, Python IDE 's

Oops, wrong "Reply To". Sorry, list.

···

On Thu, 2004-10-07 at 23:30, Alexey Verkhovsky wrote:

Mauricio, good day!

Thank you for reporting the new release.
Funnily enough, I uploaded test-report 0.3.0-1 just before reading your
message, along with copland 0.8.0-1, copland-lib 0.1.0-1, copland-remote 0.1.0-1,
copland-webrick 0.1.0-1, hobix 0.3.0-3 (kudos to Paul van Tilburg for
fixing several issues that are yet to be solved upstream) and some
others I can't remember atm. :stuck_out_tongue:

You can install them with the recently released rpa-base 0.2.2-1
available at http://rpa-base.rubyforge.org :slight_smile:

···

On Fri, Oct 08, 2004 at 05:30:10AM +0900, Alexey Verkhovsky wrote:

Mauricio, good day!

There was a new release of Test::Unit::Reporter. It is available from
http://rubyforge.org/projects/test-report/

--
Running Debian GNU/Linux Sid (unstable)
batsman dot geo at yahoo dot com

well, not managing memory can be a good or bad idea.
Like in previous email.. I wouldn't write a OS in a
interpreted language. Sometime in the future they
might gain different concepts and not need to even
worry about memory management though :slight_smile: (*wishful
thinking)

I suppose ruby doesn't unless there is a bug in the
code. I can't be 100% sure, there might be unsafe
methods or calls. I would need to learn more about how
the GC acts and the language details.

···

Well, there are lots of ways for something to be
insecure. The data from
gets is put into a string, which anyone with access
to the executing
interpreter could intercept and read/modify... I'm
certainly no expert
on security, but I wouldn't think Ruby should ever
be suceptible to
buffer overflows, at least. I mean, isn't that one
of the nice things
about interpreted languages? They kind of protect
you from that kind of
"low-level" memory management.

- Jamis

----------------------------------------
-- Name: David Ross
-- Phone: 8965.539.3798
-- Email: drossruby [at] yahoo [dot] com
---------------------------------------

__________________________________
Do you Yahoo!?
New and Improved Yahoo! Mail - 100MB free storage!
http://promotions.yahoo.com/new_mail

Hello Mark,

> There are better ways of coding in C. Try, for example

> http://www-cs-faculty.stanford.edu/~knuth/cweb.html

Sorry but the hole idea of literature programming is one of the most
stupid thing i've ever seen in the world of programming.
It does not work and it shows again that Donald E. Knuth is living in a
galaxy far far away.

Adding the redundancy and ambiguity of natural languages is making
the problem worse. Real programs change a lot and under time pressure.
Don't count extensive API specification, because this has nothing to do
with Knuth's CWeb (literate programming).

> There are better ways of improving in any language

> http://www.sei.cmu.edu/tsp/psp.html

> Both of these approaches have been used by People Who Know A Lot (Knuth
> and Humphries)

Sorry i doubt that Knuth has real world experience. Even with a high
IQ a person can be a huge fool - by the way: what was the name of the
chess player with the IQ 180 that is arrested in Japan at the moment ?

I think you are talking about Bobby.
BTW, his IQ 180 doesn't mean he started with IQ 180 from birth and will
continue till death. IQ varies from time to time.

Thanks
Mohammad

···

On Mon, 2004-08-30 at 15:10, Lothar Scholz wrote:

> and both have been shown to work (I've used both and know
> they work).

???
Can you give me one example of a larger program that uses the CWeb
style, lets make it easy and say something with more then 100.000 lines
(a medium scale project) ?

Humphries "Personal Software Process" is nice but has nothing to do with
programming styles or languages. Its a way to get a better time management and
reliable feedback of your tasks. It's all about measuring what is
going wrong and how much you spend for fixing it.
In the later chapters of his Ph.D. he describes things like formal verficiation
etc. but this is AFAIK not part of the PSP.

> Why do more people not use them? Why is our code still riddled with
> basic errors?

I don't know. I'm using Eiffel.

> (Hint: it has nothing to do with the language, though the language will
> have an impact. C is less, errrr, helpful, to the less experienced).

Maybe you should read Humphries again. It is about getting your error
rate lower, by finding out which are your problem areas. But he does not
say that you can avoid all errors. He is not that stupid.
And he misses also one special point: Humans are Humans, not constant
working roboters, If you had a bad night, no sex for a month or are
thinking about some stock options while working, you make errors,
exactly this errors that he thinks can be avoided with his
techniques. Read the book from Neil Postman:

Technopoly: The Surrender of Culture to Technology
http://tinyurl.com/3kqe5

and you can find some reasons why his (Humphries) point of view must
be seen as helpful but not as a solution.

Hi, Lothar.

Sorry but the hole idea of literature programming is one of the most
stupid thing i've ever seen in the world of programming.

Ok. It doesn't work for you. I assume that you have tried it then?

Adding the redundancy and ambiguity of natural languages is making
the problem worse. Real programs change a lot and under time pressure.

I am not sure that you understand LP very well. However, this really is
the time or place for that. Some people love it, others don't. Some
like C, Ada, Modula-2 and FORTH. It doesn't really matter.

Can you give me one example of a larger program that uses the CWeb
style, lets make it easy and say something with more then 100.000
lines (a medium scale project) ?

TeX

Humphries "Personal Software Process" is nice but has nothing to do
with programming styles or languages. ...
Maybe you should read Humphries again. It is about getting your error
rate lower, by finding out which are your problem areas.

True, it is language neutral. The point is that, irrespective of
language -- C, Ruby, ASM, Eiffel -- people will make errors. PSP will
help lower the error rate regardless of the medium. To me, that is step
forward.

···

Lothar Scholz <mailinglists@scriptolutions.com> wrote:

--
-mark. (probertm @ acm dot org)