Se afișează postările cu eticheta linux. Afișați toate postările
Se afișează postările cu eticheta linux. Afișați toate postările

19 feb. 2013

Cross-Compilarea și rularea Win32 pe siteme Unix-like

Intro

    Utilizând un sistem de operare Unix-like, nu e prea mare plăcăre, ca în scopuri educative, să-ți părăsești, măcar  mediul pentru a utiliza Win32 API. Totuși, există posibilitatea de cross-compilare, față de care mulți sunt sceptici. În orice caz, compilez strict în scopuri educative, fără a reutiliza binarele în altă parte.


Necesitate

    Studiind cursul de "Event-Driven Programming on Win32 API", ar fi trebuit să-mi trag o mașină virtuală cu oarecare Windows și să-mi ridic tot environmentul meu preferat pe acea mașinică virtuală, ceea ce nu mi-a părut cea mai bună idee la prima vedere, dar e o ieșire din situație și asta.


Cerințe

Notă:  În distribuțiile linux veți găsi de obicei pachete precompilate cu mingw32-gcc și wine.


Utilizare


Compilăm în linia de comandă:
i386-mingw32-gcc -mwindows file.c -o file.exe

Executăm din linia de comandă:
wine file.exe

Ce poate fi mai simplu? ; )
În dependență de mediul de instalare și variabila $PATH probabil să fie necesară rularea compilatorului prin path absolut, sau ajustarea variabilei $PATH.
Plus, dacă utilizezi vim, poți mapa compilarea și executarea, unui shortcut, cum am făcut-o eu:
nmap <F8>:<C-U>!i386-mingw32-gcc -mwindows %:r.c -o %:r.exe && wine %:r.exe<CR>



Outro

    Utilitatea Cross-compiling-ului este extrem de mare. La fel putem compila produse spre exemplu pentru arm, sau oricare altă arhitectură de destinație. Acum poți compila același cod practic pe orice mașină.
    Happy programming!

7 apr. 2011

Cum mi-am customizat linia de comandă sub linux...

   Salut! Astăzi voi scrie despre felul în care mi-am "construit" linia de comandă după gusturile și necesitățile mele.

1 .bashrc

   Așa cum, probabil știți că sunt iubitor de chestiuțe colorate în terminal, mi-am configurat promptul cu mai multe culori. Aici puteți găsi o listă de variabile și culori accesibile în bash, foarte util post pe archwiki. Spre exemplu, eu am inclus lista de variabile cu culori în .bashrc, și acum e mult mai simplu și lizibil codul, cu variabile în loc de secvențe escaped:
prompt_command ()
{
    local st=$?
    [ $st -eq 0 ] && \
    local p="${BBlack}>${Green}>${BGreen}>${Color_Off}" || \
    local p="${BBlack}>${Red}>${BRed}>${Color_Off}"
    PS1="\n   ${IPurple}(\t) ${Yellow}\u@\h ${IYellow}\w\n${Color_Off}${p} "
}
PROMPT_COMMAND=prompt_command
În secvența de mai sus, variabila $p e un string (>>>) ce ia culoare roșie (gradient improvizat) dacă comanda precedentă s-a executat cu vreo eroare și culoare verde dacă a mers ok. Controlul se face după variabila $?. În rest e usual stuff, colorat :]

2 git, git-completion și viață frumoasă

   De ceva vreme încoace, am descoperit și utilizez git-ul destul de activ. Primele impresii au fost pozitive, și totuși ceva mai lipsea... Fiind deprins cu subversion și în lipsă de autocomplete a comenzilor lui git, am făcut niște aliasuri, de genul: git co (git checkout, co luat din SVN), git ci (git commit) etc... Și totuși mai lipsea ceva... Spre exemplu, pentru a face checkout la un alt branch, trebuia întâi să listez toate branch-urile ca abia apoi să găsesc ceea ce-mi trebuie și să fac checkout etc.
   La un moment dat, m-am gândit că pot să-mi fac un script care să se ocupe de asta, și să facă aceste lucruri pentru mine, și, când colo, am dat de un lucru gata făcut! git-completion! bingo! Tot ce trebuie să faci e:
