Introducing Log::ger

Yesterday more or less completed the migration of my CPAN modules from using Log::Any to Log::ger. Sorry for the noise in the releases news channels due to the high number of my CPAN modules (particularly to Chase Whitener).

I did not have anything against Log::Any, to be honest. It was lightweight and so easy to use in modules as it encourages separation of log producers and consumers. Sure, I wish Log::Any had some features that I want but I was okay with using it for all my logging needs.

Until Log::Any 1.00 came along in late 2014, when its startup overhead jumped from ~2ms (version 0.15) to ~15ms. The new version ballooned from just loading strict, warnings, and Log::Any::Adapter::Null to over a dozen modules. Later versions of Log::Any improve somewhat on the startup overhead front but after the introduction of Log::Any::Proxy I thought it probably will not get back to the previous lightweight level. So I planned to write a more lightweight alternative along with probably implementing my wishlist. But this would require some time and in the mean time I wrote a hackish workaround called Log::Any::IfLOG that will load Log::Any only if environment variable like LOG or DEBUG or TRACE is set to true. I hated that workaround and regretted having created it.

By the way, why do I fuss over a few milliseconds? My major interest in using Perl is for building CLI applications. I am simply annoyed if my CLIs show a noticeable (~50-100ms or more) delay before responding with output (major offenders include Moose-based CLIs like dzil) when the fact is that Perl can be much more responsive than that. Log::Any is but one of several (sometimes many) modules I must load in a CLI so if a few ms is added here and a few more there, it could quickly add up. Also my CLIs feature shell tab completion and this is implemented by running the CLIs themselves for getting the completion answers so I always prefer responsive CLIs.

The recent Eid al-Fitr holiday finally made it possible for me to write a replacement for Log::Any: Log::ger in the course of a couple of weeks, along with all the log outputs and plugins to match all the features that I needed. So in what ways is Log::ger different than Log::Any or the other logger libraries?

First of all, for the low startup overhead goal, I've managed to keep use Log::ger having an overhead of just 0.5-1ms (without loading any extra modules). This is even less than use warnings and certainly less than use Log::Any (8-10ms) or the much heavier use Log::Log4perl ':easy' (35ms). This means, adding logging with Log::ger to your modules now incurs a negligible startup overhead. You can add logging to most of your modules without worrying about startup overhead.

What about null-logging (stealth-logging) overhead? Log::ger also manages to be the fastest here. It's about 1.5x faster than Log::Any, 3x faster than Log4perl, and 5x faster than Log::Fast (included here because the name claims something about speed). This is thanks to using procedural style logging (log_warn("foo")) instead of OO ($log->warn("foo")) and just using an empty subroutine sub {0} as the null default. If you don't want that tiny runtime overhead too, you can eliminate it with Log::ger::Plugin::OptAway. This plugin uses some B magic to turn your logging statements into a constant so they are removed during run-time.

As a bonus, due to the modular and flexible design of Log::ger, you can also: log using OO-style, use Log::Any style (method names and formatting rule), use Log::Log4perl style (method names and formatting rule), use Log::Contextual style (block style), or mimic other interface that you want. And mix different styles in different modules of your application. And as another bonus, writing a Log::ger output is also simpler and significantly shorter than writing a Log::Any adapter. Compare Log::Any::Adapter::Callback with Log::ger::Output::Callback, or Log::Any::Adapter::Syslog with Log::ger::Output::Syslog.

To keep this post short, instead of explaining how Log::ger works or the details of its features here I welcome you to look at the documentation.

csv-grep (and App::CSVUtils)

Today I decided to add csv-grep to App::CSVUtils, as an alternative to NEILB's csvgrep (which Neil announced about a week ago). I find csvgrep too simplistic for my taste or future needs. It's basically equivalent to:

% ( head -n1 FILE.CSV; grep PATTERN FILE.CSV ) | csv2asciitable

I also think csvgrep's -d option does not belong. It's not relevant to grepping as well as too case-specific. What if user wants the oldest file in the directory? The biggest? The find or ls command should be able to do that for you:

% csvgrep PATTERN "`ls *.csv –sort=t | head -n1`"

In csv-grep, you specify Perl code instead of regex pattern. Your Perl code receives the CSV row in $_ as an arrayref (or hashref, if you specify -H). So you can filter based on some particular fields and use the full expressive Power of Perl. csv-grep outputs CSV, but you can convert it to other formats by the abovementioned csv2asciitable, or to JSON with csv2json, or to Perl data structure with csv2dd, or what have you.

Aside from csv-grep, App::CSVUtils also includes a bunch of other CSV utilities which I wrote when I needed to munge CSV files a few months back. Check it out.

List of new CPAN distributions – Jun 2017.html

