This document discusses building command line applications in Ruby. It covers using OptionParser and Mixlib::CLI for parsing arguments, Thor for building commands, testing CLI apps, interacting with the system via libraries like Mixlib::ShellOut, and logging to standard output and error. The target audience is developers looking to get started with Ruby command line programs.
Starting with the system calll "getrusage", this returns synchronous, process-level information, mainly max RSS used. This talk describes the output from getrusage, the rusage formatting utility in ProcStats, and several examples of using it to examine time and memory use.
Optional first & final outputs to give baseline and total status, differencing avoids extraneous output, and user messages allow arbitrary stat's and tracking content.
The combination makes this nice for tracking both long-lived and shorter, more intensive processing.
Starting with the system calll "getrusage", this returns synchronous, process-level information, mainly max RSS used. This talk describes the output from getrusage, the rusage formatting utility in ProcStats, and several examples of using it to examine time and memory use.
Optional first & final outputs to give baseline and total status, differencing avoids extraneous output, and user messages allow arbitrary stat's and tracking content.
The combination makes this nice for tracking both long-lived and shorter, more intensive processing.
Face it, backticks are a pain. BASH $() construct provides a simpler, more effective approach. This talk uses examples from automating git branches and command line processing with getopt(1) to show how $() works in shell scripts.
Shared Object images in Docker: What you need is what you want.Workhorse Computing
Docker images require appropriate shared object files (".so") to run. Rather than assume Ubuntu has the correct lib's, use ldd to get a list and install the ones you know you need. This can reduce the underlying images from GB to a few MB.
perl often doesn't get updated because people don't have a way to know if their current code works with the new one. The problem is that they lack unit tests. This talk describes how simple it is to generate unit tests with Perl and shell, use them to automate solving problems like missing modules, and test a complete code base.
Variable interpolation is a standard way to BASH your head. This talk looks at interpolation, eval, ${} handling and "set -vx" to debug basic variable handling.
Diving into HHVM Extensions (PHPNW Conference 2015)James Titcumb
HHVM is currently gaining popularity at quite a pace, and it's a pretty exciting time for PHP runtimes. Have you ever wondered what is going on beneath this slick and super-speedy engine? I wondered that myself, so I dived into the internals of HHVM, discovering a treasure trove of awesome stuff. In this talk, I'll show you how HHVM itself works with a guided tour of the codebase, demonstrating how it all pieces together. I'll also show you a couple of ways to write your own incredible HHVM extension. You don't need to know C++ to understand this talk - just PHP language knowledge is enough.
Les slides du Tools in Action que j'ai donné à Devoxx France 2019.
Le JDK est open source et son développement aussi. L'ensemble des nouveautés vit sur des branches Mercurial qui peuvent être téléchargées et compilées à la demande. Cela permet de jouer avec des fonctionnalités encore en chantier, de regarder comment les nouvelles syntaxes fonctionneront, bref, de jouer avec un JDK du futur, qui n'existera peut-être jamais. L'objet de ce tools in action est simple : montrer comment tout ceci fonctionne, de l'installation d'une machine Ubuntu à l'exécution d'un JDK recompilé maison.
With Composer as an integral part of Laravel 4 PHP framework, PHP programmers finaly have a way to break the complex projects into smaller independent units (Laravel Packages) that can later easily be used in any other project. This brings code reusibilty to a completely new level. Lecture describes the proccess of creating a simple Laravel package with Facade and Artisan CLI support. Detailed walkthorugh is available as a github project as well: https://github.com/orangehill/Laravel-Workbench-Walkthrough
The $path to knowledge: What little it take to unit-test Perl.Workhorse Computing
Metadata-driven lazyness, Perl, and Jenkins provide a nice mix for automated testing. With Perl the only thing required to start testing is a files path, from there the possibilities are endless. Using Symbol's qualify_to_ref makes it easy to validate @EXPORT & @EXPORT_OK, knowing the path makes it easy to use "perl -wc" to get diagnostics.
The beautiful thing is all of it can be lazy... er, "automated". And repeatable. And simple.
Building a Perl5 smoketest environment in Docker using CPAN::Reporter::Smoker. Includes an overview of "smoke testing", shell commands to contstruct a hybrid environment with underlying O/S image and data volumes for /opt, /var/lib/CPAN. This allows maintaining the Perly smoke environemnt without having to rebuild it.
We have all seen repetitive code, maintained by cut+paste, that creates an object, calls a method, checks a return, calls a method, checks a return... all of it difficult to maintain because of its sheer size.
Object::Exercise replaces the pasted loops with data-driven code, the operation controlled by a data structure of methods, arguments, and expected return values. This replaces cut+paste with declarative data.
This talk describes O::E and shows a few ways to apply it for testing the MadMongers' Adventure game.
A few general pointers for Perl programmers starting out to write tests using Perl6. This describes a few of the differences in handling arrays vs. hashes, comparing objects, flattening, and value vs. immutable object contents.
Face it, backticks are a pain. BASH $() construct provides a simpler, more effective approach. This talk uses examples from automating git branches and command line processing with getopt(1) to show how $() works in shell scripts.
Shared Object images in Docker: What you need is what you want.Workhorse Computing
Docker images require appropriate shared object files (".so") to run. Rather than assume Ubuntu has the correct lib's, use ldd to get a list and install the ones you know you need. This can reduce the underlying images from GB to a few MB.
perl often doesn't get updated because people don't have a way to know if their current code works with the new one. The problem is that they lack unit tests. This talk describes how simple it is to generate unit tests with Perl and shell, use them to automate solving problems like missing modules, and test a complete code base.
Variable interpolation is a standard way to BASH your head. This talk looks at interpolation, eval, ${} handling and "set -vx" to debug basic variable handling.
Diving into HHVM Extensions (PHPNW Conference 2015)James Titcumb
HHVM is currently gaining popularity at quite a pace, and it's a pretty exciting time for PHP runtimes. Have you ever wondered what is going on beneath this slick and super-speedy engine? I wondered that myself, so I dived into the internals of HHVM, discovering a treasure trove of awesome stuff. In this talk, I'll show you how HHVM itself works with a guided tour of the codebase, demonstrating how it all pieces together. I'll also show you a couple of ways to write your own incredible HHVM extension. You don't need to know C++ to understand this talk - just PHP language knowledge is enough.
Les slides du Tools in Action que j'ai donné à Devoxx France 2019.
Le JDK est open source et son développement aussi. L'ensemble des nouveautés vit sur des branches Mercurial qui peuvent être téléchargées et compilées à la demande. Cela permet de jouer avec des fonctionnalités encore en chantier, de regarder comment les nouvelles syntaxes fonctionneront, bref, de jouer avec un JDK du futur, qui n'existera peut-être jamais. L'objet de ce tools in action est simple : montrer comment tout ceci fonctionne, de l'installation d'une machine Ubuntu à l'exécution d'un JDK recompilé maison.
With Composer as an integral part of Laravel 4 PHP framework, PHP programmers finaly have a way to break the complex projects into smaller independent units (Laravel Packages) that can later easily be used in any other project. This brings code reusibilty to a completely new level. Lecture describes the proccess of creating a simple Laravel package with Facade and Artisan CLI support. Detailed walkthorugh is available as a github project as well: https://github.com/orangehill/Laravel-Workbench-Walkthrough
The $path to knowledge: What little it take to unit-test Perl.Workhorse Computing
Metadata-driven lazyness, Perl, and Jenkins provide a nice mix for automated testing. With Perl the only thing required to start testing is a files path, from there the possibilities are endless. Using Symbol's qualify_to_ref makes it easy to validate @EXPORT & @EXPORT_OK, knowing the path makes it easy to use "perl -wc" to get diagnostics.
The beautiful thing is all of it can be lazy... er, "automated". And repeatable. And simple.
Building a Perl5 smoketest environment in Docker using CPAN::Reporter::Smoker. Includes an overview of "smoke testing", shell commands to contstruct a hybrid environment with underlying O/S image and data volumes for /opt, /var/lib/CPAN. This allows maintaining the Perly smoke environemnt without having to rebuild it.
We have all seen repetitive code, maintained by cut+paste, that creates an object, calls a method, checks a return, calls a method, checks a return... all of it difficult to maintain because of its sheer size.
Object::Exercise replaces the pasted loops with data-driven code, the operation controlled by a data structure of methods, arguments, and expected return values. This replaces cut+paste with declarative data.
This talk describes O::E and shows a few ways to apply it for testing the MadMongers' Adventure game.
A few general pointers for Perl programmers starting out to write tests using Perl6. This describes a few of the differences in handling arrays vs. hashes, comparing objects, flattening, and value vs. immutable object contents.
Slides with notes from Ruby Conf 2014 on using simple techniques to create sl...Justin Gordon
Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails. Looks better at http://www.slideshare.net/justingordon/rails-conf-2014concernsdecoratorspresentersserviceobjectshelpershelpmedecideapril222014
blog: http://www.railsonmaui.com
Code samples: https://github.com/justin808/fat-code-refactoring-techniques
This is the 3rd of 8 presentations given at University of Texas during my Beginner to Builder Rails 3 Class. For more info and the whole series including video presentations at my blog:
http://schneems.tumblr.com/tagged/Rails-3-beginner-to-builder-2011
Developing cross platform desktop application with RubyAnis Ahmad
A brief introduction and example of developing desktop application with Ruby programming language. JRuby and shoesrb is discussed as platform.
Prepared for and Presented on Ruby Conference Bangladesh 2003.
Introduction to Ruby and Introduction to Ruby on Rails basic concepts for beginners. The google presentation is even better in full screen https://docs.google.com/presentation/d/1EE0VuB_PkD2-8j5JNs6CUQHb4J9ToIgC7-IxYTojiS0/pub?start=false&loop=false&delayms=3000#slide=id.p
Figuring out why your program is broke can be hard. If you've added print statements and turned up the logging and still can't find the problem, you might reach for the command-line debugger that comes with perl.
In this presentation, I'll show off an alternative. Devel::hdb is a graphical debugger for Perl that runs inside a web browser with a simpler interface. I'll also briefly cover how to write your own debugging tools with Devel::Chitin, and preview a new feature I've been working on.
Practical tips for dealing with projects involving legacy code. Covers investigating past projects, static analysis of existing code, and methods for changing legacy code.
Presented at PHP Benelux '10
These are the slides for the seminar to have a basic overview on the GO Language, By Alessandro Sanino.
They were used on a Lesson in University of Turin (Computer Science Department) 11-06-2018
Material ini digunakan untuk kelas teknologi pengenalan pemrograman dengan bahasa pengantar Python http://oo.or.id/py
Dipublikasikan dengan lisensi Atribusi-Berbagi Serupa Creative Commons (CC BY-SA) oleh oon@oo.or.id
How To Structure Go Applications - Paul Bellamy - Codemotion Milan 2016Codemotion
For developers used to working with frameworks like Spring, and Rails, Go's lack of advice on how to structure your application can be bewildering. Many new developers, reach for their favourite Spring, or Rails equivalent, and rely on its structure, but that is a mistake! Go gives us wonderful tools to put Domain-driven design into practice, and create beautiful applications.
This lecture discusses a group of techniques to use commands output/Input to feed into other commands or into files. It also covers argument expansion and quoting
Check the other Lectures and courses in
http://Linux4EnbeddedSystems.com
or Follow our Facebook Group at
- Facebook: @LinuxforEmbeddedSystems
Lecturer Profile:
- https://www.linkedin.com/in/ahmedelarabawy
PyCon AU 2012 - Debugging Live Python Web ApplicationsGraham Dumpleton
Monitoring tools record the result of what happened to your web application when a problem arises, but for some classes of problems, monitoring systems are only a starting point. Sometimes it is necessary to take more intrusive steps to plan for the unexpected by embedding mechanisms that will allow you to interact with a live deployed web application and extract even more detailed information.
This is a presentation about Z-Ray technology made by Zend Technologies. It allows capturing tracing and debug information during PHP script execution.
DevOps and Testing slides at DASA ConnectKari Kakkonen
My and Rik Marselis slides at 30.5.2024 DASA Connect conference. We discuss about what is testing, then what is agile testing and finally what is Testing in DevOps. Finally we had lovely workshop with the participants trying to find out different ways to think about quality and testing in different parts of the DevOps infinity loop.
Neuro-symbolic is not enough, we need neuro-*semantic*Frank van Harmelen
Neuro-symbolic (NeSy) AI is on the rise. However, simply machine learning on just any symbolic structure is not sufficient to really harvest the gains of NeSy. These will only be gained when the symbolic structures have an actual semantics. I give an operational definition of semantics as “predictable inference”.
All of this illustrated with link prediction over knowledge graphs, but the argument is general.
Essentials of Automations: Optimizing FME Workflows with ParametersSafe Software
Are you looking to streamline your workflows and boost your projects’ efficiency? Do you find yourself searching for ways to add flexibility and control over your FME workflows? If so, you’re in the right place.
Join us for an insightful dive into the world of FME parameters, a critical element in optimizing workflow efficiency. This webinar marks the beginning of our three-part “Essentials of Automation” series. This first webinar is designed to equip you with the knowledge and skills to utilize parameters effectively: enhancing the flexibility, maintainability, and user control of your FME projects.
Here’s what you’ll gain:
- Essentials of FME Parameters: Understand the pivotal role of parameters, including Reader/Writer, Transformer, User, and FME Flow categories. Discover how they are the key to unlocking automation and optimization within your workflows.
- Practical Applications in FME Form: Delve into key user parameter types including choice, connections, and file URLs. Allow users to control how a workflow runs, making your workflows more reusable. Learn to import values and deliver the best user experience for your workflows while enhancing accuracy.
- Optimization Strategies in FME Flow: Explore the creation and strategic deployment of parameters in FME Flow, including the use of deployment and geometry parameters, to maximize workflow efficiency.
- Pro Tips for Success: Gain insights on parameterizing connections and leveraging new features like Conditional Visibility for clarity and simplicity.
We’ll wrap up with a glimpse into future webinars, followed by a Q&A session to address your specific questions surrounding this topic.
Don’t miss this opportunity to elevate your FME expertise and drive your projects to new heights of efficiency.
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Ramesh Iyer
In today's fast-changing business world, Companies that adapt and embrace new ideas often need help to keep up with the competition. However, fostering a culture of innovation takes much work. It takes vision, leadership and willingness to take risks in the right proportion. Sachin Dev Duggal, co-founder of Builder.ai, has perfected the art of this balance, creating a company culture where creativity and growth are nurtured at each stage.
Transcript: Selling digital books in 2024: Insights from industry leaders - T...BookNet Canada
The publishing industry has been selling digital audiobooks and ebooks for over a decade and has found its groove. What’s changed? What has stayed the same? Where do we go from here? Join a group of leading sales peers from across the industry for a conversation about the lessons learned since the popularization of digital books, best practices, digital book supply chain management, and more.
Link to video recording: https://bnctechforum.ca/sessions/selling-digital-books-in-2024-insights-from-industry-leaders/
Presented by BookNet Canada on May 28, 2024, with support from the Department of Canadian Heritage.
"Impact of front-end architecture on development cost", Viktor TurskyiFwdays
I have heard many times that architecture is not important for the front-end. Also, many times I have seen how developers implement features on the front-end just following the standard rules for a framework and think that this is enough to successfully launch the project, and then the project fails. How to prevent this and what approach to choose? I have launched dozens of complex projects and during the talk we will analyze which approaches have worked for me and which have not.
Key Trends Shaping the Future of Infrastructure.pdfCheryl Hung
Keynote at DIGIT West Expo, Glasgow on 29 May 2024.
Cheryl Hung, ochery.com
Sr Director, Infrastructure Ecosystem, Arm.
The key trends across hardware, cloud and open-source; exploring how these areas are likely to mature and develop over the short and long-term, and then considering how organisations can position themselves to adapt and thrive.
Connector Corner: Automate dynamic content and events by pushing a buttonDianaGray10
Here is something new! In our next Connector Corner webinar, we will demonstrate how you can use a single workflow to:
Create a campaign using Mailchimp with merge tags/fields
Send an interactive Slack channel message (using buttons)
Have the message received by managers and peers along with a test email for review
But there’s more:
In a second workflow supporting the same use case, you’ll see:
Your campaign sent to target colleagues for approval
If the “Approve” button is clicked, a Jira/Zendesk ticket is created for the marketing design team
But—if the “Reject” button is pushed, colleagues will be alerted via Slack message
Join us to learn more about this new, human-in-the-loop capability, brought to you by Integration Service connectors.
And...
Speakers:
Akshay Agnihotri, Product Manager
Charlie Greenberg, Host
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf91mobiles
91mobiles recently conducted a Smart TV Buyer Insights Survey in which we asked over 3,000 respondents about the TV they own, aspects they look at on a new TV, and their TV buying preferences.
Let's dive deeper into the world of ODC! Ricardo Alves (OutSystems) will join us to tell all about the new Data Fabric. After that, Sezen de Bruijn (OutSystems) will get into the details on how to best design a sturdy architecture within ODC.
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Introducing Command Line Applications with Ruby
1. Ruby on Rails In Practice
Apartment List and Thoughtbot
San Francisco, September 2012
Getting started with
Command Line Applications
2. Ruby on Rails In Practice
Apartment List and Thoughtbot
San Francisco, September 2012
Getting started with
Command Line Applications
Nikhil Mungel
@hyfather
35. class Test < Thor
desc " FILE", "an example task"
method_option :delete,
:aliases => "-d",
:desc => "Delete the file"
def example(file)
end
end
36. class Test < Thor
desc " FILE", "an example task"
method_option :delete,
:aliases => "-d",
:desc => "Delete the file"
def example(file)
end
end
~ > myapp help test:example
Usage:
thor test:example FILE
Options:
-d, [--delete=DELETE] # Delete the file after parsing it
an example task
37. class Test < Thor
desc " FILE", "an example task"
method_option :delete,
:aliases => "-d",
:desc => "Delete the file"
def example(file)
end
end
~ > myapp help test:example
Usage:
thor test:example FILE
Options:
-d, [--delete=DELETE] # Delete the file after parsing it
an example task
38. class Test < Thor
desc " FILE", "an example task"
method_option :delete,
:aliases => "-d",
:desc => "Delete the file"
def example(file)
end
end
~ > myapp help test:example
Usage:
thor test:example FILE
Options:
-d, [--delete=DELETE] # Delete the file after parsing it
an example task
39. class Test < Thor
desc " FILE", "an example task"
method_option :delete,
:aliases => "-d",
:desc => "Delete the file"
def example(file)
end
end
~ > myapp help test:example
Usage:
thor test:example FILE
Options:
-d, [--delete=DELETE] # Delete the file after parsing it
an example task
40. class Test < Thor
desc " FILE", "an example task"
method_option :delete,
:aliases => "-d",
:desc => "Delete the file"
def example(file)
end
end
~ > myapp help test:example
Usage:
thor test:example FILE
Options:
-d, [--delete=DELETE] # Delete the file after parsing it
an example task
41. class Test < Thor
desc " FILE", "an example task"
method_option :delete,
:aliases => "-d",
:desc => "Delete the file"
def example(file)
end
end
~ > myapp help test:example
Usage:
thor test:example FILE
Options:
-d, [--delete=DELETE] # Delete the file after parsing it
an example task
42. class Test < Thor
desc " FILE", "an example task"
method_option :delete,
:aliases => "-d",
:desc => "Delete the file"
def example(file)
end
end
~ > myapp help test:example
Usage:
thor test:example FILE
Options:
-d, [--delete=DELETE] # Delete the file after parsing it
an example task
63. Thanks!
I am currently a Grad Student at
San Jose State
Formerly at ThoughtWorks Studios
slidesha.re/rubycli
Nikhil Mungel
www.hyfather.com @hyfather
Editor's Notes
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
Input - command line -> Option Parsing\n\nOutput - status code, stdout, stderr\n
Input - command line -> Option Parsing\n\nOutput - status code, stdout, stderr\n
Input - command line -> Option Parsing\n\nOutput - status code, stdout, stderr\n
Input - command line -> Option Parsing\n\nOutput - status code, stdout, stderr\n
Input - command line -> Option Parsing\n\nOutput - status code, stdout, stderr\n
Input - command line -> Option Parsing\n\nOutput - status code, stdout, stderr\n
Input - command line -> Option Parsing\n\nOutput - status code, stdout, stderr\n
Input - command line -> Option Parsing\n\nOutput - status code, stdout, stderr\n
Input - command line -> Option Parsing\n\nOutput - status code, stdout, stderr\n
Input - command line -> Option Parsing\n\nOutput - status code, stdout, stderr\n
Input - command line -> Option Parsing\n\nOutput - status code, stdout, stderr\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
Enforces OO\nAutomatic rake style tasks\n
Enforces OO\nAutomatic rake style tasks\n
Enforces OO\nAutomatic rake style tasks\n
Convention -- \nfirst arg to the description becomes the input \nsecond arg is the banner\n
Convention -- \nfirst arg to the description becomes the input \nsecond arg is the banner\n
Convention -- \nfirst arg to the description becomes the input \nsecond arg is the banner\n
Option Parsing\nInbuilt support for help and banners\nSupports standard invocations of help on the shell\n
Option Parsing\nInbuilt support for help and banners\nSupports standard invocations of help on the shell\n
\n
\n
\n
\n
Input - mostly handled by the third party library.\nTesting that would be testing the gem. Not a good idea.\n\n
Input - mostly handled by the third party library.\nTesting that would be testing the gem. Not a good idea.\n\n
Standard Ruby classes. Libraries like test/unit, rspec.\nMocking and proxy layers for 3rd party services etc.\nLike any other app.\n\n
\n
Mocking\n&#xA0; mocha works out well.&#xA0;\n&#xA0; For filesystem, MockFS lets you mock the entire file system.&#xA0;\n\nTesting CLI apps that manipulate filesystem. Mocking is good. But if we mock every call to FileUtils, test becomes very tightly coupled. So even if behaviour doesn't change but the command changes the test breaks.\n&#xA0;- one use FakeFS\n\n
Mocking\n&#xA0; mocha works out well.&#xA0;\n&#xA0; For filesystem, MockFS lets you mock the entire file system.&#xA0;\n\nTesting CLI apps that manipulate filesystem. Mocking is good. But if we mock every call to FileUtils, test becomes very tightly coupled. So even if behaviour doesn't change but the command changes the test breaks.\n&#xA0;- one use FakeFS\n\n
Isolate environment of its own.\nIf its is cheap and scriptable to spin up the environment. Then we can have behaviour testing&#xA0;\n&#xA0; - powerful machines.\n&#xA0; - strong virtualizations (inbuilt)\nvagrant, lxc, openvz\n
Isolate environment of its own.\nIf its is cheap and scriptable to spin up the environment. Then we can have behaviour testing&#xA0;\n&#xA0; - powerful machines.\n&#xA0; - strong virtualizations (inbuilt)\nvagrant, lxc, openvz\n
Isolate environment of its own.\nIf its is cheap and scriptable to spin up the environment. Then we can have behaviour testing&#xA0;\n&#xA0; - powerful machines.\n&#xA0; - strong virtualizations (inbuilt)\nvagrant, lxc, openvz\n
Isolate environment of its own.\nIf its is cheap and scriptable to spin up the environment. Then we can have behaviour testing&#xA0;\n&#xA0; - powerful machines.\n&#xA0; - strong virtualizations (inbuilt)\nvagrant, lxc, openvz\n
Isolate environment of its own.\nIf its is cheap and scriptable to spin up the environment. Then we can have behaviour testing&#xA0;\n&#xA0; - powerful machines.\n&#xA0; - strong virtualizations (inbuilt)\nvagrant, lxc, openvz\n
2 distinct sections -- your and subprocesses\n\nbackticks and system ruby calls not versatile. Doesn&#x2019;t give you full control over the Input/Output/Error stream\nMixLib::Shellout and POpen3 are better alternatives.\nRespect exit status 0 -for success, rest all failures while writing your CLI.\nYour CLI should write error to stderr and not stdout. ruby provides $stdout, $stdin, $stderr\n\n
backticks and system ruby calls not versatile. Doesn&#x2019;t give you full control over the Input/Output/Error stream\nMixLib::Shellout and POpen3 are better alternatives.\n\nRespect exit status 0 -for success, rest all failures while writing your CLI.\nYour CLI should write error to stderr and not stdout. ruby provides $stdout, $stdin, $stderr\n
backticks and system ruby calls not versatile. Doesn&#x2019;t give you full control over the Input/Output/Error stream\nMixLib::Shellout and POpen3 are better alternatives.\n\nRespect exit status 0 -for success, rest all failures while writing your CLI.\nYour CLI should write error to stderr and not stdout. ruby provides $stdout, $stdin, $stderr\n
Compatible with windows.\nUses the select(2) system call. \nGives abstractions over umask, cwd etc.\n
Compatible with windows.\nUses the select(2) system call. \nGives abstractions over umask, cwd etc.\n
\n
STDOUT could be the default. But should be configurable to a file. \n\nLog at correct level. Apply to all apps but worth mentioning.\n\nyou may want to support -v and -vv for falling back to :info or :debug and -q falls back fatal.\n