Clear Specifications for Web Browser, Goals and Pictures :D

OK

So, it's not that big.

The transpiler is just 600 lines.

But it uses regular expressions a lot.

Look in "g+" for regular expression conversions.

And look at the source for emerald browser

It reads a fifo just using the languages syntax for reading files (like
bash)

One feature it lacks, is that it doesn't support classes, namespaces or
structs

However #defines and #includes work, so you can include any C or C++ code
you want.

I ran rubocop for g+ recently.

The syntax of g+, is just like g++, but you "save time", lol, when you omit
a "+"

g+ -Wall -Wextra -O3 -s foo.cpp -o foo

Interesting.

I saw a cpp file under Emerald Browser, which contains Python-looking
brace-less indented code (must be C += 2):

// Copyright 2021 Gregory Coreutils

// Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

// 1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.

// 2. Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.

// 3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.

// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#define MULTIPANE false
#define TRANSPARENT false
#include <QApplication>
#include <QSplitter>
#include <QMainWindow>
#include <QWebEngineView>
#include <QWebEngineSettings>

#include <QNetworkProxyFactory>

#include <QUrl>
#include "qtermwidget.h"
#include <QStyleFactory>
#include <QScreen>
#include <QVBoxLayout>
#include <unistd.h>
#define findC(a) get_window()->findChildren<a*>()
#define findQTermWidgets findC(QTermWidget)
#define findQWebEngineViews findC(QWebEngineView)
#define FOO QList<int>()
auto get_window()
static QSplitter* s = nullptr

if s == nullptr
s = new QSplitter(nullptr)

return s
//#include <unistd.h>

auto get_acwin(QWidget* w)
(void)w
static QMainWindow* s = nullptr
if s == nullptr
s = new QMainWindow
// return
// e
return s
// if a == nullptr
// return

void bg()
puts("BG")

a decl std::string("")
unlink("/tmp/emerald-browser-fifo")
result decl system("mkfifo /tmp/emerald-browser-fifo 2>/dev/null")

b decl std::string("/tmp/emerald-browser-fifo")
// emfifo")
//c decl a
while true
a < b
std::cout << std::quoted(a) << std::endl

old_str decl QString(a.c_str())
old_list decl old_str.split("\n")

// for auto i : get_window()->children()
// static_cast<QWidget*>(i)->resize(QGuiApplication::primaryScreen()->size().width(),
50)
//i.resize(i->ge, 0)
//std::cout << i << std::endl;

for auto i : old_list
// empty decl  i.isEmpty()

empty decl i.isEmpty()
if empty
continue;
// continue;
if i == "close"
delete get_window()
exit(0)

qDebug() << i << i.right(i.length() - 5) << "!!!"

if QMetaObject::invokeMethod(get_window(), "objectNameChanged",
Qt::QueuedConnection, Q_ARG(const QString&,  i.right(i.length()-5)))
== false
puts("Error")

void add_window(const QString& website)
viewptr decl new QWebEngineView
view decl& (*viewptr)
view.resize(QGuiApplication::primaryScreen()->size().width(), 800)
for auto i :  findQWebEngineViews
if !MULTIPANE
delete i
// i->destroy()
// a = findQWebEngineViews

views decl findQWebEngineViews
new_list decl FOO
views_size decl views.size()
for (int i = 0; i < views_size; ++i)
new_list append 0

//get_window()->setSizes(views                 )
get_window()->setSizes(new_list)
get_window()->addWidget(viewptr)
// qDebug() << website;
// qDebug() << website;
view.load(QUrl(website))
//a = a

// se
a decl view.settings()
a->setAttribute(QWebEngineSettings::DnsPrefetchEnabled, true)
//::D , true)

a->setAttribute(QWebEngineSettings::PlaybackRequiresUserGesture, false)
//a.setAttribute(QWebEngineSettings::PlaybackRequiresUserGestur, false)

a->setAttribute(QWebEngineSettings::FocusOnNavigationEnabled, true)
a->setAttribute(QWebEngineSettings::FullScreenSupportEnabled , true)
a->setAttribute(QWebEngineSettings::ScrollAnimatorEnabled , true)
f decl get_window()->font()
f setPointSize 20
view setFont f
// viewptr->setHeight(450)
viewptr->show()

