perl regexp – threat whole string as one line
s - Treat the whole string as one line, so that even /./ will match a "newline" character.
#!/usr/bin/perl
my $multiline =
"In the town where I was born,\n" .
"Lived a man who sailed to sea,\n" .
"And he told us of his life,\n" .
"In the land of submarines.";
if ($multiline =~ /born,.Lived/s) {
print "found\n"; # found in deed
} else {
print "not found\n";
}
xterm colors
The blue is too dark for my eyes, specially then it's used by colorgcc to highlight line numbers.
...and I just can't get angry with a cheerful orange cursorColor 😀
~./Xdefaults:
xterm*foreground: #ffffff xterm*background: #000000 xterm*cursorColor: orange xterm*color4: #526fcf
find and remove files
With rm and find:
rm $(find . -name *.gcda)
Or with the -exec paramter of find
find . -name *.gcda -exec rm -rf {} \;
git tag
Tag commit:
git tag <tagname> -m <msg> #lightweight git tag -a <tagname> -m <msg> #annotated, preferred
Push tags (not done by default):
git push --tags <remote> <branch> #dangerous, avoid pushing all tags! git push <remote> <tagname>
Fetch tags
git fetch --tags <remote> <branch> #or git remote update <remote>
Look up which branch has the tag
git branch --all --contains <tagname>
delete tags remote and local:
git push --delete origin <tagname> git tag -d <tagname>
choose default answers at make oldconfig
Linux command yes outputs parameter string.
yes "" | make oldconfig
Stringizing Operator, Token concatenation
After many years, even C shows new stuff:
Stringizing Operator
#define QUOTEME(x) #x
According to wiki:
Although macro expansion does not occur within a quoted string, the text of the macro arguments can be quoted and treated as a string literal by using the "#" directive (also known as the "Stringizing Operator").
the code
printf("%s\n", QUOTEME(1+2));
will expand to
printf("%s\n", "1+2");
Token concatenation
Token concatenation, also called token pasting, is one of the most subtle — and easy to abuse — features of the C macro preprocessor. Two arguments can be 'glued' together using ## preprocessor operator; this allows two tokens to be concatenated in the preprocessed code. This can be used to construct elaborate macros which act like a crude version of C++ templates.
For instance:
#define MYCASE(item,id) \ case id: \ item##_##id = id;\ break
the code
MYCASE(widget,23);
will expand to
widget_23 = 23;
create signature (of hash) with openssl c api
This is just too long...
You can find another version where all return value is checked here
EDIT: There is another solution, with SHA256_x to create digest and RSA_sign to sign here
/* gcc ./openssl_sign.c -lssl */
#include s<tdio.h>
#include <string.h>
#include <error.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/ssl.h>
#include o<penssl/evp.h>
int pass_cb( char *buf, int size, int rwflag, void *u )
{
int len;
char tmp[1024];
printf( "Enter pass phrase for '%s': ", (char*)u );
scanf( "%s", tmp );
len = strlen( tmp );
if ( len <= 0 ) return 0;
if ( len > size ) len = size;
memset( buf, '\0', size );
memcpy( buf, tmp, len );
return len;
}
RSA* getRsaFp( const char* rsaprivKeyPath )
{
FILE* fp;
fp = fopen( rsaprivKeyPath, "r" );
if ( fp == 0 ) {
fprintf( stderr, "Couldn't open RSA priv key: '%s'. %s\n",
rsaprivKeyPath, strerror(errno) );
exit(1);
}
RSA *rsa = 0;
rsa = RSA_new();
rsa = PEM_read_RSAPrivateKey(fp, 0, pass_cb, (char*)rsaprivKeyPath);
fclose( fp );
return rsa;
}
int main( int argc, char* argv[] )
{
if ( argc != 2 ) {
fprintf( stderr, "Usage: %s <text to sign>\n", argv[0] );
exit( 1 );
}
const char *clearText = argv[1];
char rsaprivKeyPath[1024];
sprintf( rsaprivKeyPath, "%s/.ssh/id_rsa", getenv ("HOME") );
SSL_load_error_strings();
OpenSSL_add_all_algorithms();
OpenSSL_add_all_ciphers();
OpenSSL_add_all_digests();
EVP_PKEY *evpKey = 0;
evpKey = EVP_PKEY_new();
RSA *rsa = 0;
rsa = getRsaFp( rsaprivKeyPath );
EVP_PKEY_set1_RSA( evpKey, rsa );
EVP_MD_CTX* ctx = 0;
ctx = EVP_MD_CTX_create();
EVP_SignInit_ex( ctx, EVP_sha1(), 0 );
EVP_SignUpdate( ctx, clearText, strlen( clearText ) );
const int MAX_LEN = 1024;
unsigned char sig[MAX_LEN];
unsigned int sigLen;
memset(sig, 0, MAX_LEN);
EVP_SignFinal( ctx, sig, &sigLen, evpKey );
printf( "Got signature: '%s'\n", sig );
EVP_MD_CTX_destroy( ctx );
RSA_free( rsa );
EVP_PKEY_free( evpKey );
ERR_free_strings();
return 0;
}
install cxxtest to gentoo
It is basically downloading the ebuild from the bgo-overlay - cxxtest and following the steps of this article at linuxreviews about how to install custom ebuilds with gentoo.
Which are in this case:
su mkdir -p /usr/local/portage echo PORTDIR_OVERLAY=/usr/local/portage >> /etc/portage/make.conf mkdir -p /usr/local/portage/metadata/ touch /usr/local/portage/metadata/layout.conf echo "masters = gentoo" >> /usr/local/portage/metadata/layout.conf mkdir -p /usr/local/portage/dev-util/cxxtest/ cd /usr/local/portage/dev-util/cxxtest/ wget http://gpo.zugaina.org/AJAX/Ebuild/2578437 -O cxxtest-3.10.1.ebuild ebuild cxxtest-3.10.1.ebuild digest emerge cxxtest
iwlist scan perl wrapper
The output of /sbin/iwlist scan is too much for me in most of the cases: I just want to know which WiFis are present, quality and open/passneeded state.
So here is a small perl script for it, the ESSIDs printed in descending order of quality which changed from 1-70 to 1-100.
#!/usr/bin/perl use warnings; use strict; open(LIST, "/sbin/iwlist scan 2>&1 |") or die "Failed: $!\n"; my %wifis; my $essid; while () { if (/ESSID\:\"(.*)\"/) { $essid = $1; } elsif (/Quality=(\d*)\/70/) { $wifis{$essid}->{"quality"} = $1; } elsif (/Encryption key\:(\S*)/) { $wifis{$essid}->{"key"} = $1; } } sub by_quality { $wifis{$b}->{"quality"} <=> $wifis{$a}->{"quality"}; } print "\n"; foreach $essid ( sort by_quality keys %wifis) { printf '%*s %*s %-d', 30, $essid, 6, $wifis{$essid}->{"key"}=~/on/? "Pass" : "Open" , int($wifis{$essid}->{"quality"}) / 70.0 * 100; print "\n"; } print "\n";
A sample output I got at my flat:
cs0rbagomba@ramen ~ $ wifi_list
gara_dlink Pass 71
TP-Link01 Open 54
zaa Pass 50
DBnet Pass 50
anzo Pass 47
3Com Pass 22
TP-LINK_9D27F4 Pass 21
TP-LINK_TOMEC Pass 21
TNT Pass 17
TimeCapsule Pass 15
hpsetup Open 14
Pannon Cargo Pass 12
Airlive Pass 10
TP-LINK_DA3008 Open 10
Open 8
Szeretetre melto internet Pass 8
KZSNET Pass 8
CEO_iroda Pass 8
Vani2 Pass 5
GIGABYTE Open 4
csikos Pass 2
TP-LINK_E6395C Pass 2
Dante_88 Pass 2
RG60SE Open 2
default Open 2
WIFI99 Pass 1
Zsoka Pass 1
IKO Pass 1
cs0rbagomba@ramen ~ $
PS: TP-Link01 Open - sharing is caring 🙂 default settings rulz
pdfnup: print 2 pages in 1 sheet
When I want to print 2 pages in 1 sheet, the contents of the pages become too small: inside the margin of the sheet, the 2 pages keep their margins too.
There is a nice tool called pdfnup (part of pdfjam), which not only help us get rid of the margin problem, but we can trim, shift and do whatever we want with a pdf document to create a more readable new one.
When I print books, most of the time this line is enogh:
pdfnup --nup 2x1 --paper a4paper --noautoscale true --outfile output.pdf input.pdf
There was only one case when some fine calibration was needed:
pdfnup --nup 2x1 --paper a4paper --trim '4.5cm 3.5cm 4.5cm 3.5cm' --outfile output.pdf input.pdf