26 aprilie 2014

Crawling a site with Goutte (php)

Crawling with redirects: NCBI website for aligning protein - Aceasta este o alternativa la instalarea simandicosului Blast si a seturilor de date care ocupa foarte mult spatiu, prin punerea in "carca" a tuturor operatiilor pe seama interfetei de la NCBI pentru alinierea secventelor de proteine.

Crawling-ul are particularitatea de a urmari redirect-urile, putin deranjante la rularea manuala pe site, dar putin mai explicite odata ce Javascript este dezactivat din browser. Crawlerul, by default, are javascript dezactivat, deci el primeste rezultatele corect indiferent de redirectari. Input-ul ales este o secventa de aminoacizi numita hemoglobina, iar rezultatele reprezinta o lista de posibile alinieri.

--------------------------------------------------------------------
require_once 'goutte.phar';
use Goutte\Client;

$aaTest = "MHSSIVLATVLFVAIASASKTRELCMKSLEHAKVGTSKEAKQDGIDLYKHMFEHYPAMKKYFKHRENYTP
ADVQKDPFFIKQGQNILLACHVLCATYDDRETFDAYVGELMARHERDHVKVPNDVWNHFWEHFIEFLGSK
TTLDEPTKHAWQEIGKEFSHEISHHGRHSVRDHCMNSLEYIAIGDKEHQKQNGIDLYKHMFEHYPHMRKA
FKGRENFTKEDVQKDAFFVNKDTRFCWPFVCCDSSYDDEPTFDYFVDALMDRHIKDDIHLPQEQWHEFWK
LFAEYLNEKSHQHLTEAEKHAWSTIGEDFAHEADKHAKAEKDHHEGEHKEEHH";
$link = 'http://blast.ncbi.nlm.nih.gov/Blast.cgi?PROGRAM=blastp&BLAST_PROGRAMS=blastp&PAGE_TYPE=BlastSearch';

//create a new client instance
$client = new Client();

// connect to main page
$crawler = $client->request('GET', $link);
$form = $crawler->selectButton('b1')->form();
$crawler = $client->submit($form, array('QUERY' => $aaTest));

// arrive on second page, has the requestId too
$secondForm = $crawler->filter('form[name=RequestFormat]')->form();
$rid = $secondForm['RID'];
$crawler = $client->submit($secondForm);

//echo "The RID is " . $rid->getValue();

// arrive to the 3rd page on, post on Blast.cgi script
$redirects = 0;
while ($redirects < 50) { // set a max number of acceptable redirects
$nextForm = $crawler->filter('form[id=results]')->form();
sleep(3);
$crawler = $client->submit($nextForm);

// stop when there is a <div id=descrInfo/> in the page meaning final results
$cnt = $crawler->filter('div[id=descrInfo]')->count();
if ($cnt > 0) {
break;
}
$redirects += 1;
}

echo "Redirects ---->>> " . $redirects;
echo $crawler->html(); // pagina finala

17 aprilie 2014

Position weight matrix | detecting binding sites in the promoter region

Cum se creează matricea PWM:
Vrem să detectăm poziții de legătura (binding sites) în genom. Pentru a maximiza probabilitatea de a găsi poziții de legătură într-o secvență, se folosește odd ratio (OR).
Odd ratio = ... = α + ∑ log (x/y) , unde x = P(sequence[i] | binding site), y = P(sequence[i] | ⌐binding site), constanta α = P(binding site) / P(⌐binding site).
x se află din matricea de frecvență a motivului (în care secvența are N caractere, jaspar), y din probabilitățile de fundal (background probability) din fișierul de upstream*.fa .
PWM este matricea formată din valorile pentru odd ratio, în care numărul de coloane este 4, pentru variantele de nucleotide {a, c, g, t}, iar numărul de linii corespunde dimensiunii motivului (1 ≤ i ≤ N).

Cum se detectează pozițiile de legătură:
Se va scana din nou fișierul de upstream, folosind o fereastră glisantă cu dimensiunea N, și pentru fiecare porțiune selectată se calculează scorul adunând valorile corespunzătoare din PWM. Dacă scorul depășește un anumit prag prestabilit, se consideră un binding site.