//get_window()->showFullScreen()
//get_window()
//get_window()->get_full
void signal_(const QString& a)
for (int i = 0; i < 2; ++i)
qDebug() << a << '\n'

add_window(a)

main
QApplication a(argc, argv)
//QNetworkProxyFactory::setUseSystemConfiguration(false);

QApplication::setStyle("gtk2");// num_terms decl
//window_ decl new QMainWindow

layoutptr decl get_window()
layout decl& (*layoutptr)
QObject::connect(  layoutptr, &QObject::objectNameChanged,
         signal_   );
//window_ setContentsMargins 0, 0, 0, 0)
//get_window()->setObjectName(QString("foo"))
layout setOrientation(Qt::Vertical)

n decl (argc==1 ? 1 : atoi(argv[1]))

for (int i = 0; i <n; ++i)
consoleptr decl new QTermWidget
console decl& (*consoleptr)
qDebug() << " availableColorSchemes:" << console.availableColorSchemes()
console.setColorScheme("GreenOnWhite");
// console.setTerminalOpacity(0.7)
//setTerminalOpacity(0.8)

//console.setTOpacity(80)
//font decl QApplication::font()
//console setColor "black"
//font setFamily "Monospace"
//font setPointSize 8
//console setTerminalFont font
layout addWidget consoleptr

if i == 0
get_acwin(nullptr)->setCentralWidget(layoutptr)
if TRANSPARENT
get_acwin(nullptr)->setAttribute(Qt::WA_TranslucentBackground);
//
//get_window()->setCentralWidget

size decl QGuiApplication::primaryScreen()->size()
// rec decl QApplication::desktop()->screenGeometry()
height decl size.height()
width decl size.width()
//acwin decl new QVBoxLayout(get_acwin(nullptr))
// layout.setLayout(acwin)
// get_acwin(nullptr)->setSpacing(0)
// get_acwin(nullptr)->setMargin(0)
//get_acwin->addWidget(layoutptr)
//get_acwin(acwin)

get_acwin(nullptr)->resize(width, height)

//get_acwin(nullptr)->setCentralWidget(get_window())
get_acwin(nullptr)->showFullScreen()
//layout.s
styles decl QStyleFactory::keys()

styles
qDebug() << i

// bg()
bg &

return a.exec()

I looked through g+ next. It is indeed written in Ruby and processes
that C += 2 into something else.

I'm not a C++ dude, so C += 2 is lost on me, but it's cool to learn
such a thing exists.

Andy

···

On Thu, Oct 21, 2021 at 10:04 AM Gregory Cohen <gregorycohen2@gmail.com> wrote:

OK

So, it's not that big.

The transpiler is just 600 lines.

But it uses regular expressions a lot.

Look in "g+" for regular expression conversions.

And look at the source for emerald browser

It reads a fifo just using the languages syntax for reading files (like bash)

One feature it lacks, is that it doesn't support classes, namespaces or structs

However #defines and #includes work, so you can include any C or C++ code you want.

I ran rubocop for g+ recently.

The syntax of g+, is just like g++, but you "save time", lol, when you omit a "+"

g+ -Wall -Wextra -O3 -s foo.cpp -o foo

Unsubscribe: <mailto:ruby-talk-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-talk&gt;

--
Andy Maleh

LinkedIn: Andy Maleh - Lexop | LinkedIn
Blog: http://andymaleh.blogspot.com
GitHub: http://www.github.com/AndyObtiva

Interesting.

I saw a cpp file under Emerald Browser, which contains Python-looking
brace-less indented code (must be C += 2):

Yes, it is :slight_smile:

I looked through g+ next. It is indeed written in Ruby and processes
that C += 2 into something else.

Yes, it does. The generated code also gets printed to STDOUT.

I'm not a C++ dude, so C += 2 is lost on me, but it's cool to learn
such a thing exists.

Yes, it is :slight_smile:

How hard is C++?

I find it funny that you seem to have such trouble with C++

Did you never learn it?

A programmer of your caliber?

#define MULTIPANE false
#define TRANSPARENT false

