Today I am going to look a the [Support] section plug-in. This is one of the more fancy plug-in that I have looked as so far as it tries to add in not one section but up to four all under the 'Support' section.
The four are 'Perl Doc', 'Websites', 'Bugs / Feature Requests' and 'Source Code'
Obviously this plug-in will be very useful on large projects that may need for all four of the sections or perhaps the lazy programer who wants to cover off a number of things with only one plug-in.
The first thing I have to do is get rid of all the similar content I have been adding over the past few posts
Some time back we added support to Perl for locked or restricted hashes. (See Hash::Util and fields.pm). The basic idea is that you can set up a hash, and then "lock" it, at which point access to unregistered keys in the hash, either write OR read, will cause an exception.
The basic idea was to work around Perl's lack of a true "struct"/"object" where it would be conventional to have compile time exceptions when accessing a non-existent member, or when accessing a late bound object in many languages which should produce a run time exception. Unfortunately restricted hashes do not support compile time exceptions, so we only get run time exceptions.
Listing BitBucket repositories could be annoying task even though BitBucket exposes a Rest API for this, and the reason for it is pagination - BitBucket sends result back spited by pages, so you need to request a next page till the end. This is hard to automate and prevent me form using BitBucket API directly.
Well, I have dropped a small sparrow plugin to handle with this task. At least it works for me. It lists ( in plain text format ) all the repositories for given project and team. There a lot of option of plugin you will find at documentation but the usual workflow is:
install plugin
$ sparrow plg install bitbucket-repo-list
run plugin
Here you lists repositories for given project and team. You should supply your Bitbucket credentials to request team/project information:
Today I am going to have a quick look at the [Requires] section plug-in. As the name implies this plug-in will add in a 'Requires' section in your POD. It will snoop though your '.pm' and '.pl' files with 'Module::Extract::Use' and lists these out.
Now I do have large number of uses in my code so I gave it a quick go by first installing the plug-in and then adding
Here are three
fun—and hopefully useful—sort functions.
This first one
sortsstrings with
numeric suffixes (such as room numbers like “White 102”) first by the string
part, then numerically by the suffix. The function assumes the data has been vetted;
i.e. matches $rgx_strnum. Obviously
you may need to tweak $rgx_strnum to meet your specific
needs; you can also add calls to uc to sort the
string part case-insensitively.
our $rgx_strnum = qr/^([A-Za-z]+)\s*(\d+)$/;
sub strnum {
my ($aS, $aN) = $a =~ $rgx_strnum;
my ($bS, $bN) = $b =~ $rgx_strnum;
return $aS cmp $bS || $aN <=> $bN;
}
This function sort
strings ASCIIbetically except blank strings sort to the end—I am always
surprised how often this comes up. As above, you can add calls to uc for a case-insensitive blanks-last sort.
This is a tutorial as much as it is a request for guidance from experienced
XS/C/perlguts folks, as TIMTOWTDI, and in this case, likely, a better way.
This will show you how to pass a Perl array reference (aref) into a C function,
convert the aref into a C array, work on it, then push it back onto the stack
so the C function returns it as a Perl array.
It'll also show that although we bite off of
Inline::C,
the XS code it generates can be used in your distribution, even without the end-user needing Inline installed.
First, straight to the code. Comments inline for what's happening (or, at
least, what I think is happening... feedback welcomed):
So a quick look today at three section plug-ins all dealing with the LEGAL section of you pod. All three offer the same basic output as the [Legal] sections we saw in this post, buit each adds a little.
So to start lets have a look at [Legal::Complicated] the name is a little misleading as the plug-in is easy to use and by complicated it meas that the license holder is more complicated that a single author. This plug-in is best used when code is coming from an organization where ownership is shared between the organization and the writer of the code.
This plug-in works with comment tags your add to any of the PODs you want to have extra content on. There are three you can use '# AUTHOR:', '# OWNER:' and '#LICENSE:'. I don't really have a use for this plug-in in my project but here is an example of how to use it.
Dancer2 0.204003 is on its way to CPAN now, and provides the following changes:
The CPANTS testing service reported that some dependencies for Dancer2 were not specified in the distribution. This has been corrected, and we apologize for any issues this may have caused.
When a route exception occurred, Dancer2 would catch the error first, and would prevent any custom exception handling from trapping the exception. There were some ugly hacks for working around this, but this fix puts things right, and lets the exception hook fire first, and then will trap the error.
Several changes were made to Dancer2’s Template Toolkit integration, the most significant of which being the removal of the ANYCASE option.
Various documentation improvements.
A big thank you to those who contributed to this release and helped get it out the door.
I've been writing a lot of software lately that deals with direct hardware access (specifically analog and digital hardware for the Raspberry Pi). This means that I've had to learn some C, as well as get proficient with bit manipulation and the bitwise operators.
As part of my learning, I thought I'd write a module to do this bit manipulation for me, hence Bit::Manip was born. (There's also a Bit::Manip::PP for those who can't/don't want to use XS. It should be indexed shortly).
Here's a scenario based example of how the software can be used.
You have a 16-bit configuration register for a piece of hardware that you want
to configure and send in. Here's the bit configuration
Today I am going to look at [GenerateSection] section plug-in. This one look very interesing to me as it lets on generate a section from with-in the 'weaver.ini' file.
Now in my case I would love to have a common header and footer for my Tutorial pod without having to add the same section over and over again in each POD doc. I am hoping that this plug-in will get most if not all of what I need.
Right now I am just going to go for a simple all text version for now as I am not 100% sure how to get extra variable content into Dist::Zilla and Pod::Weaver.
A couple weeks ago we had our first meeting for the Perl Adventure Series. Despite a terrible ice storm we still had 3 new people turn out in addition to our regular cast of characters. I hope we see them (and more) back.
During the meetup we set up our Dist::Zilla config file, and a new GitHub repository for the adventure series. And we got started designing the mission data structure.
We had a great time discussing all the implications of this design. There was a heated argument about including code snippets inside the config file in order to keep the game engine generic. However, I’m going to argue to the group that we should be putting these code snippets out into individual modules (or perhaps roles) and then just name those plugins in the config file. I hate the idea of code in a config file. It makes my skin crawl.
So we all know
the COMPSCI 101 method of swapping two variables: $tmp = $x; $x =
$y; $y = $tmp;
And we all know the better way of doing it: ($x, $y) = ($y,
$x);
And yet, I
found the following in PRODUCTION CODE, that a contractor was PAID ACTUAL DOLLARS TO WRITE: ($tmp_x, $tmp_y)
= ($x, $y);
($x, $y) = ($tmp_y, $tmp_x); Weird that
they knew about parallel assignment but not that you could just apply it to two
variables directly.
Anyhow, this
wasn’t nearly as bad as the code I found in a different module (same vendor) to
swap all the 1s and 0s in a string. Now this is a somewhat less trivial
problem than simply swapping two variables, but $str
=~ tr/01/10/;
does the job nicely. Alas, in the same vein as the variable-swap, the method
that vendor went with was:
$str =~ s/0/2/g;
$str =~ s/1/3/g;
$str =~ s/2/1/g;
$str =~ s/3/0/g;
Back to do some more Sections here in the Dist-pen today.
Today I am going to look at three plug-ins the very simple [Extends] the equally simple [MooseExtends] the little different [MooseConsumes]
The first two do what you would expect. Create an 'EXTENDS' section in your POD that lists all the modules that your '.pm' file is based on.
The first one [Extends] loops though the '@isa' and plucks the information from there. Now for kicks I installed this one and added it to my 'weaver.ini' and I got
Well, all of the learning and testing I've done with C, XS, managing bits, reading and understanding hardware datatsheets etc in the last few months is really starting to pay off, with a lot of kudos going out to many Perlers for providing guidance and help with my questions, particularly with XS and C.
We now have reliable, working Perl code to output and receive input analog signals on the Raspberry Pi. This example uses an MCP41010 digital potentiometer for the analog out, and an ADC1015 analog to digital converter for analog in. I still have two different ADCs to write code for, two more models of digital pots, and later this week I should be receiving my DACs (digital to analog converter), my GPS receiver chip, and my MCP3004/8 ADCs.
Here is my latest post about Sparrowdo configuration management tool written in Perl6 -
Sparrow plugins vs ansible modules - an attempt of informal comparison of sparrow and ansible eco systems.