Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine

The Monastery Gates

( #131=superdoc: print w/ replies, xml ) Need Help??

Donations gladly accepted

If you're new here please read PerlMonks FAQ
and Create a new user.

New Questions
Template toolkit XSS
1 direct reply — Read more / Contribute
by Anonymous Monk
on Aug 04, 2015 at 14:42

    I was reading Avoid XSS in Template Toolkit

    and then it occured to me! Should you escape every place a template variable is used? I mean I have a site where you make a choice using a Jquery slider which is send to the server through AJAX POST, and then Template::Toolkit displays the value entered.

    In essence there is no form POST where the user can enter data freely.But,can the user still manipulate the posted data and should I use escaping for the posted slider data? Shoudl I escape ALL data passed to Template toolkit or in certain cases ?

Jenkins and Perl
2 direct replies — Read more / Contribute
by blue_cowdawg
on Aug 03, 2015 at 15:14

    I just discovered Jenkins and I'm having a blast with it having discovered all sorts of things I can do with it.

    Looking at the plethora of plugins available I discovered a couple of plugins having to do with Perl that don't seem to be documented. These are:

    • Perl Plugin
    • Perl Smoke Test Plugin
    Sadly there doesn't seem to be any documentation for them. Is there and I'm just not finding it?

    Peter L. Berghold -- Unix Professional
    Peter -at- Berghold -dot- Net; Blog: Warning: No political correctness allowed.
Tie::File, is unite file handle must?
2 direct replies — Read more / Contribute
by stm
on Aug 03, 2015 at 08:59


    This question is related to Tie::File module. Have opened a file and processing array functions. Then processing do while loop, here the script has to exit if conditions are met.

    Is it OK to use exit to exit the script without untie the file handle ? or any better solution available? last statement is not working here. It says an error "Can't "last" outside a loop block at". Copied few lines of my code to keep simple.

    tie my @in_array, 'Tie::File', $fileA, mode => O_RDWR or die $!; my $f_cnt = scalar(@in_array); my $retries; do { ##have removed lines for simplicity ## $retries++; if ($retries > 3) { print "3 attempts are failed.\n"; exit(); } } while ($f_cnt > 1 ); untie @in_array;
Forcing DBIx::Class::AuditLog to install to the System perl's path
3 direct replies — Read more / Contribute
by davis
on Aug 03, 2015 at 05:10

    Been a while...

    I'm trying to install DBIx::Class::AuditLog. I want it to be available system-wide, so I'm using CPAN or cpanm as root on my CentOS 7 box to install it. Other modules installed system-wide, as expected, but D:C:AL (and it alone) seems to go to root's home directory, and I'm not sure why: Here's what I tried:

    cpan[7]> install DBIx::Class::AuditLog Running install for module 'DBIx::Class::AuditLog' Running make for I/IO/IONCACHE/DBIx-Class-AuditLog-0.6.2.tar.gz Fetching with LWP: +.6.2.tar.gz Fetching with LWP: Checksum for /root/.cpan/sources/authors/id/I/IO/IONCACHE/DBIx-Class-A +uditLog-0.6.2.tar.gz ok Scanning cache /root/.cpan/build for sizes DONE Building I/IO/IONCACHE/DBIx-Class-AuditLog-0.6.2.tar.gz Created MYMETA.yml and MYMETA.json Creating new 'Build' script for 'DBIx-Class-AuditLog' version '0.6.2' Building DBIx-Class-AuditLog IONCACHE/DBIx-Class-AuditLog-0.6.2.tar.gz ./Build -- OK Running Build test t/001_deploy.t ....................... ok t/002_cud.t .......................... ok t/003_get_changes.t .................. ok t/004_force_auditlog.t ............... ok t/005_modify_audit_value.t ........... ok t/006_resultsets-default_rs_class.t .. ok t/007_resultset-loadcomponent.t ...... ok t/008_relationships.t ................ ok t/009_recursive-update.t ............. ok t/010_bug_undef_columns_logged.t ..... ok t/011_update_on_deleted_row.t ........ ok t/012_cud_view.t ..................... ok t/release-pod-syntax.t ............... skipped: these tests are for re +lease candidate testing All tests successful. Files=13, Tests=76, 12 wallclock secs ( 0.09 usr 0.02 sys + 9.94 cus +r 0.73 csys = 10.78 CPU) Result: PASS IONCACHE/DBIx-Class-AuditLog-0.6.2.tar.gz ./Build test -- OK Running Build install Building DBIx-Class-AuditLog Installing /root/perl5/lib/perl5/DBIx/Class/ Installing /root/perl5/lib/perl5/DBIx/Class/Schema/ Installing /root/perl5/lib/perl5/DBIx/Class/Schema/AuditLog/Structure. +pm Installing /root/perl5/lib/perl5/DBIx/Class/Schema/AuditLog/Structure/ Installing /root/perl5/lib/perl5/DBIx/Class/Schema/AuditLog/Structure/ Installing /root/perl5/lib/perl5/DBIx/Class/Schema/AuditLog/Structure/ Installing /root/perl5/lib/perl5/DBIx/Class/Schema/AuditLog/Structure/ Installing /root/perl5/lib/perl5/DBIx/Class/Schema/AuditLog/Structure/ Installing /root/perl5/lib/perl5/DBIx/Class/Schema/AuditLog/Structure/ Installing /root/perl5/lib/perl5/DBIx/Class/Schema/AuditLog/Structure/ Installing /root/perl5/lib/perl5/DBIx/Class/Schema/AuditLog/Structure/ Installing /root/perl5/lib/perl5/DBIx/Class/ResultSet/ Installing /root/perl5/man/man3/DBIx::Class::Schema::AuditLog::Structu +re::View.3pm Installing /root/perl5/man/man3/DBIx::Class::Schema::AuditLog::Structu +re::User.3pm Installing /root/perl5/man/man3/DBIx::Class::Schema::AuditLog::Structu +re::Action.3pm Installing /root/perl5/man/man3/DBIx::Class::ResultSet::AuditLog.3pm Installing /root/perl5/man/man3/DBIx::Class::Schema::AuditLog::Structu +re::Change.3pm Installing /root/perl5/man/man3/DBIx::Class::Schema::AuditLog::Structu +re::Base.3pm Installing /root/perl5/man/man3/DBIx::Class::Schema::AuditLog::Structu +re.3pm Installing /root/perl5/man/man3/DBIx::Class::Schema::AuditLog.3pm Installing /root/perl5/man/man3/DBIx::Class::Schema::AuditLog::Structu +re::AuditedTable.3pm Installing /root/perl5/man/man3/DBIx::Class::Schema::AuditLog::Structu +re::Field.3pm Installing /root/perl5/man/man3/DBIx::Class::Schema::AuditLog::Structu +re::Changeset.3pm Installing /root/perl5/man/man3/DBIx::Class::AuditLog.3pm IONCACHE/DBIx-Class-AuditLog-0.6.2.tar.gz ./Build install -- OK

    Can I simply move the files out of ~/perl5 into /usr/local/share/perl5/ (where other modules have happily installed)? I've completely blown away .cpan and tried again, and tried cpanm, so this problem seems specific to the module. Any ideas?


Win32::GUI won't display an NI menu properly
3 direct replies — Read more / Contribute
by wardmw
on Aug 03, 2015 at 04:59
    Greetings honoured friars,

    I have a program that creates an icon in the system tray of Windows 7 and displays a tool-top when the mouse is hovered over it.

    The issue comes when the user right-clicks the icon, it should display a menu but instead I get a thin sliver of a window, like a menu but with no text (the word "File" in this case). Something is there as if I click where "File" should be I get a sub-menu, no problem, I just cannot see the word "File".

    I have worked through the articles elsewhere on Perlmonks but to no avail, even the "" code has this same problem, at least on my machine anyway.

    The following code shows this exact problem, feel free to change the icon path to any .ICO file you have spare, or leave it blank and right-click in the blank space that will appear in your system tray.

    # A simple Perl program to show the fly-out menu problem. # Uses and requires use strict; use Win32::GUI(); my $win_main; # Pointer to the main window. my $menu_popup; # Pointer to the menu that should appear. my $icn; # Ptr to an icon. my $debug = 1; # Debug flag # Windows event handlers go here. sub Main_Terminate { $win_main->NI->Remove(); -1; } sub NI_RightClick() { print "NI_RightClick event called.\n" if ($debug); $win_main->TrackPopupMenu($menu_popup, Win32::GUI::GetCursorPo +s()); } # Main program start # First, build everything # Create the context menu to be displayed when the icon is right-click +ed # Translate the menu $menu_popup = Win32::GUI::Menu->new( "&File" => "File", ">E&xit" => { -name => "File_Exit", -onClick => sub{-1} + }, ); # Create the main window - this will not be displayed. $win_main = Win32::GUI::Window->new( -name => 'Main', -menu => $menu_popup, -width => 1, -height => 1, -text => '', ); # Create an icon that will appear in the system tray. Pick any icon yo +u want. $icn = new Win32::GUI::Icon("c:/Windows/System32/PerfCenterCpl.ico"); # Add the icon to the window. $win_main->AddNotifyIcon( -name => 'NI', -icon => $icn, -tip => 'Thi is a notify fly-out/tool-tip thing.', -balloon => 0, ); # Enter the Windows message loop Win32::GUI::Dialog();
    I would appreciate your thoughts on this, or even a simple test to see if this code works on your system (in which case it is environmental, but I still have no clue as to what it might be!)


Difference between leftward and rightward list operators
3 direct replies — Read more / Contribute
by Firsov
on Aug 01, 2015 at 02:25


    I was reading perlop manual. And i don't understand one thing: What difference between rightward and leftward list operators?

    I guess that leftward list operator this is function that accept LIST (has higher precedence that comma operator). But what is a right ward list operator and why it has low precedence?

Perl Debugger rcfile on Windows
1 direct reply — Read more / Contribute
by VinsWorldcom
on Jul 31, 2015 at 15:14

    Windows Monks - has anyone gotten the Perl Debugger rcfile (.perldb / perldb.ini) to work on Windows? I can use the Perl debugger fine with 'perl -d <progfile> [args]', but if I have a .perldb (perldb.ini) file defined, I get mixed, unsatisfying results.

    I'm on Windows 7 x64 with Strawberry 5.18.1.

    Essentially I've tried .perldb and perldb.ini in both the current directory and my home directory. It seems only perldb.ini is recognized and when it finds it, regardless of location, I get the error:

    perldb: Must not source insecure rcfile ./perldb.ini. You or the superuser must be the owner, and it must not be writable by anyone but its owner.

    So I've tried to modify permissions of the perldb.ini file on Windows by breaking the parent inheritance on that file and making sure I'm the owner and the only one with "Full Permissions" - which still doesn't fix the problem.

    Anyone get this working successfully?

    UPDATE: I've narrowed it down in

    'use vars qw($rcfile);' does a check which for Windows will return 'perldb.ini' regardless explaining why '.perldb' has no effect, despite POD about running interactive vs non- mode.

    Then, that 'perldb.ini' file is (eventually) run through "sub is_safe_file" which does a 'stat()' and on Windows, is obviously not returning the proper value to create a false when bit-masked with 022. See the function in for more details as well as POSIX::S_ISDIR() with $stat->mode values from Windows vs. Linux, which has the mode value I'm getting "33206" on Windows.

    That being said, I could do all sorts of things to fix this by editing, but is there a way / argument /something to get this to work without me monkeying with a module's code?

Perl system command memory usage in threads
4 direct replies — Read more / Contribute
by rmahin
on Jul 31, 2015 at 14:24

    SOLVED Updated to perl 5.20.2 and all problems vanished.

    Hello! Been noticing some strange memory issues with a script I'm working on, and have come up with this to highlight the issues

    use strict; use warnings; use threads; use threads::shared; $|++; my $DONE :shared = 0; my $lock :shared; my $execMethod = $ARGV[0] || 0; if($execMethod !~ /[12345]/){ print "Must pass an exec method:\n"; print "1 = backticks\n"; print "2 = backticks synchronized\n"; print "3 = open\n"; print "4 = open synchronized\n"; print "5 = system\n"; exit 1; } sub execute{ my $cmd = shift; if($execMethod == 1){ `$cmd` }elsif($execMethod == 2){ lock $lock; `$cmd` }elsif($execMethod == 3){ open(my $fs, "-|", $cmd); foreach(<$fs>){}; close $fs; }elsif($execMethod == 4){ lock $lock; open(my $fs, "-|", $cmd); foreach(<$fs>){}; close $fs; }elsif($execMethod == 5){ system($cmd . ">nul"); } } sub worker{ while(!$DONE){ execute('echo hello world'); } } my @workers = map threads->create( \&worker), (1..30); print "Press <enter> to terminate\n"; <STDIN>; $DONE = 1; $_->join() for @workers;

    Script is invoked with <script>.pl executionMethod

    Question 1 relates to memory usage. Methods 2, 4, and 5 all exhibit a permanent memory creep. Is there a way to fix this and let this script run forever? If the solution is periodically join threads, this is not feasible. I have tried this a couple years ago and came across some bug but outlined in this node and changing to an approach like this would require far too much testing to ensure no other bugs occur. If there really is no solution, would be good to know :)

    Question 2: For methods 1 and 3, why do i need to synchronize them? If I do not, the script just hangs up usually after only a few seconds. Synchronizing this access kind of seems to defeat the purpose of running system commands in threads, is there something I can do differently?

    *I have been running this on Windows 2008 R2, using perl 5.18.2

    Thanks in advance for all your help

    UPDATE 1: Here is the log file from perfmon running test 5 for a little over a minute and eating roughly 150MB.

    UPDATE 2:

    perl -v output

    This is perl 5, version 18, subversion 1 (v5.18.1) built for MSWin32-x +64-multi-thread (with 1 registered patch, see perl -V for more detail) Copyright 1987-2013, Larry Wall Binary build 1800 [297570] provided by ActiveState http://www.ActiveSt Built Sep 20 2013 15:07:17 Perl may be copied only under the terms of either the Artistic License + or the GNU General Public License, which may be found in the Perl 5 source ki +t. Complete documentation for Perl, including FAQ lists, should be found +on this system using "man perl" or "perldoc perl". If you have access to + the Internet, point your browser at, the Perl Home Pa +ge.


    Host Name: VCLOUD291 OS Name: Microsoft Windows Server 2008 R2 Enterprise OS Version: 6.1.7601 Service Pack 1 Build 7601 OS Manufacturer: Microsoft Corporation OS Configuration: Standalone Server OS Build Type: Multiprocessor Free Registered Owner: Windows User Registered Organization: Product ID: 55041-507-5915375-84291 Original Install Date: 4/23/2014, 12:10:03 PM System Boot Time: 7/31/2015, 1:49:06 PM System Manufacturer: Microsoft Corporation System Model: Virtual Machine System Type: x64-based PC Processor(s): 1 Processor(s) Installed. [01]: Intel64 Family 6 Model 46 Stepping 6 +GenuineIntel ~1862 M hz BIOS Version: American Megatrends Inc. 090004 , 3/19/2009 Windows Directory: C:\Windows System Directory: C:\Windows\system32 Boot Device: \Device\HarddiskVolume1 System Locale: en-us;English (United States) Input Locale: en-us;English (United States) Time Zone: (UTC-07:00) Arizona Total Physical Memory: 4,096 MB Available Physical Memory: 1,635 MB Virtual Memory: Max Size: 6,143 MB Virtual Memory: Available: 3,364 MB Virtual Memory: In Use: 2,779 MB Page File Location(s): C:\pagefile.sys Domain: WORKGROUP Logon Server: \\VCLOUD291 Hotfix(s): 46 Hotfix(s) Installed.
How to capture compile errors from child program?
4 direct replies — Read more / Contribute
by bulrush
on Jul 31, 2015 at 06:03
    I have a parent program, that calls a child program,, like this:
    @z=`perl -option1 -option2`
    The whole command line for is in a scalar variable but that shouldn't matter. So I noticed that @z in would return completely blank after I made some changes to Lo and behold I had compile or syntax errors in, so none of my other error messages (written to STDOUT with "print") would be written from

    So when I'm running, how do I capture compile errors when calling Do I have to do something like

    @z=`perl -c`;
    before I do anything else? Will @z return STDERR messages or just STDOUT? If I did
    @z=`perl -option1 -option2` or die "Possible compile errors in";
    Would that do what I want?

    Thank you. Looking for some input so I can learn more about this.

Replacement for the "unsupported" Graph module?
1 direct reply — Read more / Contribute
by pokki
on Jul 31, 2015 at 05:54

    Hello Monks,

    I've used the Graph module for lots of graph-related tasks and I've always been happy with it. I don't need a superfast module, or one that consumes very little memory, since I don't have many graphs and they aren't very big. I don't need complex operations either; neighbor/descendant/ancestor list, maybe some shortest paths.

    Is there an heir to Graph, now that its author has stopped maintaining it? Or should I just keep using it and hope it doesn't break in the future? What do you guys use, or do you just write your own adjacency maps?

Email Module
4 direct replies — Read more / Contribute
by caseycole589
on Jul 31, 2015 at 03:16

    I'm trying to convince my work to use Perl for our email in a web app running on is this do able or does any one have advice/opinions. How hard is it to get something like this working on a windows server? Any input would be appreciated. I know I could do this easily in c# and probably should, but I'm looking for any excuse to get Perl running on our servers. That way I can have an excuse for using it on more projects moving forward.

Rolling variable
7 direct replies — Read more / Contribute
by artperl
on Jul 30, 2015 at 09:35
    Dear Perl monks, I would like to seek recommendation on what could be a good solution here... I would like to monitor file count in a specific directory & record the count every hour. I would need to keep that counts somewhere for another calculation but I would like to keep only the last 8 counts, meaning throw away the oldest data & just keep the last 8 records. How can I effectively do this in perl? Thanks much!...
New Meditations
Building the Right Thing (Part I): Pretotyping
7 direct replies — Read more / Contribute
by eyepopslikeamosquito
on Aug 04, 2015 at 07:56

    The biggest waste in software development seems to be building the wrong product, or the wrong features

    -- from How to build the right thing by Henrik Kniberg

    There is nothing so useless as doing efficiently that which should not be done at all

    -- Peter Drucker

    I'd originally planned yet another installment of the long-running Agile Imposition series, reporting on Lean startup and related ideas. As I began my research however, I soon realized this is a vast, complicated and perplexing topic; a topic so important it can make or break your business.

    So, to do it justice, I've decided instead to start a new series of articles on building the right thing.

    Innovators Trump Ideas

    Most new ideas fail, even if they are very well executed.

    -- from The Pretotyping Manifesto by Alberto Savoia

    At work we have a place where googlers submit their ideas; there are over 10,000 ideas. I call it the place where ideas go to die.

    -- from The Pretotyping Manifesto by Alberto Savoia

    If you have any doubt about the business value of ideas, try going to any venture capitalist and telling them: "I have a great idea that could be turned into a multi-billion $ business. I am not going to implement it, but if you give me a mere $10,000 I'll give you my idea and it's yours to do whatever you want with it." Just for fun, I created an ad peddling my services as an Ideator and posted it on Craigslist: "Ideator for hire. $10 per idea." I am still waiting for a serious reply.

    -- from Innovators beat Ideas by Alberto Savoia

    Leonard approaches them with an idea for a smartphone app that helps users solve Differential Equations and announces that nobody else is currently making an app like theirs. Because of Penny's presence, Sheldon is afraid Penny will steal Leonard's idea. He points out an "Unlikely, but very plausible scenario" that Penny befriends the gang to steal a marketable idea from them. Penny points out that she hangs out with them partly because she receives free food.

    -- from The Bus Pants Utilization Big Bang Theory, Season 4, Episode 12

    Sheldon's reaction notwithstanding, ideas themselves are of little value.

    Though innovators trump ideas, backing an innovator -- even one with a successful track record -- is hardly a safe bet. Innovation is hard. Startups are risky. Indeed, the prime motivation of both Alberto Savoia (father of pretotyping) and Eric Ries (father of Lean startup) is that they both experienced both phenomenal success and catastrophic failure in different Startups -- and so became determined to figure out why.

    Some Famous Product Failures

    Many businesses disappear because the founder-entrepreneur insists that he or she knows better than the market

    -- Peter Drucker

    The Innovator's nightmare is spending years and millions to build and perfect a product or service that people don't need or want

    -- from The Pretotyping Manifesto by Alberto Savoia

    The throwaway merchants at Bic thought; I know we've been very successfully making disposable pens, lighters and razors, why not make disposable underwear for women?

    -- from Biggest and Worst Product Failures

    Some examples of spectacular failures caused by building the wrong "it":

    Many other examples could be given.

    What is especially tragic is when huge investments are made up front, then -- when the product idea is clearly failing -- instead of calling it quits, still more cash is pumped in. Until bankruptcy ensues. How to avoid this sort of tragedy?


    IBM 30 years ago did something very clever. They thought that speech to text would be the next big thing because managers could not type. Their market research told them that if they built a speech to text translator, people would buy it. As a small experiment they got people who said "we will pay $10,000 if you build it" and brought them to IBM. They put them in a room with a microphone and a screen, so they thought they had a speech to text translator when in fact they had a super typist in a hidden room! It sounded like a good idea. However, after using it, at the end of the day my throat is sore; and I cannot dictate confidential memos in an open office. After the test, folks said "I'm sorry, I hope you didn't build too many of them, because we don't want them".

    The person who built the Palm Pilot, Jeff Hawkins, had an innovator's nightmare, lost millions. This time, instead of whipping my investors into a frenzy, this time let's test the idea with a little wood block and a tooth pick, and he went around for two weeks pretending he had build this Palm Pilot. After two weeks of this pretending, he said "You know, if this wasn't just a piece of wood I would actually use it". It had much less functionality than the Newton, yet was much more successful.

    -- from The Pretotyping Manifesto by Alberto Savoia

    Pretotyping: Validating the market appeal and actual usage of a potential new product by simulating its core experience with the smallest possible investment of time and money.

    -- from The Pretotyping Manifesto by Alberto Savoia

    The Pretotyping Manifesto:

    • innovators beat ideas
    • pretotypes beat producttypes
    • data beats opinions
    • doing beats talking
    • simple beats complex
    • now beats later
    • commitment beats committees

    False Positives and False Negatives

    Remember Webvan, the originators of the idea of groceries ordered online, then delivered to your door? Conceived during the first internet boom of the late 1990's, the idea behind Webvan was an instant success in Thoughtland. Everyone gave it a thumbs-up, and why not? It sounded simple, convenient, it had that why-didnít-I-think-of-that, forehead-smacking ring of genius.

    Who can ignore Twitter? But when you first heard of the service, what was your reaction? Some may have thought it an intriguing experiment in real-time micro-broadcasting (though what evidence there was that this was a gap for people is unclear to me). But surely few intuited that it would ultimately power the democratic revolutions of the Arab Spring. The elevator pitch for Twitter has that terrier-twisting-its-head-to-comprehend, temple-scratching ring of insanity.

    -- from Pretotyping@Work Invent Like a Startup, Invest Like a Grownup by Jeremy Clark

    With Webvan, people who had been asked a hypothetical "would you use it?" question turned out to be far less enthusiastic when faced with a concrete "will you use it?" question.

    By the way, seeking to learn from failure, Amazon has recently hired several of the original Webvan developers to launch a new Amazon Fresh grocery business.

    It seems that False Positives are usually based on the opinions of acknowledged (and over-confident) experts. We pretotype because data beats opinions.

    False Negatives, such as Twitter, are much rarer. Which leads us to Clark's second law of failure: too few crazy-sounding ideas get tried.

    To avoid both False Positive and False Negative outcomes, revealed-preference market testing of reasonable proxies for the final product have to be achievable at much lower investments of time and money.

    -- from Pretotyping@Work Invent Like a Startup, Invest Like a Grownup by Jeremy Clark

    Some Pretotyping Techniques

    • Fake Door. Advertise a new product or feature then track the response rate to see who would be interested.
    • Pinocchio. As used by Jeff Hawkins with his wooden model of the Palm Pilot.
    • Mechanical Turk. As used above by IBM to test customer reaction to speech-to-text translation "software".
    • One Night Stand. A fairly complete service experience is provided, minus the expensive underlying infrastructure required by a permanent solution.
    • Impersonator. A new wrapper is put on an existing product in order to impersonate a new one.
    • MVP. A Minimum Viable Product (MVP), a core part of Lean startup, is a working prototype put in the customer's hands. It is stripped down to the bare minimum required to perform a fair test.

    A complementary approach to pretotyping that has made a big splash recently is Lean startup, the subject of the next installment in this series.

    Perl Monks References

    External References

Log In?

What's my password?
Create A New User
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chilling in the Monastery: (8)
As of 2015-08-04 22:49 GMT
Find Nodes?
    Voting Booth?

    The oldest computer book still on my shelves (or on my digital media) is ...

    Results (76 votes), past polls