Also note the #defines on the top

That is newish

You can compile the browser in different modes

"How hard is C++?"

It's not about whether it's hard. It's about whether I'd like to work
on that abstraction level, which is closer to the hardware than Java
and Ruby.

"Did you never learn it?"

Yes, I did when I was in high school, but not completely. In college,
they taught us Java as the hot new thing, so I stuck to using Java
professionally.

"A programmer of your caliber?"

Again, it is not a matter of caliber, yet a matter of choice. I
learned Assembly and C in college, but don't care for working in them.
Some people love working in Assembly, and some love C and C++. Not me.
I leave them to the pros in them to handle the lower abstraction
levels so that I could focus on the higher abstraction levels and get
business requirements implemented instead. It's just a matter of
specialty and priorities.

I do respect all of the important low-level languages though (C, C++,
Crystal) and appreciate the efforts of all the people who work in
them. In fact, I would not mind collaborating with them whereby they
tend to the lower-levels and I focus on the higher-levels resting on
top of their work. That is exactly what I did with Glimmer DSL for
LibUI, which utilizes the C libui library and the Ruby Fiddle LibUI
bindings library.

···

On Thu, Oct 21, 2021 at 5:51 PM Gregory Cohen <gregorycohen2@gmail.com> wrote:

>Interesting.
>
> I saw a cpp file under Emerald Browser, which contains Python-looking
> brace-less indented code (must be C += 2):

Yes, it is :slight_smile:

> I looked through g+ next. It is indeed written in Ruby and processes
> that C += 2 into something else.

Yes, it does. The generated code also gets printed to STDOUT.

> I'm not a C++ dude, so C += 2 is lost on me, but it's cool to learn
> such a thing exists.

Yes, it is :slight_smile:

How hard is C++?

I find it funny that you seem to have such trouble with C++

Did you never learn it?

A programmer of your caliber?

> #define MULTIPANE false
> #define TRANSPARENT false

Also note the #defines on the top

That is newish

You can compile the browser in different modes

Unsubscribe: <mailto:ruby-talk-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-talk&gt;

--
Andy Maleh

LinkedIn: Andy Maleh - Lexop | LinkedIn
Blog: http://andymaleh.blogspot.com
GitHub: http://www.github.com/AndyObtiva

In terms of software and documentation, all my software is now documented
in my gem

https://actualdemocracy.net

···

On Thu, Oct 21, 2021 at 5:12 AM hmdne <hmdne@airmail.cc> wrote:

Java it not that bad. The startup time and resource usage is due to
their JIT, which from what I know you can disable. In general the warmup
time pays off if an app is long running (ie. a server app). When you
take a look at some benchmarks like optcarrot:
GitHub - mame/optcarrot: A NES emulator written in Ruby you will note that JRuby (and
TruffleRuby for that matter, because it's using something of a new Java
VM) gets faster with time.

MJIT for MRI also gets good speedups and we are getting another YJIT
soon. This benchmark may not be a representative of a real word
performance, as it's a NES emulator.

I had to use Java libraries for numerous times and JRuby also helped me
by providing a robust Ruby wrapping to those libraries allowing me to
finish my task in no time.