dist author version abstract
Acme-Globus JACOBY 0.001 Interface to the Globus research data sharing service
Acme-OCEORA-Utils OCEORA 0.01 The great new Acme::OCEORA::Utils!
Algorithm-History-Levels PERLANCAR 0.001 Group histories into levels
Alien-HIDAPI ATHREEF 0.01 Perl distribution for HIDAPI
Alien-PCRE2 WBRASWELL 0.001000 Find Or Download/Build/Install libpcre2 In PCRE2
Alien-autoconf PLICEASE 0.01 Build or find autoconf
Alien-automake PLICEASE 0.01 Build or find automake
Alien-libtool PLICEASE 0.01 Build or find libtool
Alien-libuv CAPOEIRAB 0.001 Interface to the libuv library
AnyEvent-Impl-Prima CORION 0.01 Prima event loop adapter for AnyEvent
App-BlockWebFlooders PERLANCAR 0.001 Block IP addresses of web flooders using iptables
App-BorgRestore BLUEWIND 2.0.0 Restore paths from borg backups
App-ListNewCPANDists PERLANCAR 0.001 List new CPAN distributions in a given time period
App-Manoc GMAMBRO 2.99.2 Network monitoring application
App-TrimHistories PERLANCAR 0.001 Keep only a certain number of sets of file histories, delete the rest
App-html2wp PERLANCAR 0.001 Publish HTML document to WordPress as blog post
App-tailswitch PERLANCAR 0.001 Tail a file, but switch when another file with newer name appears
Array-2D AARONRP 0.001_001 Methods for simple array-of-arrays data structures
Array-Sample-Partition PERLANCAR 0.001 Sample elements from an array by equal partitions
Array-Sample-SysRand PERLANCAR 0.001 Systematic random sampling from an array
Async-Stream KSYSOEV 0.02 it's convinient way to work with async data flow.
Authen-Passphrase-Scrypt MGV 0.001 passphrases using Tarsnap's scrypt algorithm
Authen-TuringImage HASH 1.005 Simple image based Turing test (CAPTCHA)
Batch-Interpreter STRCMP 0.01 interpreter for CMD.EXE batch files
Bencher-Scenario-Glob PERLANCAR 0.001 Benchmark glob()
Bencher-Scenario-HashUnique PERLANCAR 0.001 Benchmark Hash::Unique
Bencher-Scenarios-LogGer PERLANCAR 0.001 Scenarios for benchmarking Log::ger
Bencher-Scenarios-SPVM PERLANCAR 0.001 Benchmark SPVM
Business-HashCash HASH 1.003 Accept HashCash payments online
CHI-Driver-Reddit DFARRELL 0.01 use Reddit as a cache!
CPAN-Reporter-Smoker-OpenBSD ARFREITAS 0.007 set of scripts to manage a CPAN::Reporter::Smoker on OpenBSD
Catmandu-WoS NICS 0.01 Catmandu modules to work with the Web Of Science web services
Code-TidyAll-Plugin-YAPF OALDERS 0.000001 Code::TidyAll plugin to tidy Python code via yapf
Crypt-ECDSA-Blind HASH 1.014 Blind ECDSA Signatures
Crypt-EC_DSA HASH 1.007 Elliptic Curve Digital Signature Algorithm
Crypt-EECDH HASH 1.004 Simple ephemeral ECDH + AES hybrid cryptosystem
Crypt-FDH HASH 1.008 Full Domain Hash
Crypt-HashCash HASH 1.115 HashCash Digital Cash
Crypt-RSA-Blind HASH 1.009 Blind RSA signatures
Crypt-Unsnoopable HASH 1.005 Completely unsnoopable messaging
Cuckoo-Filter KEND v0.0.1 Cuckoo Filter implementation in perl
DBIx-Class-DeploymentHandler-VersionStorage-WithSchema ALTREUS 0.001 Version storage for DeploymentHandler that includes the schema
Data-Dx DCONWAY 0.000002 Dump data structures with name and point-of-origin
Data-MessagePack-Types MOZNION 0.01 Utility of value type for Data::MessagePack
Date-Extract-PERLANCAR PERLANCAR 0.001 Extract probable dates from strings
Device-HID ATHREEF 0.001 Perl Interface to HIDAPI
Dir-Write-Rotate PERLANCAR 0.001 Write files to a directory, with rotate options
Dist-Zilla-Plugin-SlackNotify SLEUNG 0.001 Publish a notification on Slack after release
Dist-Zilla-Plugin-Test-Perl-Critic-Freenode COFFEE 0.001 Tests to check your code against policies inspired by #perl on Freenode
English-Control AARONRP 0.001_001 use names beginning with control for punctuation variables
File-DirObject RORYRJB 0.0.1 traverse directories with methods
Finance-GDAX-API SEATEK 0.01 Build and sign GDAX REST request
Geo-Compass-Variation STEVEB 0.01 Accurately calculate magnetic declination and inclination
GooCanvas2 PERLMAX 0.04 Perl binding for GooCanvas2 widget using Glib::Object::Introspection
Graphics-Fig SCOOTER 1.00 xfig library
HTML-Template-Nest TOMGRACEY 0.01 manipulate a nested html template structure via a perl hash
Hash-GuavaRing KTL 0.01 Consistent ring hashing using guava hash
Hash-Unique MATZ 0.01 It's new $module
IPC-Queue-Duplex HASH 1.004 Filesystem based request / response queue
IPC-Serial HASH 1.006 Simple message passing over serial ports
JIP-Debug VLADIMIRZ 0.999_001 provides a convenient way to attach debug print statements anywhere in a program.
Lazy-Util COFFEE 0.001 Perl utilities for lazy evaluation
List-Flat AARONRP 0.001_002 Functions to flatten a structure of array references
List-Haystack MOZNION 0.01 A immutable list utility to find element
Log-Any-Adapter-LogGer PERLANCAR 0.001 Send Log::Any logs to Log::ger
Log-Log4perl-Appender-Graylog DIMENTOX 0.01 Log dispatcher writing to udp Graylog server
Log-Report-Template MARKOV 0.10 template toolkit with translations
Log-ger PERLANCAR 0.001 A lightweight, flexible logging framework
Log-ger-DBI-Query PERLANCAR 0.001 Log DBI queries (and results)
Log-ger-For-Class PERLANCAR 0.001 Add logging to class
Log-ger-For-LWP PERLANCAR 0.001 Add logging to LWP
Log-ger-Format-Block PERLANCAR 0.001 Use formatting using block instead of sprintf-style
Log-ger-Format-Flogger PERLANCAR 0.001 Use String::Flogger for formatting instead of sprintf
Log-ger-Format-Sprintfn PERLANCAR 0.001 Use Text::sprintfn for formatting instead of sprintf
Log-ger-Layout-JSON PERLANCAR 0.001 Layout log message as a JSON object (hash)
Log-ger-Layout-LTSV PERLANCAR 0.001 Layout log message as LTSV
Log-ger-Layout-Pattern PERLANCAR 0.001 Pattern layout
Log-ger-Layout-YAML PERLANCAR 0.001 Layout log message as a YAML
Log-ger-LevelFromEnv PERLANCAR 0.001 Set default log level from some environment variables
Log-ger-Like-LogAny PERLANCAR 0.001 Log like Log::Any
Log-ger-LogAny PERLANCAR 0.001 Send log to Log::Any
Log-ger-Manual PERLANCAR 0.005 Manual for Log::ger
Log-ger-OptAway PERLANCAR 0.001 Optimize away higher-level log statements
Log-ger-Output-ArrayWithLimits PERLANCAR 0.001 Log to array, with some limits applied
Log-ger-Output-Composite PERLANCAR 0.001 Composite output
Log-ger-Output-DirWriteRotate PERLANCAR 0.001 Log to Dir::Write::Rotate
Log-ger-Output-File PERLANCAR 0.001 Send logs to file
Log-ger-Output-FileWriteRotate PERLANCAR 0.001 Log to File::Write::Rotate
Log-ger-Output-LogAny PERLANCAR 0.002 Send log to Log::Any
Log-ger-Output-LogDispatchOutput PERLANCAR 0.001 Send logs to a Log::Dispatch output
Log-ger-Output-Screen PERLANCAR 0.003 Output log to screen
Log-ger-Plugin-OptAway PERLANCAR 0.003 Optimize away higher-level log statements
Log-ger-Plugin-SingleLog PERLANCAR 0.001 Create a log($LEVEL, …) subroutine/method
Log-ger-UseDataDump PERLANCAR 0.001 Use Data::Dump to dump data structures
Log-ger-UseDataDumpColor PERLANCAR 0.001 Use Data::Dump::Color to dump data structures
Logfile-Tail-Switch PERLANCAR 0.001 Tail a file, but switch when another file with newer name appears
Mail-BIMI MBRADSHAW 1.20170624 BIMI parser
Mail-Exim-MainLogParser RGLAUE 0.01 Parse log lines from the Exim Main Log
Math-Logic-Ternary MHASCH 0.003 ternary logic and related operations
Method-Signatures-PP MSTROUT 0.000001 EXPERIMENTAL pure perl method keyword
Minion-Command-minion-version BFAIST 0.01 Minion version command
Module-CheckDep-Version STEVEB 0.01 List prereqs that need a version bump for an author's distributions
Mojolicious-Plugin-Pager JHTHORSEN 0.01 Pagination plugin for Mojolicious
Mojolicious-Plugin-PgURLHelper LDIDRY 0.01
Mojolicious-Plugin-StaticCache LDIDRY 0.01 Mojolicious::Plugin::StaticCache – Mojolicious Plugin which add a Control-Cache header to each static file served by Mojolicious.
Mojolicious-Plugin-Template-Mustache CYNOVG 0.01 Mojolicious Plugin
Mojolicious-Plugin-Text-Caml CYNOVG 0.01 Mojolicious Plugin
Monitoring-Icinga2-Client-REST THESEAL v2.0.0 REST integration with icinga2
MooX-Locale-TextDomain-OO REHSACK 0.001 provide API used in translator modules without translating
MooseX-Getopt-Kingpin JASEI 0.1.0 A Moose role for processing command lines options via Getopt::Kingpin
Moxie STEVAN 0.01 Not Another Moose Clone
Net-Async-Slack TEAM 0.001 Slack realtime messaging API support for IO::Async
Net-ZooIt SUBOGERO 0.1 High level recipes for Apache Net::ZooKeeper
PHP-Functions-Password CMANLEY 1.01 This module provides ported PHP password functions.
PPIx-Utils DBOOK 0.001 Utility functions for PPI
PPR DCONWAY 0.000003 Pattern-based Perl Recognizer
Perl6-Controls DCONWAY 0.000002 Add Perl 6 control structures as Perl 5 keywords
Plack-Middleware-Auth-JWT DOMM 0.900 Token-based Auth (aka Bearer Token) using JSON Web Tokens (JWT)
Plack-Session-Store-RedisFast AKZHAN 0.01 Redis session store.
Printer-ESCPOS-PDF DSONNTAG 0.001 a hacky drop-in replacement for redirect Printer::ESCPOS output to a PDF file instead of a printer
RPi-I2C STEVEB 2.3601 Interface to the I2C bus on the Raspberry Pi
RT-Extension-RichtextCustomField GIBUS 0.01 RT-Extension-RichtextCustomField Extension
RabbitMQ-Consumer-Batcher JASEI 0.1.0 batch consumer of RMQ messages
Rapi-Blog VANSTYN 1.0000 RapidApp-powered blog
SPVM KIMOTO 0.01 Fast calculation, GC, static typing, VM with perlish syntax
SPVM-Examples PERLANCAR 0.001 SPVM examples
Sah-Schemas-Date PERLANCAR 0.001 Sah schemas related to date
Sledge-Plugin-Private TANIGUCHI 0.01 plugin to add private HTTP response
TAP-Harness-BailOnFail GRAY 0.001 Bail on remaining tests after first failure
Telegram-CamshotBot PAVELSR 0.01 Telegram bot that send you a snapshot from IP camera using ffmpeg (don't forget to install it!)
Template-Compiled TOBYINK 0.001 templates which compile into coderefs
Template-Provider-Pandoc DAVECROSS v0.0.1
Test-Compiles TOBYINK 0.001 tests if perl can compile a string of code
Test-DB-Shared JETEVE 0.001 Share DB cluster instance accross processes for faster tests
Test-Expr DCONWAY 0.000002 Test an expression with better error messages
Test2-Plugin-SourceDiag EXODIST 0.000001 Output the lines of code that resulted in a failure.
Text-CaboCha CODEHEX 0.01 Alternate Interface To libcabocha
Text-Prefix TTKCIAR 1.00 Read from stdin and write to stdout with additional useful information prefixed to each line.
Text-Summarizer FAELIN 0 Extract Repeated Phrases from Text
Text-Summarizer-0 FAELIN 0 Extract Repeated Phrases from Text
Text-Xslate-Bridge-TypeDeclaration POKUTUNA 0.01 A Mouse-based Type Validator in Xslate.
Tie-Array-Expire PERLANCAR 0.001 Array with expiring elements
Tie-Handle-TailSwitch PERLANCAR 0.001 Tie to Logfile::Tail::Switch
Twitter-Queue DFARRELL 0.01 the micro blogging framework FIFO queue
URI-tcp JASEI 0.1.0 tcp connection string
UV-Util CAPOEIRAB 0.001 Some utility functions from libUV.
WWW-Mechanize-Chrome CORION 0.01 automate the Chrome browser
WWW-Zotero-Write RAPPAZF 0.01 Perl interface to the Zotero Write API
Web-Request-Role-JWT DOMM 1.000 Accessors for JSON Web Token (JWT) stored in psgix
WebService-BR-Vindi DLIMA 0 Perl low level implementation of the brazilian payment gateway.
WebService-CoinSpot DJZORT 0.001 Perl API for CoinSpot API
Win32-Ldd SALVA 0.01 Track dependencies for Windows EXE and DLL PE-files
csvgrep NEILB 0.01 search for patterns in a CSV and display results in a table
fastQ_brewv HALLORAN 1.0.3 Provides methods for fastQ file manipulation
lib-relative DBOOK 0.001 Add paths relative to the current file to @INC
spamcup-ng ARFREITAS 0.4 module to export functions for spamcup program
spamcupNG ARFREITAS 0.4 module to export functions for spamcup program

Upgrading to perl 5.26

This morning I decided to purge my 5.24 installation on my development PC and move to 5.26. Bad mistake. Many distributions still fail to build without PERL_USE_UNSAFE_INC=1, I might as well put the environment on my ~/.bashrc. These are the ones that hit me (after a few of these, I just built with PERL_USE_UNSAFE_INC=1): Compiler::Lexer (GOCCY), OrePAN (TOKUHIROM), Task::Weaken (ADAMK), Test::SubCalls (ADAMK), Test::Object (ADAMK), Term::Encoding (MIYAGAWA). Apparently, for many of these dists tickets/issues have been posted since 3 months ago but the authors/maintainers have simply not responded. Many authors have perhaps moved on to greener pastures, we need more adopters.

List of new CPAN distributions – May 2017

dist author version date abstract
AI-XGBoost PABLROD 0.001 2017-05-29T19:06:04 Perl wrapper for XGBoost library
Acme-DotDotGone LNATION 0.01 2017-05-21T16:33:02 The great new Acme::DotDotGone!
Acme-Helloworld TOMCHA 0.01 2017-05-27T03:16:27 output 'Hello, world'
Acme-Study-perl NEILB 1.00 2017-05-11T13:35:15 turns baubles into trinkets
Acme-Testing-Permissions BOOK 0.001 2017-05-31T07:49:51 Test target for PAUSE permissions
Acme-Want5000trillion ANATOFUZ 0.01 2017-05-31T14:46:00 I want 5000trillion yen.
Alien-LibBigWig AYATES v0.3.3 2017-05-11T10:52:42 Installation of libBigWig for Perl
Alien-XPA DJERIUS 0.01 2017-05-12T21:14:48 Find or Build libxpa
AnyEvent-Net-MPD JJATRIA 0.001 2017-05-29T11:57:29 A non-blocking interface to MPD
App-Aliyun FAYLAND 0.01 2017-05-11T10:28:03 Aliyun Command Tools
App-CISetup DROLSKY 0.01 2017-05-26T16:48:34 Command line tools to generate and update Travis and AppVeyor configs for Perl libraries
App-DumpChromeHistory PERLANCAR 0.001 2017-05-30T10:33:44 Dump Chrome history
App-DumpOperaHistory PERLANCAR 0.001 2017-05-30T10:30:55 Dump Opera history
App-EvalServerAdvanced SIMCOP 0.001 2017-05-27T02:14:18 A more featured update to App::EvalServer
App-EvalServerAdvanced-Protocol SIMCOP 0.100 2017-05-26T21:14:11 Protocol abstraction for App::EvalServerAdvanced
App-EvalServerAdvanced-REPL SIMCOP 0.001 2017-05-26T23:02:41 Example client for App::EvalServerAdvanced
App-ExtractLinks RORYRJB 0.0.1 2017-05-29T14:01:58 extract href's in HTML docs to stdout
App-Git-Autofixup TORBIAK 0.001 2017-05-25T11:13:16 create fixup commits for topic branches
App-Repo ZDENEK 0.11 2017-05-09T16:40:56 create debian repository
App-TOMLUtils PERLANCAR 0.001 2017-05-09T12:49:14 TOML utilities
App-btcindo PERLANCAR 0.001 2017-05-31T12:39:16 CLI for
App-dt PERLANCAR 0.001 2017-05-18T08:35:39 CLI data transformer
App-nodie ORKUN 1.00 2017-05-29T22:05:00 runs immortal processes
App-unicomb PERLANCAR 0.001 2017-05-04T09:28:52 Produce Unicode character with combining character
Beam-Service PREACTION 0.001 2017-05-05T05:01:51 Role for services to access Beam::Wire features
Bencher-Scenario-SortHashKeys PERLANCAR 0.001 2017-05-23T23:37:34 Benchmark Sort::HashKeys
Bencher-Scenario-TOMLParsingModules PERLANCAR 0.001 2017-05-09T12:49:25 Benchmark TOML parsing modules
Benchmark-Featureset-ParamCheck TOBYINK 0.001 2017-05-15T18:25:13 compare different parameter validation modules
Bio-DB-Big AYATES v1.0.0 2017-05-11T10:54:09 Perl interface to bigWigLib for accessing the kent big formats
BlankOnDev YUSRIDEB 0.1000 2017-05-31T00:53:26 BlankOnDev – Several Development tools for BlankOn GNU/Linux.
CPAN-Testers-Backend PREACTION 0.001 2017-05-13T10:10:11 Backend processes for CPAN Testers data and operations
CPAN-Uploader-Tiny SKAJI v0.0.1 2017-05-13T16:52:47
CPP-panda-lib SYBER v1.0.0 2017-05-11T12:59:24 Collection of useful functions and classes for C++.
Catalyst-Model-Data-MuForm JJNAPIORK 0.001 2017-05-26T00:32:10 Model adaptor for Data::MuForm
Catalyst-Plugin-BootstrapAlert CAGAO 0.20 2017-05-03T22:21:33 Replacement for Catalyst::Plugin::StatusMessage inline with Bootstrap alert names (success, info, warning, and danger).
CloudCron JLMARTIN 0.02 2017-05-18T14:50:56 A simple distributed cloud friendly cron for the masses
CloudCron-Worker JLMARTIN 0.02 2017-05-18T14:51:08 A worker process for CloudCron
CloudDeploy JLMARTIN 1.05 2017-05-18T09:34:52 A toolkit for building and managing AWS CloudFormation stacks
Data-Faker-Colour MGV 0.001 2017-05-31T15:09:54 Generate random colours
Date-Holidays-BY BESINT 0.2017.0 2017-05-30T09:39:01 Determine Belorussian official holidays and business days.
Devel-Jemallctl TVDW 0.01 2017-05-23T15:39:05 Insight into what Jemalloc is doing
Device-PaloAlto-Firewall PUGLET 0.01 2017-05-02T11:36:31 Interact with the Palo Alto firewall API
Dist-Zilla-Plugin-EnsureLatestPerl ETHER 0.001 2017-05-12T08:29:29 Ensure the author is releasing using the latest Perl
Dist-Zilla-Plugin-UseUnsafeInc ETHER 0.001 2017-05-13T12:11:54 Indicates the value of PERL_USE_UNSAFE_INC to use during installation
ElasticEmail ELASTICML 0.01 2017-05-17T11:35:18 The great new ElasticEmail!
File-PCAP MAMAWE v0.0.4 2017-05-04T08:53:16 a pure Perl library to read and write PCAP files
FileDirUtil MTW v0.01 2017-05-15T14:47:03 A Moose Role for basic File IO
Finance-BTCIndo PERLANCAR 0.001 2017-05-31T10:42:46 Trade with (VIP) using Perl
GPSD-Parse STEVEB 0.01 2017-05-17T00:30:32 Parse, extract use the JSON output from GPS units
Geo-Coder-CA NHORNE 0.01 2017-05-09T21:44:45 Get data from
Geo-Coder-XYZ NHORNE 0.01 2017-05-11T22:33:18 Provides a geocoding functionality using http:://
Geo-OSM-Imager FIREDRAKE 0.02 2017-05-04T10:56:01 simplifies plotting onto OpenStreetMap tiles
GitHub-Crud PRBRENAN 2017.512 2017-05-13T00:29:04 Create, Read, Update, Delete files on GitHub
GraphQL ETJ 0.01 2017-05-18T14:48:06 The great new GraphQL!
Hash-Normalize VPIT 0.01 2017-05-26T14:58:51 Automatically normalize Unicode hash keys.
IO-ReadPreProcess ADDW 0.8 2017-05-22T18:51:47 Macro processing built into IO::File replacement
Image-Sane RATCLIFFE 0.06 2017-05-11T19:54:47 Perl extension for the SANE (Scanner Access Now Easy) Project
Imgur-API MLHOLLEN v0.0.1 2017-05-14T03:20:06
JSON-Assert SGREEN 0.04 2017-05-26T03:12:20 Tests JPaths into an JSON Data structure for correct values/matches
LWP-CurlLog JACOBG 0.01 2017-05-29T22:14:05 Log LWP requests as curl commands
LWP-Throttle NHORNE 0.01 2017-05-26T16:43:03 Throttle requests to a site
LWP-UserAgent-Throttled NHORNE 0.02 2017-05-26T18:22:28 Throttle requests to a site
Lingua-IN-TGC RAJ 1.01 2017-05-17T13:52:05 Perl extension for tailored grapheme clusters for indian languages
Log-Any-Plugin-Format JJATRIA 0.01 2017-05-06T20:25:14 Add a formatting subroutine to your Log::Any adapter
Log-Any-Plugin-History JJATRIA 0.01 2017-05-06T20:23:41 Add a message history to a Log::Any adapter
MARC-File-XML GMCHARLT v1.0.5 2017-05-24T01:18:18 convert a MARC file to XML
MarpaX-ESLIF-ECMA404 JDDPAUSE 0.001 2017-05-13T07:20:52 JSON Data Interchange Format following ECMA-404 specification
Mojo-CallFire SADAMS 0.01 2017-05-21T02:03:10 A simple interface to the CallFire API
Mojo-CloudCheckr SADAMS 0.01 2017-05-19T04:55:03 A simple interface to the CloudCheckr API
Mojo-IOLoop-DNSNative COFFEE 0.001 2017-05-25T12:57:23 Async native DNS lookup
Mojolicious-Plugin-Mailgun MRAMBERG 0.01 2017-05-15T13:45:56 Easy Email sending with mailgun
MooX-Locale-Passthrough REHSACK 0.001 2017-05-31T14:46:12 provide API used in translator modules without translating
MooX-PDL2 DJERIUS 0.01 2017-05-31T03:19:49 A Moo based PDL 2.X object
MooseX-DataModel JLMARTIN 1.00 2017-05-09T15:31:03 Create object models from datastructures
NOLookup TROHAU 1.01 2017-05-03T13:40:32 a set of lookup modules for various Norwegian data services.
Net-Async-Github TEAM 0.001 2017-05-11T14:48:48 support for's REST API with IO::Async
Net-Async-Graphite CHOHAG 0.0_1 2017-05-26T09:32:28 Request data from graphite
Net-Async-OAuth TEAM 0.001 2017-05-11T14:53:03 Basic OAuth support for async code
Net-Async-TravisCI TEAM 0.001 2017-05-11T15:38:57 API support for and
Net-Async-Trello TEAM 0.001 2017-05-11T12:49:54 Interaction with the API
Net-DNS-Extlang JRLEVINE 0.1 2017-05-14T03:16:00 DNS extension language
Net-Etcd HEXFUSION 0.008 2017-05-29T18:38:28 Provide access to the etcd v3 API.
Net-FTP-Path-Iter DJERIUS 0.02 2017-05-09T17:11:29 Iterative, recursive, FTP file finder
Net-FTP-Rule DJERIUS 0.01 2017-05-03T21:38:28 Iterative, recursive, FTP file finder
Net-Frame-Layer-MPLS VINSWORLD 1.00 2017-05-25T02:24:10 Multiprotocol Label Switching layer object
Net-Hacky-Detect-IP DAEMON 0.01 2017-05-07T10:29:44 Hackily try different methods of attaining local system IPs
Pcore-Ext ZDM v0.1.0 2017-05-01T20:03:51 ExtJS raw js generator
Perinci-Examples-ResMeta-Table PERLANCAR 0.001 2017-05-24T02:24:25 Demonstrate the various table and table.* result metadata property/attributes
Perl2Package MLHOLLEN v0.1.0 2017-05-15T01:27:28 Wrapper scripts to generate RPM/DEB packages
Plack-App-Catmandu-Bag NICS 0.01 2017-05-12T15:24:46 Plack application that wraps a REST API around a Catmandu::Bag
Plack-Middleware-Memento NICS 0.01 2017-05-19T10:14:41 Base role and interface for Plack::Middleware::Memento handlers
Plack-Middleware-Memento-Handler-Catmandu-Bag NICS 0.01 2017-05-19T11:36:09 Connect Plack::App::Catmandu::Bag to Plack::Middleware::Memento
Plack-Middleware-Signposting VPEIL 0.01 2017-05-29T18:44:22 A Signposting implementation from JSON content
RPi-Pin STEVEB 2.3601 2017-05-27T21:39:23 Access and manipulate Raspberry Pi GPIO pins
RT-Extension-RightsInspector BPS 0.02 2017-05-11T19:26:54 RT-Extension-RightsInspector Extension
Redis-ClusterRider IPH 0.01 2017-05-19T21:42:08 Daring Redis Cluster client
Ref-Util-XS XSAWYERX 0.114 2017-05-11T16:03:20 Utility functions for checking references
Reply-Plugin-Autocomplete-ExportedSymbols AKIYM 0.01 2017-05-28T11:13:08 Tab completion for exported symbol names
Resque-Plugin-Retry MERU 0.01 2017-05-08T09:43:15 Retry the fail job
Router-XS DFARRELL 0.01 2017-05-24T14:24:53 Fast URI path to value lookup
SNS-Notification JLMARTIN 0.02 2017-05-15T12:38:14 An object for representing SNS Notifications
SQS-Worker JLMARTIN 0.05 2017-05-15T14:43:59 A light framework for processing messages from SQS queues
Swagger-Schema JLMARTIN 1.00 2017-05-09T15:31:15 Object model for Swagger schema files
Sys-Linux-Namespace SIMCOP 0.001 2017-05-04T06:04:28 Sets up linux kernel namespaces
TOML-Examples PERLANCAR 0.001 2017-05-09T12:49:37 Example TOML configuration files
Test-HTTP-LocalServer CORION 0.57 2017-05-08T16:38:00 spawn a local HTTP server for testing
Test2-Plugin-IOSync EXODIST 0.000001 2017-05-02T03:10:14 Load IOEvents and IOMuxer so that they work together.
Text-ReadConditionally ADDW 0.72 2017-05-12T17:48:22 Macro processing built into IO::File replacement
Time-Moment-Epoch HEANEY 0.001 2017-05-20T13:47:59 Convert various epoch times to Time::Moment times.
URI-amqp JASEI 0.1.0 2017-05-23T08:04:18 AMQP (RabbitMQ) URI
VMOMI STUMPR 0.01 2017-05-02T23:21:41 VMware vSphere API Perl Bindings
VMware-vCloudDirector NIGELM 0.004 2017-05-04T14:26:03 Interface to VMWare vCloud Directory REST API
Verilog-VCD-Writer JVS 0.001 2017-05-23T22:35:53 VCD waveform File creation module.
WWW-Leech-Parser JAREDSPB 0.01 2017-05-07T10:46:35 HTML Page parser used by WWW::Leech::Walker
WWW-Leech-Walker JAREDSPB 0.01 2017-05-08T12:22:08 small web content grabbing framework
WWW-Mechanize-Plugin-Selector CORION 0.16 2017-05-12T13:04:28 CSS selector method for WWW::Mechanize
WebService-Naver-TTS AANOAA v0.0.1 2017-05-05T03:22:40 Perl interface to Naver TTS API
XS-Tutorial DFARRELL 0.01 2017-05-03T02:16:43 documentation with examples for learning Perl XS
Yandex-Dictionary BRNFLK 0.001 2017-05-15T14:53:55 a simple API for Yandex.Dictionary
Yandex-Translate BRNFLK 0.01 2017-05-02T17:05:45 Perl extension for using Yandex API
Zimbra-Expect OETIKER v0.1.0 2017-05-16T07:23:56 Execute multiple commands with a single instance of zmprov or zmmailbox and thus run magnitudes faster
chi-driver-elasticache-memcache ZEBARDY 0.01 2017-05-11T20:17:56 This is a CHI Driver for AWS's Elasticache memcache implementation
fastQ_brew HALLORAN 1.0.2 2017-05-09T20:18:31 Provides methods for fastQ file manipulation
fastQ_brew_ver HALLORAN 1.0.2 2017-05-12T17:36:44 Provides methods for fastQ file manipulation
geoip DANNYT 0 2017-05-11T14:44:44
graphcompare SCASTILLO v0.6.1 2017-05-25T12:49:23 A command-line tool to compare graph files in DOT or tabular format.
net-async-graphite CHOHAG 0.0 2017-05-25T19:26:47 Request data from graphite.

You can also browse new distributions on MetaCPAN. See also What’s new on CPAN – May 2017 (a curated list by David Farrell).

pericmd 048: Showing table data in browser as sortable/searchable HTML table

The latest release of Perinci::CmdLine (1.68) supports viewing program’s output in an external program. And also a new output format is introduced: html+datatables. This will show your program’s output in a browser and table data is shown as HTML table using jQuery and DataTables plugin to allow you to filter rows or sort columns. Here’s a video demonstration:

Your browser does not support the video tag, or WordPress filters the VIDEO element.

If the video doesn’t show, here’s the direct file link.

Call for collaboration: mini-article series on object systems and Dist::Zilla plugins

Aside from the mini-article series on option parsing modules that I have recently completed, there are two more series I currently have in mind: one on object systems (Moose, Mouse, Moo, Mo, Object::Tiny, Class::Accessor, and so on) and another on Dist::Zilla plugins. However, as I don't feel familiar with many of the modules or plugins, I think it would be nice if more people could write the articles.

The format of the series is 24-25 (mini-)articles, each comprised of minimum 250-300 words, 3-5 paragraphs. This is equivalent to the amount of text of a typical essay one is expected to write in a TOEFL test in 20-30 minutes time. So it should relatively easy to write even for non-native English speakers. I personally find that writing a blog post in 30-60 minutes time is ideal: it can be done in one sitting and does not take too much time to interrupt your daily work. It can even be done during a break. There is no maximum length limit.

Each article should discuss or review a single module. Ideally the author of the article is not the author or (co-)maintainer of the reviewed module. The article should first describe the module (its brief history, popularity, position in the CPAN river) then proceed to discussion on the user interface and design of the module and finally close with the author's overall view on the module (whether the module is well designed, whether the module is useful to her, whether the module is worth using compared to other modules).

If you are interested in collaborating, please contact me at perlancar gmail. I expect the series on object systems to be posted on Feb 1st, 2017 and the series on dzil plugins on Apr 1st.