Szkriptek: Python, Perl, Bash, ...

[solved] - perl változó változó értéke

Szervusztok!

Először is a tárgyat próbálnám kifejteni, lehet hogy van jobb megfogalmazás rá, röviden nekem most így sikerült, bocs!
Amennyiben javasoltok jobbat cserélem. ;)

Szeretnék egy debug felületet készíteni a perl tákolmányomhoz, ami a globális változókat meg tudná jeleníteni úgy, hogy a nevét ha beírom, megmutatná az értékét.
Gondoltam beolvasom egy readline-al, megcsonkolom egy chomp-al, majd amennyiben van ilyen, akkor vissza adom az értékét.
Az utolsó mozdulat nem megy, pontosabban csak részlegesen,mert pl. az ORS-re, valamint az RS pl. működni látszik.
Miképp lehet ilyet készíteni?
Most itt tartok:


#!/usr/bin/perl

#use	strict;
use	utf8;
use	locale;
use	English;
use	warnings;
$ORS="\n";
my $c=0;
my $test = qq/happy/;
my $line = "";
while(1)
	{
	$c++;
	$line = readline(*STDIN);
	if(defined $line) {
		if($line =~ /^exit$/){exit;}
		chomp $line;

		printf("->%s-<\n",${$line});	#RS, ORS, stb-re működik!
		}
	}

Köszönöm előre is!
Üdv,
vf

[Megoldva] A $REPLY értéke elromlik

Nézzük az alábbi scriptet:

#!/bin/bash

outext='mp4'

conv() {
    ffmpeg -i "$1" -an -vcodec copy "$2"
}

while read; do
    inext="`tr '[:upper:]' '[:lower:]' <<<"${REPLY##*.}"`"
    [ x"$inext" != x'mov' ] && continue
    outfile="${REPLY%.*}.$outext"
    conv "$REPLY" "$outfile"
done < <(ls -1)
exit 0

Azt most hagyjuk, hogy semmiféle ellenőrzés sincs benne, ideiglenesen kell. Ami számomra meglepő, hogy az alkönyvtárból csak néhány file-t konvertált. Kiírattam a $REPLY változót, az első file-nál jó volt a neve, utána viszont a filenevek első betűje hiányzott többnyire, de volt, hogy több is. A filenevek MVI_2193.MOV alakúak, tehát sem szóközök, sem ékezetes betűk nincsenek bennük. Azt tapasztaltam, hogy ha kikommentelem az ffmpeg-et, akkor jók lesznek a nevek. Olyan, mintha az ffmpeg elrondítaná az őt indító shell memóriáját. Ezt ugyan lehetetlennek gondolom, hiszen szerintem nem azonos process-ek.

Próbálkoztam process substitution helyett pipe-pal, illetve azzal, hogy a filelistát ideiglenes file-ba írom, majd az ideiglenes file-t irányítom a ciklusba, mindegyik megoldás esetén ugyanaz volt a hiba. A REPLY változót rögtön a ciklusmag elején átírtam egy REP változóba, de már itt sérült volt a file-ok neve. Próbálkoztam azzal is, hogy az ffmpeg-et subshellből indítottam, azaz kerek zárójelek közé tettem a paramétereivel együtt. Ez sem segített.

Ugyanakkor a

for REP in *; do ciklusmag done

alak működik jól.

Ez valami bug, vagy valamit nagyon benézek, nem tudok? Hogyan romolhat el egy változó látszólag ok nélkül?

Megoldás (köszönet érte Zahy mesternek):

Az ffmpeg az stdin-ről olvas olykor, így lenyúl néhány karaktert a read elől. Ezért le kell erről beszélni az ffmpeg-et:

ffmpeg -i "$1" -an -vcodec copy "$2" </dev/null &>/dev/null

Vagy lehet így is:

ffmpeg -nostdin -i "$1" -an -vcodec copy "$2" &>/dev/null

Javascript kérdés

Sziasztok,

Egy kérdésem lenne javascript-el kapcsolatban:

var str="The rain in SPAIN stays mainly in the plain";
var n=str.match(/in/gi);

Eredmény:
in,in,IN,in,in,in

A feladat az lenne, hogy a SPAIN kezdettel és ami mögötte van azt hagyja figyelmen kívül az eredményből.

Eredmény:
in,in

python 2 vagy 3, virtualenv, apache2

Sziasztok!

Vagrant virtualbox (ubuntu 12.04) alá próbálok pythont és django-t tenni. A dolog sikeres is abban az esetben ha a gyári 2.7-es pythont használom. Tökéletesen működik, megy az apache, mysql, saját webszerver, pip-pel a django, minden ok.

Viszont:
Keresgélés után sem jöttem rá, hogy tudom a bulit-in 2.7-est a legfrissebb 2-esre cserélni.
Forrásból kellene fordítani, valamilyen ppa-t használni?

Ha a 2.7-es mellé telepítem a 3-ast, akkor virtualenv-el tudok váltogatni, de apache-al (mod_wsgi) csak a 2-es megy.
Ha a mod-wsgi-t cserélem le a 3.3-ashoz valóra (libapache2-mod-wsgi-py3), akkor a 2-est nem tudom tovább használni.

Php-hez a phpbrew-t használom, hogy tudjak verziókat váltogatni. Találtam pythonbrew-t, de nem hiszem, hogy megoldja az apache2 mod_wsgi problémáját.

Kezdőként a 2-es vagy a 3-as használatát javasoljátok?
Van értelme több verziót kipróbálni/használni?

Hogy érdemes csinálni? Használjam fejlesztéshez a beépített webszervert?
Külön vm kell verziónként ha apach alatt megy, vagy korrekt megoldás a wsgi modulok egymás mellett használatára (az lenne az igazi, ha projektenként külön tudnám állítani a python verziót)?
Mi a helyzet mysql driverrel? 2-es alatt megy, de a 3-asról azt olvastam nem túl friss postokban, hogy nem megoldott 100%-ig a dolog.

Egyenlőre az egész csak tanuláshoz kell, de egy-egy kisebb appot kitennék élesbe is, ezért kellene az apache.

Köszi

Script probléma (tcpdump) - S.O.S.... !

Az alábbi script jött össze (a lényege, hogy adott paraméterekkel dumpokat készítsen tcpdump-pal).
Nagyon sürgős lenne vele elkészülnöm és két pontban totál elakadtam.

Az egyik: a $WORKDIR változó mindig üresen marad, hiába adom meg az indításnál a paraméterét (ahová mentse a dump file-okat)

A másik: a tcpdump parancs (a script forráskód vége felé) folyton beleköt valamibe, próbáltam betartani a gyári paraméter sorrendjét (lényeges-e ez egyáltalán ?), de rendszerint ilyesmit kapok:
-G: invalid packet count (ezt a -c opció után, azaz legjobb meglátásom szerint a -c után kapott számot és az azt követő -G kapcsolót egy paraméternek akarja venni és mivel a "-G" nem szám, hibát dob...)
Valaki le tudná nekem ellenőrízni és segíteni/kijavítani ? Mit csináltam rosszul ?
Ezer hála előre is !

(Szerk. Közben felfedeztem, hogy egyetlen változóban sem tárolja el az értéket...azaz mégsem veszi át a paramétereket értékeit
i) INTERFACE=${OPTARG};; #halozati interface valasztas
r) REPEAT_TIME=${OPTARG};; #milyen gyakran kezdjen uj file-t
w) WORKDIR=${OPTARG};; #hova mentse a dumpfile-okat
m) MAXFILES=${OPTARG};; #maximum hany dump file-t tartson meg
Ezek mind tök üresek, csak a while loop-ban tudom kiíratni az értékeiket. Mi lenne a megoldás ? :S)