On 10/21/21 03:12, Gregory Cohen wrote:
> You are underrating Qt.
>
> Qt is a very, very good library.
>
> It is used for many, many things.
>
> All of which will be as fast or faster than Java.
>
> However, GTK has a more homely feel to it.
>
> It's more elegant.
>
> It's the difference of C vs C++
>
> I want to avoid Java like the plague
>
> Anything Java can do, C++ can do just fine
>
> Only, people don't hate C++, and Java is loathed.
>
> A word of warning.
>
>
>
>
>
> On Wed, Oct 20, 2021 at 6:52 PM Andy Maleh <andy.am@gmail.com> wrote:
>
> "A web browser should only be built using C, C++ or Rust"
>
> I disagree. Libraries like SWT have a very smart architecture that
> basically makes the widget part in C++ behind the scenes, but having
a
> Java or Ruby frontend syntax, so it has all the performance of C++
> with all the productivity of JRuby.
>
> That said, the result of my adventure in building a web browser in
SWT
> was discovering that the SWT Chromium widget that ships out of the
box
> is very old. That is why I recommend JxBrowser instead, which is
> unfortunately not free. They charge money for its use. But, I am sure
> it is high quality enough from reading its API docs.
>
> SWT does also ship with Webkit on the Mac and IE/Edge on Windows. I
> mostly have experience with Webkit on the Mac. It's decent enough,
but
> obviously not as good as Chromium overall.
>
> I don't know anything about QT widgets. I only know enough to
> avoid QT.
>
> By the way, here are some Linux GUI examples built with SWT:
>
https://raw.githubusercontent.com/AndyObtiva/glimmer-dsl-swt/master/images/glimmer-hello-computed.png
>
https://raw.githubusercontent.com/AndyObtiva/glimmer-dsl-swt/master/images/glimmer-hello-group.png
>
https://raw.githubusercontent.com/AndyObtiva/glimmer-dsl-swt/master/images/glimmer-hello-checkbox-group.png
>
https://raw.githubusercontent.com/AndyObtiva/glimmer-dsl-swt/master/images/glimmer-tic-tac-toe-in-progress.png
>
> It would be much easier if you simply install Glimmer DSL for SWT
> (glimmer-dsl-swt | RubyGems.org | your community gem host) and try it for yourself
> (instructions are at the GitHub page:
> GitHub - AndyObtiva/glimmer-dsl-swt: Glimmer DSL for SWT (JRuby Desktop Development Cross-Platform Native GUI Framework) - The Quickest Way From Zero To GUI - If You Liked Shoes, You'll Love Glimmer!)
>
> That said, I would believe what you and hmdne might be indicating
> about SWT looking good in Windows and Mac, but not in all
> distributions of Linux. I only use it on Ubuntu, so that's the basic
> Gnome look and it looks native to me.
>
> I don't use KDE much anymore and confess I haven't tried SWT on KDE
> much. Since SWT relies on GTK, and GTK is the source, I would imagine
> GTK offers more flexibility in targeting more native looks on Linux.
> SWT is useful mainly if you want to build cross-platform
> native-looking desktop GUI apps. But, if you only care about Linux,
> GTK obviously offers more flexibility. That's why I added GTK on my
> next DSL TODO list for Glimmer. In fact, I recently received demand
> for a Glimmer DSL for GTK at this Glimmer issue request:
> glimmer-gtk ? · Issue #10 · AndyObtiva/glimmer · GitHub
>
> Tk attempts to look native, but sometimes falls short. They only
added
> native themes since version 8.5 of Tcl/Tk I believe
> (
Tcl/Tk 8.5
.
> <
Tcl/Tk 8.5
.>).
>
> Anyways, thanks for the info about Linux GUI.
>
> I look forward to seeing how the Emerald Browser turns out regardless
> of what technology you use for it. If I discover any other web
browser
> options in Ruby in the future, I will make sure to mention them just
> because Ruby is usually my preferred language of choice.
>
> On Wed, Oct 20, 2021 at 1:44 AM Gregory Cohen > > <gregorycohen2@gmail.com> wrote:
> >
> > One more thing
> >
> > A web browser should only be built using C, C++ or Rust
> >
> > That is what I was doing
> >
> > On Tue, Oct 19, 2021 at 3:32 PM Andy Maleh <andy.am@gmail.com> > > wrote:
> >>
> >> BTW, I've built a toy multi-engine Chromium/Webkit hybrid web
> browser
> >> before in Ruby (but it totally sucked):
> >> GitHub - AndyObtiva/connector: A minimalist open-source multi-engine web browser built in Ruby with Glimmer DSL for SWT
> >>
> >> Still, there is an option to make it use the latest Chromium
> and look
> >> much better (using SWT):
> >> JxBrowser | Java web browser for Swing, JavaFX, and SWT apps
> >>
> >> Thank me once you've utilized that option and built yourself an
> >> awesome web browser, and share it with us once completed... I'm
> >> interested!
> >>
> >> On Mon, Oct 4, 2021 at 8:51 AM Gregory Cohen > > <gregorycohen2@gmail.com> wrote:
> >> >
> >> >
> >> >
> >> > echo "open /home/" > /tmp/emerald-browser-fifo
> >> >
> >> >
> >> >
> >> > On Mon, Oct 4, 2021 at 12:40 AM Gregory Cohen > > <gregorycohen2@gmail.com> wrote:
> >> >>
> >> >> main
> >> >> [indentation]puts("Hello world")
> >> >>
> >> >> On Mon, Oct 4, 2021 at 12:36 AM Gregory Cohen > > <gregorycohen2@gmail.com> wrote:
> >> >>>
> >> >>>
> >> >>>
> >> >>> Emerald-browser
> >> >>>
> >> >>> Goals
> >> >>>
> >> >>> Not bothersome (person shouldn't be bothered by anything)
> >> >>> Full control
> >> >>> To be fully written in C += 2
> >> >>>
> >> >>>
> >> >>>
> >> >>> * Uses the same engine as Chrome, with QWebEngine
> >> >>>
> >> >>> Ubuntu and fedora have packages
> >> >>>
> >> >>>
> >> >>> emerald-browser [number of terminals, default 1]
> >> >>>
> >> >>>
> >> >>> C += 2 compiler is called "g+". It's a wrapper for g++
> >> >>>
> >> >>> Usage
> >> >>>
> >> >>> g+ foo.cpp -O3 -Wall -Wextra -o foo
> >> >>>
> >> >>>
> >> >>> Example C += 2 program
> >> >>>
> >> >>>
> >> >>> ---------------------------------------
> >> >>>
> >> >>> main
> >> >>> puts("Hello world")
> >> >>>
> >> >>> --------------------------------------
> >> >>>
> >> >>>
> >> >>>
> >> >>>
> >> >>> (No need for #includes)
> >> >>>
> >> >>>
> >> >>> g+ is written in Ruby. It could be ported to Crystal
> >> >>>
> >> >>> TODO
> >> >>>
> >> >>> 1. Make g+ work better
> >> >>>
> >> >>> It doesn't support classes, structs or namespaces currently
> >> >>>
> >> >>> You can always #include C++ or C files though
> >> >>>
> >> >>> C += 2 is, and always will be a PREPROCESSOR FOR MODERN
> C++. IT CAN DO ANYTHING C++ CAN DO AND MORE.
> >> >>>
> >> >>>
> >> >>>
> >> >>> Some things I want to implement
> >> >>>
> >> >>>
> >> >>>
> >> >>> These should be a single unary option buton, like what
> GNOME 40 or Chrome has.
> >> >>> In that, there should be many options. Maybe even things
> like Update System
> >> >>> There should be a close button for panes.
> >> >>> The source code should be tidied up, but please don't
> clutter it with too much OOP.
> >> >>> Currently, everything gets googled. There could be a cache
> of some kind.
> >> >>> Everything you would want to do on your computer, should be
> doable in this program. Currently, it makes a full-screen widget.
> >> >>>
> >> >>> If there could be a Compiz cube for tabs, that would be
> really interesting.
> >> >>>
> >> >>>
> >> >>> There was a program that converted Chrome tabs to a
> filesystem extension. Maybe something like this could be added.
> >> >>>
> >> >>>
> >> >>> Port to Mac.
> >> >>>
> >> >>> Port to Windows??? No Terminal then
> >> >>>
> >> >>> Port to FreeBSD
> >> >>>
> >> >>> Would need to work for certain in X and Wayland
> >> >>>
> >> >>> open should be improved
> >> >>>
> >> >>>
> >> >>> To open tabs, do
> >> >>>
> >> >>>
> >> >>> open [query1] [query2?]... (number of Google results per
> query to show in panes)
> >> >>>
> >> >>>
> >> >>> Example
> >> >>>
> >> >>> open 'ruby talk' 'ruby docs' 3
> >> >>>
> >> >>> That would open 3 google results for ruby talk, and 3
> google results for ruby docs
> >> >>>
> >> >>>
> >> >>>
> >> >>>
> >> >>> googler is used to search Google.
> >> >>> Googler is used to search google. Googler is automatically
> installed.
> >> >>>
> >> >>> Googler is written in python
> >> >>>
> >> >>>
> >> >>> * This browser should be as fast or faster than Chrome.
> >> >>>
> >> >>>
> >> >>> * Downloads don't currently work
> >> >>> * Fullscreen doesn't currently work
> >> >>> * Opening pages in new tabs doesn't currently work
> >> >>> * You currently can't close tabs, only open them
> >> >>> * The simplest way to close the browser currently is
> killall emerald-browser
> >> >>> * Add signal and slot to close program when window closes.
> This doesn't currently happen.
> >> >>>
> >> >>>
> >> >>>
> >> >>>
> >> >>>
> >> >>>
> >> >>> Back and forward buttons should be added, somewhere.
> >> >>>
> >> >>> Currently, you can right click, and do navigation
> >> >>>
> >> >>> A way to type in addresses manually should be added.
> >> >>>
> >> >>>
> >> >>> Currently, you can do echo [full url] >
> /tmp/emerald-browser-fifo
> >> >>>
> >> >>> Doing echo '/home/' > /tmp/emerald-browser-fifo should work
> >> >>>
> >> >>>
> >> >>>
> >> >>> * Multiple instances needs to work
> >> >>>
> >> >>>
> >> >>> * Want installation to be super simple. Download a binary
> >> >>>
> >> >>>
> >> >>> * Let's get a fully functional browser, THEN care about
> packaging
> >> >>>
> >> >>>
> >> >>>
> >> >>> If there could be a flip 3d for tabs, that would be cool
> >> >>>
> >> >>>
> >> >>> Does anyone know bcat? It's a Ruby program :slight_smile:
> >> >>>
> >> >>> It's browser cat
> >> >>>
> >> >>> One uses it like this
> >> >>>
> >> >>> sudo yum upgrade | bcat
> >> >>>
> >> >>> One sees the output in their browser
> >> >>>
> >> >>> It's not my program
> >> >>>
> >> >>>
> >> >>>
> >> >>>
> >> >>> There's an interesting cover flow widget for Qt. Maybe that
> could be useful.
> >> >>>
> >> >>>
> >> >>>
> >> >>> Some pictures
> >> >>>
> >> >>>
> >> >>> https://imgur.com/4vRpN9m.png
> >> >>> https://imgur.com/qKNkHxR.png
> >> >>> https://imgur.com/vBy9XnW.png
> >> >>> https://imgur.com/0zv6oSc.png
> >> >>> https://imgur.com/4vRpN9m.png
> >> >>> https://imgur.com/WRVB9X1.png
> >> >>>
> >> >>>
> >> >>> With Compiz
> >> >>>
> >> >>> https://imgur.com/sTzNUm9.png
> >> >>> https://imgur.com/T9BeS0o.png
> >> >>>
> >> >>>
> >> >>> Gregory Cohen
> >> >
> >> >
> >> > Unsubscribe:
> <mailto:ruby-talk-request@ruby-lang.org?subject=unsubscribe>
> >> > <http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-talk&gt;
> >>
> >>
> >>
> >> --
> >> Andy Maleh
> >>
> >> LinkedIn: Andy Maleh | LinkedIn
> >> Blog: http://andymaleh.blogspot.com
> >> GitHub: AndyObtiva (Andy Maleh) · GitHub
> >> Phone: 438-835-5602
> >>
> >> Unsubscribe:
> <mailto:ruby-talk-request@ruby-lang.org?subject=unsubscribe>
> >> <http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-talk&gt;
> >
> >
> > Unsubscribe:
> <mailto:ruby-talk-request@ruby-lang.org?subject=unsubscribe>
> > <http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-talk&gt;
>
>
>
> --
> Andy Maleh
>
> LinkedIn: Andy Maleh | LinkedIn
> Blog: http://andymaleh.blogspot.com
> GitHub: AndyObtiva (Andy Maleh) · GitHub
>
> Unsubscribe:
> <mailto:ruby-talk-request@ruby-lang.org?subject=unsubscribe>
> <http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-talk&gt;
>
>
> Unsubscribe: <mailto:ruby-talk-request@ruby-lang.org
?subject=unsubscribe>
> <http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-talk&gt;

Unsubscribe: <mailto:ruby-talk-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-talk&gt;