wget http://github.com/git/git/raw/master/contrib/completion/git-completion.bash -O ~/.git-completion.bash
și apoi să adaugi în .bashrc linia:
source $HOME/.git-completion.bash
Tadam! Acum ai autocompletion! (apropo, fraza asta mi-a adus aminte de sloganul de anul trecut de la PublikaTV, și anume: "Moldova, acum ai televiziune!". Ei da evenimentul nostru e mai important.)

   Odată cu autocompletion, a venit și colorarea la git diff, și câteva funcții predefinite. Una din ele, o să o examinăm aici. Funcția dată are numele de __git_ps1(), și se poate include în $PS... eu am pus-o înainte de newline, și dacă sunt în directorie cu repozitorie git, îmi arată, branch-ul curent, și starea lui, dacă e modificat și nu e făcut commit îmi marchează cu * branc-ul. Până la urmă, după diverse șlefuiri, command prompt-ul îmi arată așa:
PS. ce-mi mai trebuie? un GNU screen, vim, htop, moc, mc, mplayer, rtorrent(color) și sunt sigur că terminalul nu o să se plictisească... ;D

24 mar. 2011

Light HTTP Server în 10 secunde

  Bună dimineața dragă cititorule!
  Dorești să faci share la careva fișiere, sau pur și simplu să testezi un micro server HTTP? Utilizezi linux ca sistem de operare? Ai python, preinstalat? Nimic mai simplu! Mergi în directoria pe care o dorești să fie setată ca server root:
  cd /calea/spre/directoria/dorită
Și execută comanda:
  python -m SimpleHTTPServer
  Acum tot ce este în acea directorie, e accesibil pe adresa http://localhost:8000 sau http://127.0.0.1:8000 de pe calculatorul gazdă, și de pe http://[ip-ul real]:8000 (în caz că nu este vreo aplicație ce restricționează accesul pe portul dat). IP-ul ce poate fi privit din extern se poate afla ușor mergând pe pagina: http://www.whatismyip.com/.

  Prin urmare totul se rezumă la o comandă, foarte utilă și comodă în cazurile expuse mai sus în locul serverelor Apache ș.a...

ps. python-ul de obicei este instalat odată cu sistemul de operare.
pps. teoretic această comandă ar trebui să funcționeze și pe w$, dar nu am testat și nici nu m-am documentat în domeniu, pot să zic una, merge perfect prin cygwin de pe windows :]

Nota Bene: Despre acest feature am citit vreo jumătate de an în urmă pe blogul lui Marius Voilă.

UPD: Dacă aveți instalat și python 3, atunci executați
  python2 -m SimpleHTTPServer
pentru că în python3 SimpleHTTPServer a fost comasat cu BaseHttpServer, și utilizarea acestuia e puțin diferită, probabil o să-l iau ca motiv să mai scriu vre-un blogpost mai detaliat pentru acesta.

25 nov. 2010

Posting with GoogleCL Tools

aekamon! it works! :D
Google Command Line tools rawks ;D
Get it here, or simply install binaries from your repository, aka python-gdata & googlecl.

9 oct. 2010

(Bash) Divizarea fișierelor audio lossles și conversia lor în format mp3

   Iată că într-o bună zi am copiat toată discografia formației Pixies în format mp3, o calitate strașnic de proastă. Nu m-am gândit mult și am făcut rm -rf ./Pixies\ Discography de pe calculator. Am copiat în schimb aceiași discografie în format lossles, și anume flac sub forma de imagini .cue cu referință la un singur fișier flac per album. Pe device-urile mobile flac e imposibil de folosit, plus că și are o dimensiune alogică pentru un aparat de buzunar, deci ieșirea din situație e conversia. În cazul nostru o simplă conversie din flac în mp3 e imposibilă pentru că toate piesele dintr-un album sunt comasate într-un singur fișier.
   Însă ăsta nu e sfârșitul, ne vin în ajutor mai multe instrumente special concepute pentru divizare/editare a tagurilor/conversie a formatul lossless. Avem nevoie de următoarele tools-uri: cuetools, shntool, flac, lame, mp3info, și altele (gen: grep, sed, id3v2) care deja la sigur sunt instalate.
   Studiind man-page-urile acestor tools-uri am creat un mic scriptuleț în bash pe care l-am numit flac2mp3 și se execută ca ./flac2mp3 /calea_spre_flac /calea_spre_cue și își face treaba singurel mai departe.