A script:

#!/bin/bash
while getopts i:r:w:m: option
do
case "${option} "
in
i) INTERFACE=${OPTARG};; #halozati interface valasztas
r) REPEAT_TIME=${OPTARG};; #milyen gyakran kezdjen uj file-t
w) WORKDIR=${OPTARG};; #hova mentse a dumpfile-okat
m) MAXFILES=${OPTARG};; #maximum hany dump file-t tartson meg
esac
echo "Aktualis param: $option "--" $OPTARG" #debughoz
done
echo "Working directory: $WORKDIR" #ez valamiert mindig ures marad !
sudo tcpdump -i $INTERFACE -G $REPEAT_TIME -c $MAXFILES -w "/trace_%Y-%m-%d_%H:%M:%S.pcap"
exit 0

Perl MIME::Lite text/plain probléma

Sziasztok!

Perl MIME::Lite-al szeretnék levelet küldeni, ami tartalmaz egy szöveges és egy html részt, valamint néhány kép csatolmányt, amikre a html-ből a cid:image névvel hivatkozom.

Egyelőre Thunderbird-el tesztelem a leveleket, a html rész tökéletesen jelenik meg, viszont mikor plain text nézetre váltok, akkor nem az általam küldött szöveges tartalom jelenik meg, hanem a html tartalomnak egy butított formája, amit nem teljesen értek, mert a levél forrásában benne van az általam küldött szöveges tartalom.

A kód, amivel próbálkozom:


$msg = MIME::Lite->new(
From => $felado,
To => $kuldo,
Reply-To => $felado,
Subject => "Proba",
Type =>'multipart/alternative',
);
$msg->attr('content-type.charset' => 'UTF8');