Aplicație:
Motivul ales este FOXC1, iar genomul este cel pentru mm10 (șoarece).
Se parcurge upstream1000.fa pentru șoarece pentru a calcula probabilitățile de fundal, apoi cu motivul lui FOXC1 se creează matricea PWM. Apoi se scanează upstream din nou pentru a afla pozițiile de legătură. Luând ca prag minim un scor = 2, am afișat mai jos histograma tuturor scorurilor, care seamănă cu curba lui Gauss - iar cele mai des întâlnite scoruri totale sunt între 5 și 7. Numărul total de secvențe al căror scor depășește pragul este în jur de 242.000 , din peste 30.000 gene scanate .


  Sursa cod AICI

14 aprilie 2014

Primul meu spyware -- un keylogger, în Windows 7

Aveți nevoie de: Perl instalat, o pagină personală de internet care să suporte cereri de tip http POST
Unelte folosite aici: Dev C++, Perl (strawberry package), Google App Engine, instsrv.exe & srvany.exe

Idee: Un keylogger ascultă tot ceea ce utilizatorul tipărește prin tastatură și salvează datele respective spre prelucrare. Acesta este în principiu util pentru spionat, interceptat date „confidențiale” ș.a.m.d .

Programul efectiv care ascultă ce s-a tastat este scris în C++ , sursa lui a fost preluată de pe internet și se poate vedea AICI . Sursa se compilează și se execută rezultând un fișier exe. Dacă pur și simplu rulăm executabilul, el va asculta butoanele tastate și le va transfera într-un fișier de log.
Pentru a avea acces la acest fișier de la distanță, un script care rulează „periodic” va citi aceste loguri și le va trimite prin internet. Scriptul realizat de mine este în Perl, citește fișierul de log, îl curăță (trunchiază) și trimite conținutul prin POST către o pagină web - pagina aleasă de mine conține un câmp mare de text care se poate vedea AICI . După http POST, pagina trimite textul primit către o adresă de email setată de mine (dar el se poate la fel de bine salva într-o bază de date personală pentru a nu deranja).
Scriptul în Perl va trebui să ruleze ca un serviciu în Windows, iar logger-ul propriu-zis trebuie de asemenea pornit la fiecare restartare a calculatorului. Pentru rularea scriptului în Perl ca serviciu o explicație pe larg se poate citi AICI. Pentru fișierul exe, el va porni singur ca un proces odată cu restartarea calculatorului dacă îl copiem în Startup (detalii AICI).

Mai multe detalii despre rularea efectivă pe propriul calculator (sau cel al prietenilor :) puteți citi în README.

sursa cod spyware: AICI

03 aprilie 2014

My first Ruby on Rails app & GIT configuration

After Rails is installed:
> rails server

> rails new blog
> cd blog
> rails generate scaffold post title:string body:text
> rails generate scaffold comment post_id:integer body:text
> rake db:migrate

> rake routes
localhost:3000/posts#index

--------------------------------------------------

GIT commands:
Create new local rep.
> git init
Connecting it to remote repository
> git remote add origin <http-link-remote-rep> ***
Config. username & email
> git config --global user.name "Boomblebee"
> git config --global user.email "mail2...@gmail.com"
Pushing for the first time
> git push origin master

Working dir -> staging area
> add .
Staging area -> local GIT rep.
> commit -m "My message!"
Working dir -> local GIT rep.
> commit -a
Local GIT rep. -> working dir.
> checkout <branch>
> merge <branch>
Check synchronize & the branch you are in
> git status

Local GIT rep -> Remote GIT rep
> push <remote> <branch>
Remote GIT rep -> Local GIT rep
> fetch
Remote GIT rep. -> Working dir.
> pull <remote>  or  clone <remote>

_____________
*** github.com ; bitbucket.org

Quick fix: recuperare bare (panels) in Ubuntu

Cand nimic nu mai merge, si nici terminalul nu se mai deschide:
CTRL+Alt+F6
sudo apt-get install ubuntu-desktop
CTRL+Alt+F7