App::highlight - a simple grep-like highlighter app

Alex Balhatchet
Alex BalhatchetCTO at Lokku
App::highlight
a simple grep-like highlighter app
Alex Balhatchet @ London.pm Technical Meeting, July 2013
Intro
alex@masaki:~$ cat words.txt
fred
barney
betty
wilma
dino
pebbles
bamm-bamm
Intro
alex@masaki:~$ cat words.txt
| grep a
barney
wilma
bamm-bamm
Intro
alex@masaki:~$ cat words.txt
| highlight a
fred
barney
betty
wilma
dino
pebbles
bamm-bamm
Why?
Real World Example 1
alex@masaki:~$ servicectl status
servicectl status: checking arbyte-job-buffer-probe... running.
servicectl status: checking arbyte-job-runner-cleanup-cron... running.
servicectl status: checking arbyte-job-runners... running.
servicectl status: checking arbyte-manager... running.
servicectl status: checking arbyte-status-accepter... running.
servicectl status: checking imagesys-managerd... running.
servicectl status: checking launch-target-cron... running.
servicectl status: checking listings-db... running.
servicectl status: checking ops-cron... not running.
servicectl status: checking search-db... running.
servicectl status: checking searchindex-cron... running.
servicectl status: checking updatesem-cron... running.
Real World Example 1
alex@masaki:~$ servicectl status
| highlight -l 'not running'
servicectl status: checking arbyte-job-buffer-probe... running.
servicectl status: checking arbyte-job-runner-cleanup-cron... running.
servicectl status: checking arbyte-job-runners... running.
servicectl status: checking arbyte-manager... running.
servicectl status: checking arbyte-status-accepter... running.
servicectl status: checking imagesys-managerd... running.
servicectl status: checking launch-target-cron... running.
servicectl status: checking listings-db... running.
servicectl status: checking ops-cron... not running.
servicectl status: checking search-db... running.
servicectl status: checking searchindex-cron... running.
servicectl status: checking updatesem-cron... running.
Real World Example 2
alex@masaki:~$ zcat listings.txt.gz | grep
"'id' => '8244118'"
$VAR1 = {'debug' => {'remote_used' => 1},'etl' => {'agent_database_key' => undef,'feed_version' => '1.7','feed_timestamp' => '20130717100846','id' => '8244118','feed_segment' => undef,'feed_name' =>
'domain','partner_database_key' => undef},'listing_attributes' => {'agent_description' => undef,'gross_size' => undef,'floor' => '1','num_baths' => 1,'gross_size_unit' => undef,'construction_year' =>
undef,'num_rooms' => undef,'num_beds' => 3,'commission' => undef,'property_type' => 'house','datasource_custom_two' => undef,'land_size' => undef,'datasource_custom_five' => undef,'net_size_unit' =>
undef,'energyrating' => '0','net_size' => undef,'agent_logo_url' => undef,'rental_deposit' => undef,'energyindex' => '0','car_spaces' => '1','land_size_unit' => undef,'datasource_custom_three' =>
undef,'auction_date' => undef,'datasource_custom_four' => undef,'datasource_custom_one' => undef},'listers' => {'name' => 'Private Advertiser','type' => undef,'company' => 'Private Advertiser'},'listings' =>
{'price_currency' => 'AUD','full_description' => 'Alarm System, Balcony, Garden, Internal Laundry, Polished Timber Floors, Built-In Wardrobes, Fireplaces, Renovated - 6 metres wide, grand and spacious, light-
filled terrace Restoration by award-winning architect 5 minute stroll to Woollahra village, Centennial Park and Oxford Street Enormous family/dining/kitchen area opening to rear courtyard garden Double Living
area with marble fireplaces and mirrors 3 large bedrooms - two with marble fireplaces, all with quality built-ins and plantation shutters Rear lane car access via remote control roll-a-door Luxury marble
bathroom with bath and separate frameless glass shower Built-in laundry Downstairs powder room Large, private rear courtyard with established garden Entrance courtyard garden Garden maintenance included Foxtel
connections to living areas and two bedrooms Alarm system Telephone 0412 758 772 to arrange an appointment for inspection','placenames' => '{"street":"Windsor Street","building":"157","province":"NSW","town":"
Paddington"}','listing_type' => 'rent','title_keywords' => 'paddington,windsor street','keywords' => ['backyard','balcony','garden','kitchen','terrace'],'actually_the_original_address' => '157 Windsor Street,
Paddington, NSW, 2021','latitude' => '-33.886527','display_address' => undef,'raw_content_digest' => 'c9080b2827fbf612aec4369dd6af1931','debug' => undef,'address' => '157 Windsor Street, Paddington, NSW,
2021','price_type' => 'weekly','longitude' => '151.235183','teaser' => 'Alarm System, Balcony, Garden, Internal Laundry, Polished Timber Floors, Built-In Wardrobes, Fireplaces, Renovated 6 metres wide, grand and
light-filled terrace Restoration by award-winning architect 5 minute stroll to Woollahra village, Centennial Park and Oxford Street Enormous...','geocode_method' => 'remote','geocode_accuracy' => 9,'photo_url'
=> 'http://images.domain.com.au/img/2013320/0/158ffe47-3469-466b-9727-a51c4def7e1b_FS.jpg','datasource_dbkey' => '8244118','site_url' => 'http://www.domain.com.au/Public/PropertyDetails.aspx?
adid=8244118','photo_count' => '8','ext_categories' => '','price' => 1850,'coldrent' => undef,'title' => 'Windsor Street, Paddington - Balcony','datasource_name' => 'domain','price_low' => 1850,'photos' =>
{'urls' => ['http://images.domain.com.au/img/2013320/0/158ffe47-3469-466b-9727-a51c4def7e1b_FS.jpg'],'total' => '8'},'monetized' => '0','status_type' => 'active','datasource_campaign_id' =>
undef,'site_mobile_url' => undef,'display_brand' => undef,'attribute_hash' => '8244118','postcode' => '2021','country' => undef,'orig_address' => '157 Windsor Street, Paddington, NSW, 2021','geocode_matched' =>
'2021, 157 Windsor Street, Paddington, New South Wales, Australia','price_high' => 1850,'display_price' => '$1,850'}};
Real World Example 2
alex@masaki:~$ zcat listings.txt.gz | grep
"'id' => '8244118'"
| highlight 'postcode'
$VAR1 = {'debug' => {'remote_used' => 1},'etl' => {'agent_database_key' => undef,'feed_version' => '1.7','feed_timestamp' => '20130717100846','id' => '8244118','feed_segment' => undef,'feed_name' =>
'domain','partner_database_key' => undef},'listing_attributes' => {'agent_description' => undef,'gross_size' => undef,'floor' => '1','num_baths' => 1,'gross_size_unit' => undef,'construction_year' =>
undef,'num_rooms' => undef,'num_beds' => 3,'commission' => undef,'property_type' => 'house','datasource_custom_two' => undef,'land_size' => undef,'datasource_custom_five' => undef,'net_size_unit' =>
undef,'energyrating' => '0','net_size' => undef,'agent_logo_url' => undef,'rental_deposit' => undef,'energyindex' => '0','car_spaces' => '1','land_size_unit' => undef,'datasource_custom_three' =>
undef,'auction_date' => undef,'datasource_custom_four' => undef,'datasource_custom_one' => undef},'listers' => {'name' => 'Private Advertiser','type' => undef,'company' => 'Private Advertiser'},'listings' =>
{'price_currency' => 'AUD','full_description' => 'Alarm System, Balcony, Garden, Internal Laundry, Polished Timber Floors, Built-In Wardrobes, Fireplaces, Renovated - 6 metres wide, grand and spacious, light-
filled terrace Restoration by award-winning architect 5 minute stroll to Woollahra village, Centennial Park and Oxford Street Enormous family/dining/kitchen area opening to rear courtyard garden Double Living
area with marble fireplaces and mirrors 3 large bedrooms - two with marble fireplaces, all with quality built-ins and plantation shutters Rear lane car access via remote control roll-a-door Luxury marble
bathroom with bath and separate frameless glass shower Built-in laundry Downstairs powder room Large, private rear courtyard with established garden Entrance courtyard garden Garden maintenance included Foxtel
connections to living areas and two bedrooms Alarm system Telephone 0412 758 772 to arrange an appointment for inspection','placenames' => '{"street":"Windsor Street","building":"157","province":"NSW","town":"
Paddington"}','listing_type' => 'rent','title_keywords' => 'paddington,windsor street','keywords' => ['backyard','balcony','garden','kitchen','terrace'],'actually_the_original_address' => '157 Windsor Street,
Paddington, NSW, 2021','latitude' => '-33.886527','display_address' => undef,'raw_content_digest' => 'c9080b2827fbf612aec4369dd6af1931','debug' => undef,'address' => '157 Windsor Street, Paddington, NSW,
2021','price_type' => 'weekly','longitude' => '151.235183','teaser' => 'Alarm System, Balcony, Garden, Internal Laundry, Polished Timber Floors, Built-In Wardrobes, Fireplaces, Renovated 6 metres wide, grand and
light-filled terrace Restoration by award-winning architect 5 minute stroll to Woollahra village, Centennial Park and Oxford Street Enormous...','geocode_method' => 'remote','geocode_accuracy' => 9,'photo_url'
=> 'http://images.domain.com.au/img/2013320/0/158ffe47-3469-466b-9727-a51c4def7e1b_FS.jpg','datasource_dbkey' => '8244118','site_url' => 'http://www.domain.com.au/Public/PropertyDetails.aspx?
adid=8244118','photo_count' => '8','ext_categories' => '','price' => 1850,'coldrent' => undef,'title' => 'Windsor Street, Paddington - Balcony','datasource_name' => 'domain','price_low' => 1850,'photos' =>
{'urls' => ['http://images.domain.com.au/img/2013320/0/158ffe47-3469-466b-9727-a51c4def7e1b_FS.jpg'],'total' => '8'},'monetized' => '0','status_type' => 'active','datasource_campaign_id' =>
undef,'site_mobile_url' => undef,'display_brand' => undef,'attribute_hash' => '8244118','postcode' => '2021','country' => undef,'orig_address' => '157 Windsor Street, Paddington, NSW, 2021','geocode_matched' =>
'2021, 157 Windsor Street, Paddington, New South Wales, Australia','price_high' => 1850,'display_price' => '$1,850'}};
Features
Features
alex@masaki:~$ highlight --help
highlight [-bCcehlnor] [long options...]
-c --color use terminal color for highlighting
-C --no-color don't use terminal color
-e --escape auto-escape input (default)
-r -n --regex --no-escape don't auto-escape input (regex mode)
-i --ignore-case ignore case for matches
-l --full-line highlight the whole matched line
-o --one-color use only one color for all matches
-b --show-bad-spaces highlight spaces at the end of lines
-v --version show version number
-h --help display a usage message
Color
alex@masaki:~$ cat words.txt | highlight
fred barney betty wilma dino pebbles bamm-
bamm
fred
barney
betty
wilma
dino
pebbles
bamm-bamm
No Color
alex@masaki:~$ cat words.txt | highlight
fred barney betty wilma dino pebbles bamm-
bamm --no-color
<<fred>>
[[barney]]
((betty))
{{wilma}}
**dino**
__pebbles__
<<bamm-bamm>>
Escape
alex@masaki:~$ cat words.txt | highlight
'b[ea]t{2}.'
fred
barney
betty
wilma
dino
pebbles
bamm-bamm
No Escape (aka regex mode)
alex@masaki:~$ cat words.txt | highlight
--regex 'b[ea]t{2}.'
fred
barney
betty
wilma
dino
pebbles
bamm-bamm
Ignore Case
alex@masaki:~$ cat words.txt | highlight
--ignore-case 'MM'
fred
barney
betty
wilma
dino
pebbles
bamm-bamm
Full Line
alex@masaki:~$ cat words.txt | highlight
--full-line 'a'
fred
barney
betty
wilma
dino
pebbles
bamm-bamm
One Color
alex@masaki:~$ cat words.txt | highlight
--one-color 'f' 'r' 'e' 'b'
fred
barney
betty
wilma
dino
pebbles
bamm-bamm
Bad Spaces (inspired by git diff)
alex@masaki:~$ cat words.txt | highlight
--show-bad-spaces
fred
barney
bettyxxxx
wilma
dino
pebblesx
bamm-bamm
Cool Tricks
SVN Diff
alias svndiff="
svn diff
| highlight --show-bad-spaces
| highlight --regex --full-line
'^-[^-]' '^[+][^+]' '^[+-]{2}'
| less -R"
SVN Diff
alex@masaki:~$ svndiff
===================================================================
--- SERP.pm (revision 62240)
+++ SERP.pm (working copy)
@@ -1,13 +1,14 @@
+use utf8;
+xxxx
package Lokku::URL::SERP;
use base 'Lokku::URL';
-use Clone 'clone';
-use List::MoreUtils 'uniq';
+use Clone qw(clone);
+use List::MoreUtils qw(uniq);
use Lokku::Base::Config;
Tailing Access Logs
alex@masaki:~$ tail -f ~/common/logs/apache/frontend/access_log.2013-
07-17-00_00_00 | highlight -l -r 'HTTP/1.1" 50d ' 'HTTP/1.1" 200
' 'HTTP/1.1" 30d ' 'HTTP/1.1" 40d '
x.x.x.x - - [17/Jul/2013:14:13:51 +0000] "GET /abode-sale-house-in-friday-hill HTTP/1.1" 200 9549 "-"
"Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)" 125669 www
x.x.x.x - - [17/Jul/2013:14:13:51 +0000] "GET /paige-petrook-rent-flat-in-the-avenue-ha5 HTTP/1.1" 200
9586 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)" 97016 www
x.x.x.x - - [17/Jul/2013:14:13:51 +0000] "GET /gunness/property/buy HTTP/1.1" 200 16501 "-" "Mozilla/5.0
(compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 109951 www
x.x.x.x - - [17/Jul/2013:14:13:52 +0000] "GET /rd?l=UbeTFSQlTSlUJUMFlk&url=2-
ePz73aTBU4LVGFByDI484Ner8aIMqOimmnO-vZos3KDcnfaeeMPe4rGzMAHEMEMIx5MZsli8WOfUu6sPU8-oGyl-
oBxFgBrDY1PNVVZlNerg11bkCYzKZwBlYrKuUnoqgEDyvQYT0AWjNiAXvEvzby0n8wKI_4SYr67NnK50C3WeiSB3ATzAdHRuPx89ZkLfV
7zVXG2QDbeS6DmC6o17lS3zg4TQbgURP9KPebQfsYvRw-
KZZSJe5bz67v9wC0YOb6G85BbGUnJzoOHf6gadGwCRAqFSnkZv4Fqu84Vq_WqIfy_oPVJlWQ%3D%
3D&v=2&s=Vbelwusrlloqtlnpusmosplslplu&itype=1 HTTP/1.1" 302 - "http://www.nestoria.co.uk/victoria-road-
ct14/house/sale" "Mozilla/5.0 (Linux; Android 4.1.2; GT-P3100 Build/JZO54K) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/28.0.1500.64 Safari/537.36" 10465 rd
x.x.x.x - - [17/Jul/2013:14:13:52 +0000] "GET /help/unknown-location HTTP/1.1" 404 9279 "-" "Mozilla/5.0
(Linux; U; en-gb; KFOT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.1 Safari/535.19 Silk-
Accelerated=true" 5932 www
x.x.x.x - - [17/Jul/2013:14:13:53 +0000] "GET /api?
action=search_listings&encoding=json&sort=price_lowhigh&price_min=150001&price_max=200000&page=1&radius=5
2.360992,-2.039034,1mi HTTP/1.1" 200 23729 "-" "-" 65233 api
Using /usr/bin/watch with highlight
alex@masaki:~$ watch --color 'du -hsc * |
highlight -l G K M'
1.1G alex
32M davidl
16K savio
1.3G total
Tech Details
Perl Modules Used
For the app
App::Cmd::Simple
Term::ANSIColor
Getopt::Long::Descriptive
For testing
App::Cmd::Tester
Test::Without::Module
Bug Reports / Contributions
https://metacpan.org/module/App::highlight
Version 0.13 released July 18th 2013 :-)
https://github.com/kaoru/App-highlight
https://travis-ci.org/kaoru/App-highlight
N
estoria
is
H
iring!
http://lokku.com
/jobs
Thanks!
1 of 28

Recommended

BlinkDB 紹介 by
BlinkDB 紹介BlinkDB 紹介
BlinkDB 紹介Masafumi Oyamada
5.7K views20 slides
Mysql casual talks vol4 by
Mysql casual talks vol4Mysql casual talks vol4
Mysql casual talks vol4matsuo kenji
5K views40 slides
Salesforceでの大規模データの取り扱い by
Salesforceでの大規模データの取り扱いSalesforceでの大規模データの取り扱い
Salesforceでの大規模データの取り扱いSalesforce Developers Japan
12.1K views64 slides
AppSec And Microservices by
AppSec And MicroservicesAppSec And Microservices
AppSec And MicroservicesSam Newman
4.4K views84 slides
ELK: Moose-ively scaling your log system by
ELK: Moose-ively scaling your log systemELK: Moose-ively scaling your log system
ELK: Moose-ively scaling your log systemAvleen Vig
16.9K views120 slides
サンタクロースを支えるIT技術 @M_Ishikawa #yapcasia by
サンタクロースを支えるIT技術 @M_Ishikawa #yapcasiaサンタクロースを支えるIT技術 @M_Ishikawa #yapcasia
サンタクロースを支えるIT技術 @M_Ishikawa #yapcasiaMasayuki Ishikawa
21.5K views82 slides

More Related Content

Similar to App::highlight - a simple grep-like highlighter app

ETL for Pros: Getting Data Into MongoDB by
ETL for Pros: Getting Data Into MongoDBETL for Pros: Getting Data Into MongoDB
ETL for Pros: Getting Data Into MongoDBMongoDB
327 views77 slides
Sheetal west park residency - 3/4 BHK Apartment on sale by
Sheetal west park residency - 3/4 BHK Apartment on saleSheetal west park residency - 3/4 BHK Apartment on sale
Sheetal west park residency - 3/4 BHK Apartment on saleSachin Jain
13 views22 slides
Supertech 34 pavilion by
Supertech 34 pavilionSupertech 34 pavilion
Supertech 34 pavilionVanshkar_priyanka
397 views3 slides
MongoDB Europe 2016 - ETL for Pros – Getting Data Into MongoDB The Right Way by
MongoDB Europe 2016 - ETL for Pros – Getting Data Into MongoDB The Right WayMongoDB Europe 2016 - ETL for Pros – Getting Data Into MongoDB The Right Way
MongoDB Europe 2016 - ETL for Pros – Getting Data Into MongoDB The Right WayMongoDB
1.3K views72 slides
Launching Beeline with Firebase by
Launching Beeline with FirebaseLaunching Beeline with Firebase
Launching Beeline with FirebaseChetan Padia
562 views56 slides
Automate Your FME Server Installs, Take a Five Minute Break by
Automate Your FME Server Installs, Take a Five Minute BreakAutomate Your FME Server Installs, Take a Five Minute Break
Automate Your FME Server Installs, Take a Five Minute BreakSafe Software
48 views40 slides

Similar to App::highlight - a simple grep-like highlighter app(8)

ETL for Pros: Getting Data Into MongoDB by MongoDB
ETL for Pros: Getting Data Into MongoDBETL for Pros: Getting Data Into MongoDB
ETL for Pros: Getting Data Into MongoDB
MongoDB327 views
Sheetal west park residency - 3/4 BHK Apartment on sale by Sachin Jain
Sheetal west park residency - 3/4 BHK Apartment on saleSheetal west park residency - 3/4 BHK Apartment on sale
Sheetal west park residency - 3/4 BHK Apartment on sale
Sachin Jain13 views
MongoDB Europe 2016 - ETL for Pros – Getting Data Into MongoDB The Right Way by MongoDB
MongoDB Europe 2016 - ETL for Pros – Getting Data Into MongoDB The Right WayMongoDB Europe 2016 - ETL for Pros – Getting Data Into MongoDB The Right Way
MongoDB Europe 2016 - ETL for Pros – Getting Data Into MongoDB The Right Way
MongoDB1.3K views
Launching Beeline with Firebase by Chetan Padia
Launching Beeline with FirebaseLaunching Beeline with Firebase
Launching Beeline with Firebase
Chetan Padia562 views
Automate Your FME Server Installs, Take a Five Minute Break by Safe Software
Automate Your FME Server Installs, Take a Five Minute BreakAutomate Your FME Server Installs, Take a Five Minute Break
Automate Your FME Server Installs, Take a Five Minute Break
Safe Software48 views

More from Alex Balhatchet

Geocoding the World in Perl YAPC::EU 2014 by
Geocoding the World in Perl YAPC::EU 2014Geocoding the World in Perl YAPC::EU 2014
Geocoding the World in Perl YAPC::EU 2014Alex Balhatchet
1.4K views33 slides
Test Kit 2.0 YAPC::EU 2014 Lightning Talk by
Test Kit 2.0 YAPC::EU 2014 Lightning TalkTest Kit 2.0 YAPC::EU 2014 Lightning Talk
Test Kit 2.0 YAPC::EU 2014 Lightning TalkAlex Balhatchet
930 views22 slides
Nestoria Dev Blog YAPC::EU 2014 Lightning Talk by
Nestoria Dev Blog YAPC::EU 2014 Lightning TalkNestoria Dev Blog YAPC::EU 2014 Lightning Talk
Nestoria Dev Blog YAPC::EU 2014 Lightning TalkAlex Balhatchet
1.1K views15 slides
Test::Kit 2.0 (London.pm Technical Meeting July 2014) by
Test::Kit 2.0 (London.pm Technical Meeting July 2014)Test::Kit 2.0 (London.pm Technical Meeting July 2014)
Test::Kit 2.0 (London.pm Technical Meeting July 2014)Alex Balhatchet
1.2K views32 slides
Perl 101 by
Perl 101Perl 101
Perl 101Alex Balhatchet
2.8K views51 slides
Continuous testing and deployment in Perl (London.pm Technical Meeting Octobe... by
Continuous testing and deployment in Perl (London.pm Technical Meeting Octobe...Continuous testing and deployment in Perl (London.pm Technical Meeting Octobe...
Continuous testing and deployment in Perl (London.pm Technical Meeting Octobe...Alex Balhatchet
2.5K views32 slides

More from Alex Balhatchet(10)

Geocoding the World in Perl YAPC::EU 2014 by Alex Balhatchet
Geocoding the World in Perl YAPC::EU 2014Geocoding the World in Perl YAPC::EU 2014
Geocoding the World in Perl YAPC::EU 2014
Alex Balhatchet1.4K views
Test Kit 2.0 YAPC::EU 2014 Lightning Talk by Alex Balhatchet
Test Kit 2.0 YAPC::EU 2014 Lightning TalkTest Kit 2.0 YAPC::EU 2014 Lightning Talk
Test Kit 2.0 YAPC::EU 2014 Lightning Talk
Alex Balhatchet930 views
Nestoria Dev Blog YAPC::EU 2014 Lightning Talk by Alex Balhatchet
Nestoria Dev Blog YAPC::EU 2014 Lightning TalkNestoria Dev Blog YAPC::EU 2014 Lightning Talk
Nestoria Dev Blog YAPC::EU 2014 Lightning Talk
Alex Balhatchet1.1K views
Test::Kit 2.0 (London.pm Technical Meeting July 2014) by Alex Balhatchet
Test::Kit 2.0 (London.pm Technical Meeting July 2014)Test::Kit 2.0 (London.pm Technical Meeting July 2014)
Test::Kit 2.0 (London.pm Technical Meeting July 2014)
Alex Balhatchet1.2K views
Continuous testing and deployment in Perl (London.pm Technical Meeting Octobe... by Alex Balhatchet
Continuous testing and deployment in Perl (London.pm Technical Meeting Octobe...Continuous testing and deployment in Perl (London.pm Technical Meeting Octobe...
Continuous testing and deployment in Perl (London.pm Technical Meeting Octobe...
Alex Balhatchet2.5K views
Introduction to Writing Readable and Maintainable Perl (YAPC::EU 2011 Version) by Alex Balhatchet
Introduction to Writing Readable and Maintainable Perl (YAPC::EU 2011 Version)Introduction to Writing Readable and Maintainable Perl (YAPC::EU 2011 Version)
Introduction to Writing Readable and Maintainable Perl (YAPC::EU 2011 Version)
Alex Balhatchet1.2K views
Introduction to writing readable and maintainable Perl by Alex Balhatchet
Introduction to writing readable and maintainable PerlIntroduction to writing readable and maintainable Perl
Introduction to writing readable and maintainable Perl
Alex Balhatchet4.5K views

Recently uploaded

The Power of Heat Decarbonisation Plans in the Built Environment by
The Power of Heat Decarbonisation Plans in the Built EnvironmentThe Power of Heat Decarbonisation Plans in the Built Environment
The Power of Heat Decarbonisation Plans in the Built EnvironmentIES VE
84 views20 slides
Inawisdom IDP by
Inawisdom IDPInawisdom IDP
Inawisdom IDPPhilipBasford
15 views48 slides
PCCC23:日本AMD株式会社 テーマ2「AMD EPYC™ プロセッサーを用いたAIソリューション」 by
PCCC23:日本AMD株式会社 テーマ2「AMD EPYC™ プロセッサーを用いたAIソリューション」PCCC23:日本AMD株式会社 テーマ2「AMD EPYC™ プロセッサーを用いたAIソリューション」
PCCC23:日本AMD株式会社 テーマ2「AMD EPYC™ プロセッサーを用いたAIソリューション」PC Cluster Consortium
25 views12 slides
Cocktail of Environments. How to Mix Test and Development Environments and St... by
Cocktail of Environments. How to Mix Test and Development Environments and St...Cocktail of Environments. How to Mix Test and Development Environments and St...
Cocktail of Environments. How to Mix Test and Development Environments and St...Aleksandr Tarasov
23 views135 slides
NTGapps NTG LowCode Platform by
NTGapps NTG LowCode Platform NTGapps NTG LowCode Platform
NTGapps NTG LowCode Platform Mustafa Kuğu
437 views30 slides
Future of AR - Facebook Presentation by
Future of AR - Facebook PresentationFuture of AR - Facebook Presentation
Future of AR - Facebook PresentationRob McCarty
65 views27 slides

Recently uploaded(20)

The Power of Heat Decarbonisation Plans in the Built Environment by IES VE
The Power of Heat Decarbonisation Plans in the Built EnvironmentThe Power of Heat Decarbonisation Plans in the Built Environment
The Power of Heat Decarbonisation Plans in the Built Environment
IES VE84 views
PCCC23:日本AMD株式会社 テーマ2「AMD EPYC™ プロセッサーを用いたAIソリューション」 by PC Cluster Consortium
PCCC23:日本AMD株式会社 テーマ2「AMD EPYC™ プロセッサーを用いたAIソリューション」PCCC23:日本AMD株式会社 テーマ2「AMD EPYC™ プロセッサーを用いたAIソリューション」
PCCC23:日本AMD株式会社 テーマ2「AMD EPYC™ プロセッサーを用いたAIソリューション」
Cocktail of Environments. How to Mix Test and Development Environments and St... by Aleksandr Tarasov
Cocktail of Environments. How to Mix Test and Development Environments and St...Cocktail of Environments. How to Mix Test and Development Environments and St...
Cocktail of Environments. How to Mix Test and Development Environments and St...
NTGapps NTG LowCode Platform by Mustafa Kuğu
NTGapps NTG LowCode Platform NTGapps NTG LowCode Platform
NTGapps NTG LowCode Platform
Mustafa Kuğu437 views
Future of AR - Facebook Presentation by Rob McCarty
Future of AR - Facebook PresentationFuture of AR - Facebook Presentation
Future of AR - Facebook Presentation
Rob McCarty65 views
"Surviving highload with Node.js", Andrii Shumada by Fwdays
"Surviving highload with Node.js", Andrii Shumada "Surviving highload with Node.js", Andrii Shumada
"Surviving highload with Node.js", Andrii Shumada
Fwdays58 views
"Node.js vs workers — A comparison of two JavaScript runtimes", James M Snell by Fwdays
"Node.js vs workers — A comparison of two JavaScript runtimes", James M Snell"Node.js vs workers — A comparison of two JavaScript runtimes", James M Snell
"Node.js vs workers — A comparison of two JavaScript runtimes", James M Snell
Fwdays14 views
Enabling DPU Hardware Accelerators in XCP-ng Cloud Platform Environment - And... by ShapeBlue
Enabling DPU Hardware Accelerators in XCP-ng Cloud Platform Environment - And...Enabling DPU Hardware Accelerators in XCP-ng Cloud Platform Environment - And...
Enabling DPU Hardware Accelerators in XCP-ng Cloud Platform Environment - And...
ShapeBlue108 views
Adopting Karpenter for Cost and Simplicity at Grafana Labs.pdf by MichaelOLeary82
Adopting Karpenter for Cost and Simplicity at Grafana Labs.pdfAdopting Karpenter for Cost and Simplicity at Grafana Labs.pdf
Adopting Karpenter for Cost and Simplicity at Grafana Labs.pdf
MichaelOLeary8213 views
Business Analyst Series 2023 - Week 4 Session 7 by DianaGray10
Business Analyst Series 2023 -  Week 4 Session 7Business Analyst Series 2023 -  Week 4 Session 7
Business Analyst Series 2023 - Week 4 Session 7
DianaGray10146 views
What is Authentication Active Directory_.pptx by HeenaMehta35
What is Authentication Active Directory_.pptxWhat is Authentication Active Directory_.pptx
What is Authentication Active Directory_.pptx
HeenaMehta3515 views
Digital Personal Data Protection (DPDP) Practical Approach For CISOs by Priyanka Aash
Digital Personal Data Protection (DPDP) Practical Approach For CISOsDigital Personal Data Protection (DPDP) Practical Approach For CISOs
Digital Personal Data Protection (DPDP) Practical Approach For CISOs
Priyanka Aash162 views
PCCC23:日本AMD株式会社 テーマ1「AMD Instinct™ アクセラレーターの概要」 by PC Cluster Consortium
PCCC23:日本AMD株式会社 テーマ1「AMD Instinct™ アクセラレーターの概要」PCCC23:日本AMD株式会社 テーマ1「AMD Instinct™ アクセラレーターの概要」
PCCC23:日本AMD株式会社 テーマ1「AMD Instinct™ アクセラレーターの概要」
Transcript: Redefining the book supply chain: A glimpse into the future - Tec... by BookNet Canada
Transcript: Redefining the book supply chain: A glimpse into the future - Tec...Transcript: Redefining the book supply chain: A glimpse into the future - Tec...
Transcript: Redefining the book supply chain: A glimpse into the future - Tec...
BookNet Canada41 views
Initiating and Advancing Your Strategic GIS Governance Strategy by Safe Software
Initiating and Advancing Your Strategic GIS Governance StrategyInitiating and Advancing Your Strategic GIS Governance Strategy
Initiating and Advancing Your Strategic GIS Governance Strategy
Safe Software184 views
Business Analyst Series 2023 - Week 4 Session 8 by DianaGray10
Business Analyst Series 2023 -  Week 4 Session 8Business Analyst Series 2023 -  Week 4 Session 8
Business Analyst Series 2023 - Week 4 Session 8
DianaGray10145 views
"Node.js Development in 2024: trends and tools", Nikita Galkin by Fwdays
"Node.js Development in 2024: trends and tools", Nikita Galkin "Node.js Development in 2024: trends and tools", Nikita Galkin
"Node.js Development in 2024: trends and tools", Nikita Galkin
Fwdays33 views

App::highlight - a simple grep-like highlighter app

  • 1. App::highlight a simple grep-like highlighter app Alex Balhatchet @ London.pm Technical Meeting, July 2013
  • 3. Intro alex@masaki:~$ cat words.txt | grep a barney wilma bamm-bamm
  • 4. Intro alex@masaki:~$ cat words.txt | highlight a fred barney betty wilma dino pebbles bamm-bamm
  • 6. Real World Example 1 alex@masaki:~$ servicectl status servicectl status: checking arbyte-job-buffer-probe... running. servicectl status: checking arbyte-job-runner-cleanup-cron... running. servicectl status: checking arbyte-job-runners... running. servicectl status: checking arbyte-manager... running. servicectl status: checking arbyte-status-accepter... running. servicectl status: checking imagesys-managerd... running. servicectl status: checking launch-target-cron... running. servicectl status: checking listings-db... running. servicectl status: checking ops-cron... not running. servicectl status: checking search-db... running. servicectl status: checking searchindex-cron... running. servicectl status: checking updatesem-cron... running.
  • 7. Real World Example 1 alex@masaki:~$ servicectl status | highlight -l 'not running' servicectl status: checking arbyte-job-buffer-probe... running. servicectl status: checking arbyte-job-runner-cleanup-cron... running. servicectl status: checking arbyte-job-runners... running. servicectl status: checking arbyte-manager... running. servicectl status: checking arbyte-status-accepter... running. servicectl status: checking imagesys-managerd... running. servicectl status: checking launch-target-cron... running. servicectl status: checking listings-db... running. servicectl status: checking ops-cron... not running. servicectl status: checking search-db... running. servicectl status: checking searchindex-cron... running. servicectl status: checking updatesem-cron... running.
  • 8. Real World Example 2 alex@masaki:~$ zcat listings.txt.gz | grep "'id' => '8244118'" $VAR1 = {'debug' => {'remote_used' => 1},'etl' => {'agent_database_key' => undef,'feed_version' => '1.7','feed_timestamp' => '20130717100846','id' => '8244118','feed_segment' => undef,'feed_name' => 'domain','partner_database_key' => undef},'listing_attributes' => {'agent_description' => undef,'gross_size' => undef,'floor' => '1','num_baths' => 1,'gross_size_unit' => undef,'construction_year' => undef,'num_rooms' => undef,'num_beds' => 3,'commission' => undef,'property_type' => 'house','datasource_custom_two' => undef,'land_size' => undef,'datasource_custom_five' => undef,'net_size_unit' => undef,'energyrating' => '0','net_size' => undef,'agent_logo_url' => undef,'rental_deposit' => undef,'energyindex' => '0','car_spaces' => '1','land_size_unit' => undef,'datasource_custom_three' => undef,'auction_date' => undef,'datasource_custom_four' => undef,'datasource_custom_one' => undef},'listers' => {'name' => 'Private Advertiser','type' => undef,'company' => 'Private Advertiser'},'listings' => {'price_currency' => 'AUD','full_description' => 'Alarm System, Balcony, Garden, Internal Laundry, Polished Timber Floors, Built-In Wardrobes, Fireplaces, Renovated - 6 metres wide, grand and spacious, light- filled terrace Restoration by award-winning architect 5 minute stroll to Woollahra village, Centennial Park and Oxford Street Enormous family/dining/kitchen area opening to rear courtyard garden Double Living area with marble fireplaces and mirrors 3 large bedrooms - two with marble fireplaces, all with quality built-ins and plantation shutters Rear lane car access via remote control roll-a-door Luxury marble bathroom with bath and separate frameless glass shower Built-in laundry Downstairs powder room Large, private rear courtyard with established garden Entrance courtyard garden Garden maintenance included Foxtel connections to living areas and two bedrooms Alarm system Telephone 0412 758 772 to arrange an appointment for inspection','placenames' => '{"street":"Windsor Street","building":"157","province":"NSW","town":" Paddington"}','listing_type' => 'rent','title_keywords' => 'paddington,windsor street','keywords' => ['backyard','balcony','garden','kitchen','terrace'],'actually_the_original_address' => '157 Windsor Street, Paddington, NSW, 2021','latitude' => '-33.886527','display_address' => undef,'raw_content_digest' => 'c9080b2827fbf612aec4369dd6af1931','debug' => undef,'address' => '157 Windsor Street, Paddington, NSW, 2021','price_type' => 'weekly','longitude' => '151.235183','teaser' => 'Alarm System, Balcony, Garden, Internal Laundry, Polished Timber Floors, Built-In Wardrobes, Fireplaces, Renovated 6 metres wide, grand and light-filled terrace Restoration by award-winning architect 5 minute stroll to Woollahra village, Centennial Park and Oxford Street Enormous...','geocode_method' => 'remote','geocode_accuracy' => 9,'photo_url' => 'http://images.domain.com.au/img/2013320/0/158ffe47-3469-466b-9727-a51c4def7e1b_FS.jpg','datasource_dbkey' => '8244118','site_url' => 'http://www.domain.com.au/Public/PropertyDetails.aspx? adid=8244118','photo_count' => '8','ext_categories' => '','price' => 1850,'coldrent' => undef,'title' => 'Windsor Street, Paddington - Balcony','datasource_name' => 'domain','price_low' => 1850,'photos' => {'urls' => ['http://images.domain.com.au/img/2013320/0/158ffe47-3469-466b-9727-a51c4def7e1b_FS.jpg'],'total' => '8'},'monetized' => '0','status_type' => 'active','datasource_campaign_id' => undef,'site_mobile_url' => undef,'display_brand' => undef,'attribute_hash' => '8244118','postcode' => '2021','country' => undef,'orig_address' => '157 Windsor Street, Paddington, NSW, 2021','geocode_matched' => '2021, 157 Windsor Street, Paddington, New South Wales, Australia','price_high' => 1850,'display_price' => '$1,850'}};
  • 9. Real World Example 2 alex@masaki:~$ zcat listings.txt.gz | grep "'id' => '8244118'" | highlight 'postcode' $VAR1 = {'debug' => {'remote_used' => 1},'etl' => {'agent_database_key' => undef,'feed_version' => '1.7','feed_timestamp' => '20130717100846','id' => '8244118','feed_segment' => undef,'feed_name' => 'domain','partner_database_key' => undef},'listing_attributes' => {'agent_description' => undef,'gross_size' => undef,'floor' => '1','num_baths' => 1,'gross_size_unit' => undef,'construction_year' => undef,'num_rooms' => undef,'num_beds' => 3,'commission' => undef,'property_type' => 'house','datasource_custom_two' => undef,'land_size' => undef,'datasource_custom_five' => undef,'net_size_unit' => undef,'energyrating' => '0','net_size' => undef,'agent_logo_url' => undef,'rental_deposit' => undef,'energyindex' => '0','car_spaces' => '1','land_size_unit' => undef,'datasource_custom_three' => undef,'auction_date' => undef,'datasource_custom_four' => undef,'datasource_custom_one' => undef},'listers' => {'name' => 'Private Advertiser','type' => undef,'company' => 'Private Advertiser'},'listings' => {'price_currency' => 'AUD','full_description' => 'Alarm System, Balcony, Garden, Internal Laundry, Polished Timber Floors, Built-In Wardrobes, Fireplaces, Renovated - 6 metres wide, grand and spacious, light- filled terrace Restoration by award-winning architect 5 minute stroll to Woollahra village, Centennial Park and Oxford Street Enormous family/dining/kitchen area opening to rear courtyard garden Double Living area with marble fireplaces and mirrors 3 large bedrooms - two with marble fireplaces, all with quality built-ins and plantation shutters Rear lane car access via remote control roll-a-door Luxury marble bathroom with bath and separate frameless glass shower Built-in laundry Downstairs powder room Large, private rear courtyard with established garden Entrance courtyard garden Garden maintenance included Foxtel connections to living areas and two bedrooms Alarm system Telephone 0412 758 772 to arrange an appointment for inspection','placenames' => '{"street":"Windsor Street","building":"157","province":"NSW","town":" Paddington"}','listing_type' => 'rent','title_keywords' => 'paddington,windsor street','keywords' => ['backyard','balcony','garden','kitchen','terrace'],'actually_the_original_address' => '157 Windsor Street, Paddington, NSW, 2021','latitude' => '-33.886527','display_address' => undef,'raw_content_digest' => 'c9080b2827fbf612aec4369dd6af1931','debug' => undef,'address' => '157 Windsor Street, Paddington, NSW, 2021','price_type' => 'weekly','longitude' => '151.235183','teaser' => 'Alarm System, Balcony, Garden, Internal Laundry, Polished Timber Floors, Built-In Wardrobes, Fireplaces, Renovated 6 metres wide, grand and light-filled terrace Restoration by award-winning architect 5 minute stroll to Woollahra village, Centennial Park and Oxford Street Enormous...','geocode_method' => 'remote','geocode_accuracy' => 9,'photo_url' => 'http://images.domain.com.au/img/2013320/0/158ffe47-3469-466b-9727-a51c4def7e1b_FS.jpg','datasource_dbkey' => '8244118','site_url' => 'http://www.domain.com.au/Public/PropertyDetails.aspx? adid=8244118','photo_count' => '8','ext_categories' => '','price' => 1850,'coldrent' => undef,'title' => 'Windsor Street, Paddington - Balcony','datasource_name' => 'domain','price_low' => 1850,'photos' => {'urls' => ['http://images.domain.com.au/img/2013320/0/158ffe47-3469-466b-9727-a51c4def7e1b_FS.jpg'],'total' => '8'},'monetized' => '0','status_type' => 'active','datasource_campaign_id' => undef,'site_mobile_url' => undef,'display_brand' => undef,'attribute_hash' => '8244118','postcode' => '2021','country' => undef,'orig_address' => '157 Windsor Street, Paddington, NSW, 2021','geocode_matched' => '2021, 157 Windsor Street, Paddington, New South Wales, Australia','price_high' => 1850,'display_price' => '$1,850'}};
  • 11. Features alex@masaki:~$ highlight --help highlight [-bCcehlnor] [long options...] -c --color use terminal color for highlighting -C --no-color don't use terminal color -e --escape auto-escape input (default) -r -n --regex --no-escape don't auto-escape input (regex mode) -i --ignore-case ignore case for matches -l --full-line highlight the whole matched line -o --one-color use only one color for all matches -b --show-bad-spaces highlight spaces at the end of lines -v --version show version number -h --help display a usage message
  • 12. Color alex@masaki:~$ cat words.txt | highlight fred barney betty wilma dino pebbles bamm- bamm fred barney betty wilma dino pebbles bamm-bamm
  • 13. No Color alex@masaki:~$ cat words.txt | highlight fred barney betty wilma dino pebbles bamm- bamm --no-color <<fred>> [[barney]] ((betty)) {{wilma}} **dino** __pebbles__ <<bamm-bamm>>
  • 14. Escape alex@masaki:~$ cat words.txt | highlight 'b[ea]t{2}.' fred barney betty wilma dino pebbles bamm-bamm
  • 15. No Escape (aka regex mode) alex@masaki:~$ cat words.txt | highlight --regex 'b[ea]t{2}.' fred barney betty wilma dino pebbles bamm-bamm
  • 16. Ignore Case alex@masaki:~$ cat words.txt | highlight --ignore-case 'MM' fred barney betty wilma dino pebbles bamm-bamm
  • 17. Full Line alex@masaki:~$ cat words.txt | highlight --full-line 'a' fred barney betty wilma dino pebbles bamm-bamm
  • 18. One Color alex@masaki:~$ cat words.txt | highlight --one-color 'f' 'r' 'e' 'b' fred barney betty wilma dino pebbles bamm-bamm
  • 19. Bad Spaces (inspired by git diff) alex@masaki:~$ cat words.txt | highlight --show-bad-spaces fred barney bettyxxxx wilma dino pebblesx bamm-bamm
  • 21. SVN Diff alias svndiff=" svn diff | highlight --show-bad-spaces | highlight --regex --full-line '^-[^-]' '^[+][^+]' '^[+-]{2}' | less -R"
  • 22. SVN Diff alex@masaki:~$ svndiff =================================================================== --- SERP.pm (revision 62240) +++ SERP.pm (working copy) @@ -1,13 +1,14 @@ +use utf8; +xxxx package Lokku::URL::SERP; use base 'Lokku::URL'; -use Clone 'clone'; -use List::MoreUtils 'uniq'; +use Clone qw(clone); +use List::MoreUtils qw(uniq); use Lokku::Base::Config;
  • 23. Tailing Access Logs alex@masaki:~$ tail -f ~/common/logs/apache/frontend/access_log.2013- 07-17-00_00_00 | highlight -l -r 'HTTP/1.1" 50d ' 'HTTP/1.1" 200 ' 'HTTP/1.1" 30d ' 'HTTP/1.1" 40d ' x.x.x.x - - [17/Jul/2013:14:13:51 +0000] "GET /abode-sale-house-in-friday-hill HTTP/1.1" 200 9549 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)" 125669 www x.x.x.x - - [17/Jul/2013:14:13:51 +0000] "GET /paige-petrook-rent-flat-in-the-avenue-ha5 HTTP/1.1" 200 9586 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)" 97016 www x.x.x.x - - [17/Jul/2013:14:13:51 +0000] "GET /gunness/property/buy HTTP/1.1" 200 16501 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 109951 www x.x.x.x - - [17/Jul/2013:14:13:52 +0000] "GET /rd?l=UbeTFSQlTSlUJUMFlk&url=2- ePz73aTBU4LVGFByDI484Ner8aIMqOimmnO-vZos3KDcnfaeeMPe4rGzMAHEMEMIx5MZsli8WOfUu6sPU8-oGyl- oBxFgBrDY1PNVVZlNerg11bkCYzKZwBlYrKuUnoqgEDyvQYT0AWjNiAXvEvzby0n8wKI_4SYr67NnK50C3WeiSB3ATzAdHRuPx89ZkLfV 7zVXG2QDbeS6DmC6o17lS3zg4TQbgURP9KPebQfsYvRw- KZZSJe5bz67v9wC0YOb6G85BbGUnJzoOHf6gadGwCRAqFSnkZv4Fqu84Vq_WqIfy_oPVJlWQ%3D% 3D&v=2&s=Vbelwusrlloqtlnpusmosplslplu&itype=1 HTTP/1.1" 302 - "http://www.nestoria.co.uk/victoria-road- ct14/house/sale" "Mozilla/5.0 (Linux; Android 4.1.2; GT-P3100 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.64 Safari/537.36" 10465 rd x.x.x.x - - [17/Jul/2013:14:13:52 +0000] "GET /help/unknown-location HTTP/1.1" 404 9279 "-" "Mozilla/5.0 (Linux; U; en-gb; KFOT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.1 Safari/535.19 Silk- Accelerated=true" 5932 www x.x.x.x - - [17/Jul/2013:14:13:53 +0000] "GET /api? action=search_listings&encoding=json&sort=price_lowhigh&price_min=150001&price_max=200000&page=1&radius=5 2.360992,-2.039034,1mi HTTP/1.1" 200 23729 "-" "-" 65233 api
  • 24. Using /usr/bin/watch with highlight alex@masaki:~$ watch --color 'du -hsc * | highlight -l G K M' 1.1G alex 32M davidl 16K savio 1.3G total
  • 26. Perl Modules Used For the app App::Cmd::Simple Term::ANSIColor Getopt::Long::Descriptive For testing App::Cmd::Tester Test::Without::Module
  • 27. Bug Reports / Contributions https://metacpan.org/module/App::highlight Version 0.13 released July 18th 2013 :-) https://github.com/kaoru/App-highlight https://travis-ci.org/kaoru/App-highlight