$msg->attach(
Type => 'text/plain',
Data => $text,
Encoding => 'quoted-printable',
);

my $att_html = MIME::Lite->new(
Type => 'multipart/related',
);

$att_html->attach(
Type => 'text/html',
Data => $html,
Encoding => 'base64',
);

$att_html->attach(
#Encoding => 'base64',
Type => 'image/jpg',
Id => 'proba1.jpg',
Path => $mail_images.'/proba1.jpg',
#Disposition => 'inline',
Content-Location => 'cid:proba1.jpg',
);

$msg->attach($att_html);

$msg->send();

Már próbáltam mindenféle variációban és kódolásokkal küldeni, de sehogy nem sikerült megoldanom a problémát.

Ha valaki tud segíteni, azt előre is nagyon köszönöm.

Zoli

bat file vagy Wbscript

Sziasztok!
Egy kis segítséget kérnék, bat file vagy Wbscript filet kellene létrehoznom ami az alábbiakat csinálja:
%userprofile% könyvtárból a documents, desktop, favorite könyvtárakat kimásolja vagy mozgatja a c:\ment\-be .
De!
Egy rakat gépnél a documentum, asztal, kedvencek szerepelnek, hogyan tudok feltételes módba berakni, hogy ha a "%userprofile%\my documents" könyvtár hibaüzenetet ad ki akkor próbálja meg a "%userprofile%\dokumentum" - könyvtárat.
Válaszokat köszönöm!

Perl - modul telepítés

Sziasztok!

Adott egy Kubuntu 12.04, azon pedig perl-ben szeretnék kódolni. Szeretném telepíteni pl a Device::USB modult, de állandóan errort kapok.

cpanm Device::USB

--> Working on Device::USB
Fetching http://www.cpan.org/authors/id/G/GW/GWADEJ/Device-USB-0.35.tar.gz ... OK
Configuring Device-USB-0.35 ... N/A
! Configure failed for Device-USB-0.35. See /root/.cpanm/work/1379519726.6244/build.log for details.

a build.log tartalma pedig
panm (App::cpanminus) 1.7001 on perl 5.014002 built for x86_64-linux-gnu-thread-multi
Work directory is /root/.cpanm/work/1379519726.6244
You have make /usr/bin/make
You have LWP 6.03
You have /bin/tar: tar (GNU tar) 1.26
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later .
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by John Gilmore and Jay Fenlason.
You have /usr/bin/unzip
Searching Device::USB on cpanmetadb ...
--> Working on Device::USB
Fetching http://www.cpan.org/authors/id/G/GW/GWADEJ/Device-USB-0.35.tar.gz
-> OK
Unpacking Device-USB-0.35.tar.gz
Entering Device-USB-0.35
Checking configure dependencies from META.yml
Checking if you have ExtUtils::MakeMaker 0 ... Yes (6.76)
Configuring Device-USB-0.35
Running Makefile.PL
Can't locate Inline/MakeMaker.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at Makefile.PL line 3.
BEGIN failed--compilation aborted at Makefile.PL line 3.
-> N/A
-> FAIL Configure failed for Device-USB-0.35. See /root/.cpanm/work/1379519726.6244/build.log for details.

Kezdő vagyok a perl-ben, szóval nem tudom mi az igazán haszos infó nektek, inkább több mindent bemásoltam ide.

oncall rota script

Sziasztok!

Az érdekelne, hogy létezik e olyan kész megoldás, ami egy csapat on-call rotációjának a beosztását számolja ki. Jól konfiguráljható, pl tagok hozzáadása, beosztás ad-hoc változtatása, több on-call ember beállítása, megjelenítés, ilyesmi igények lennének. Perl vagy Python lenne az igazi, de más megoldás is érdekel.

Persze én is megírnám, ha lenne rá időm (az oncall mellett:)

köszi előre is minden tippet!

reguláris kifejezés kérdés

Sziasztok, erre keresem a választ:

Egy ilyen sorból szeretnék kinyerni információt python re-vel.

PokerStars Hand #108676382374: Tournament #773523571, $6.71+$0.29 USD Hold'em No Limit - Match Round I, Level I (10/20) - 2013/02/11 3:07:34 CET [2013/02/11 21:07:34 ET]
A hand száma 108676382374
A tournament id-je: 773523571
A limit: $6.71+$0.29
A szint: (10/20)
A dátum: 2013/02/11 3:07:34 CET

Kerestem, de sehol sem találtam példát, hogy hogy tudom ezeket úgy matcheltetni, hogy groupdict()-tel el tudjam név szerint érni az elemeket.

Ha valakinek van ideje rá, megköszönném a segítséget.