#!/bin/bash
F_FILE=$1
C_FILE=$2

if [ ! -r "$F_FILE" -o ! -r "$C_FILE" ]
 then 
  echo "Can't read file $F_FILE or $C_FILE" >&1
  exit 1
fi

cuebreakpoints "$C_FILE" | shnsplit -o 'cust ext=mp3 lame -b 320 --vbr-new -V 0 --quiet - %f' "$F_FILE"

cuetag.sh "$C_FILE" split-track*

for i in split-track*.mp3
 do TITLE="`id3info "$i" | grep '^=== TIT2' | sed -e 's/.*: //g'`"
 TRACKNUM="`id3info "$i" | grep '^=== TRCK' | sed -e 's/.*: //g'`"
 mv -v "$i" "$TRACKNUM - $TITLE.mp3"
done

echo "Done!"
   Lucrul lui constă din câțiva pași foarte simpli, pe care o să încerc să-i explic mai jos:
- scriptul încearcă să determine dacă fișierele .cue și .flac există și dacă există permisiunea de a le citi;
- cuebreakpoints determină intervalele pe care sunt plasate piesele;
- shnsplit divizează acel fșier .flac și îl convertează automat în mp3 prin tool-ul lame;
- cuetag.sh extrage id3 info din .cue și o distribuie fișierelor mp3 proaspăt create
- și în sfârșit, pentru a nu lăsa denumirile urâte gen split-trackXX.mp3, încercăm să le redenumim folosind informația din id3 tags. Numele finale e de forma tracknum - title.mp3
   În cazul meu am băgat încă 2 linii în script pentru a determina timpul de execuție a lui. La început: start_time=$(date +%s);, ce ia valoarea numărului de secunde începând cu 1970-01-01 00:00:00 UTC ;] și la sfârșit am băgat echo "Script execution time: $(($(date +%s) - start_time)) secs.";. În 85 secunde am convertat un flac de 140MB și am obținut 8 fișiere mp3 pe un netbook. Un rezultat foarte bun, IMO ^_^
ps. Noapte bună ;D

31 iul. 2010

(Bash) Redimensionarea imaginilor în masă

   Vre-un an și ceva în urmă, pe când nu aveam mare idee despre bash, citisem pe blogul lui Adrenalin articolul "Cum De Redenumit Fișiere În Masă?", la acel moment nu prea mă interesau așa chestii, însă acum îmi dau seama cât sunt de utile ;]
   Astăzi, doream să bag niște poze pe foto.torrentsmd.com, dar mi'am dat seama repede că acel motor de gestionare a imaginilor (4images) nu vrea să'mi accepte imaginile originale și să le redimensioneze așa cum îi place lui, deci am luat repede hotărârea să redimensionez local imaginile fără să pierd mult timp ;D. Pentru asta, desigur, am scris repede un scriptuleț în bash. În primul rând ne trebuiește mogrify, tool din ImageMagick.
cd /calea/spre/directoria/cu/fotografii
mkdir ./resized
for i in *.JPG;
do cp "$i" ./resized/"$i";
mogrify -resize 900x600 ./resized/"$i";
echo "$i" redimensionat;
done;
   În mai puțin de 10 minute, scriptul a redimensionat, totodată păstrând copia originală peste 450 fotografii a câte 4-8MB fiecare, dar voi, în cât timp avea s'o faceți manual? ^_^
   Deasemenea e posibilă redimensionarea după procentaj sau unul adaptiv bazat pe triangulație, plus încă o mulține de features ale lui mogrify, mai multe detalii: man mogrify
   ps. bash-ul e accesibil și în windows sub cygwin, diskurile sunt montate virtual în /cygdrive. Lucru tare, încercați și voi.