WxWIDGETS INSTALL:
Download the latest wxWidgets pack 2.9.x, not 2.8.x
cd to the root folder and create new build folder with
mkdir build-carbon
cd build-carbon
../configure --with-osx_cocoa --with-macosx-version-min=10.7
--with-macosx-sdk=/Applications/Xcode.app/Contents/Developer/Platforms/
MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk
sudo make
sudo make install
ECLIPSE BUILD SETTINGS:
create new empty project with MacOSX GCC compiler
create new source file named main.cpp
right click Project-Properties-C/C++Properties-Preprocessor Include Path- CDT
Add - File System Path - and type
/usr/local/include/wx-2.9/
OK - Apply - and the Settings Entries should look like this:
right click properties- C/C++ Build- Settings -
MacOSX C++ Linker - Miscelanneous - Linker flags: `/usr/local/bin/wx-config --libs`
GCC C++ Compiler - Miscelanneous- other flags add `/usr/local/bin/wx-config --cppflags`
still under Settings, select Build Steps, and under Pre-Build Command type
mkdir -p wxHello.app/Contents/MacOS
Under Build Artifact, type as Artifact Name the name of your project - wxHello
and under OutPut Prefix write wxHello.app/Contents/MacOS/
under Run- Debug Settings click on New-C++ Application
Unselect box for "Select configuration using C/C++ Application"
Select Build Configuration as Debug
and in C/C++ Application type Debug/wxHello.app/Contents/MacOS/wxHello
Click "Apply" and make sure you build the project before running it.
C++ CGI for Ubuntu - quick start
1. Download, extract and install the latest cgi distribution from here: ftp://ftp.gnu.org/gnu/cgicc/
2. For Ubuntu users, the default cgi-bin folder is located under /usr/lib/cgi-bin.
Add this location to apache httpd.conf, and restart the server:
in httpd.conf file, save and exit gedit. Restart apache with
Optional:
You may test if cgi-bin folder is running under apache by testing it with a basic .php echo file.
3. Create a new .cc file wherever you like, let's say on Desktop, and type:
#include <iostream>
using namespace std;
int main ()
{
cout << "Content-type:text/html\r\n\r\n";
cout << "<html>\n";
cout << "<head>\n";
cout << "<title>Hello World - SECOND CGI Program</title>\n";
cout << "</head>\n";
cout << "<body>\n";
cout << "<h2>Hello World! This is my second CGI program</h2>\n";
cout << "</body>\n";
cout << "</html>\n";
return 0;
}
open Terminal, navigate to Desktop and compile demo.cc file using
$g++ demo.cc -o demo.cgi
Your build name is demo.cgi, and you may test it now with
$./demo.cgi
4. Move demo.cgi to cgi-bin folder with:
sudo cp demo2.cgi /usr/lib/cgi-bin
5. Go to http://localhost/cgi-bin/demo2.cgi to see your webpage.
$wget ftp://ftp.gnu.org/gnu/cgicc/cgicc-X.X.X.tar.gz
$tar xzf cgicc-X.X.X.tar.gz
$cd cgicc-X.X.X/
$./configure --prefix=/usr
$make
$make install
2. For Ubuntu users, the default cgi-bin folder is located under /usr/lib/cgi-bin.
Add this location to apache httpd.conf, and restart the server:
$sudo gedit /etc/apache2/httpd.conf
type
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>
<Directory "/usr/lib/cgi-bin">
Options All
</Directory>
in httpd.conf file, save and exit gedit. Restart apache with
$sudo /etc/init.d/apache2 restart
Optional:
You may test if cgi-bin folder is running under apache by testing it with a basic .php echo file.
3. Create a new .cc file wherever you like, let's say on Desktop, and type:
#include <iostream>
using namespace std;
int main ()
{
cout << "Content-type:text/html\r\n\r\n";
cout << "<html>\n";
cout << "<head>\n";
cout << "<title>Hello World - SECOND CGI Program</title>\n";
cout << "</head>\n";
cout << "<body>\n";
cout << "<h2>Hello World! This is my second CGI program</h2>\n";
cout << "</body>\n";
cout << "</html>\n";
return 0;
}
open Terminal, navigate to Desktop and compile demo.cc file using
$g++ demo.cc -o demo.cgi
Your build name is demo.cgi, and you may test it now with
$./demo.cgi
4. Move demo.cgi to cgi-bin folder with:
sudo cp demo2.cgi /usr/lib/cgi-bin
5. Go to http://localhost/cgi-bin/demo2.cgi to see your webpage.
Programare orientată pe obiecte: Java - pachete, clase, metode și proprietăți
Teoretic, voi urma aceleași puncte de interes ca în cazul lecției despre ActionScript.
Voi folosi ca IDE, Eclipse-ul, pentru că e OpenSource iar pentru exemplele de mai jos este numai bun.
Deschideți deci Eclipse, selectați File-New Project-Java-Java Project, dați un nume, gen "TutorialObiecteJava", salvați-l pe desktop și dați "Finish".
Dați click dreapta pe folderul "src" - și deocamdată creați o nouă clasă, asigurându-vă că bifați opțiunea "public static void main(String [] args)".
Acum o să aveți următorul cod în pagină:
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
rețineți că java va compila numai ce se află în funcția "main(String[] args )". Pentru cei obișnuiți cu Actionscript va fi foarte dureros să constate că în Java nu există cuvântul "function". Fiecare metodă se declară direct cu "public void" sau "private int" sau "protected string".
Deocamdată clasa "Main" după cum vedeți nu are un constructor. Constructorii de clasă se declară simplu cu "public Constructor(){}", fără a mai pune void. Spre deosebire de Actionscript unde lucrurile functionează în ambele variante, în Java e foarte important să nu pui void după constructor. De ce? Pentru că în Java poți avea mai multe funcții cu același nume dar cu parametrii diferiți.
Adică poți face codul tău să arate cam așa:
public class Main {
public Main(){
System.out.println("constructorul lui Main");
}
public void Main(){
System.out.println("metoda Main");
}
public void Main(int valoare){
System.out.println("metoda Main cu int="+valoare);
}
public static void main(String[] args) {
Main main=new Main();
main.Main();
main.Main(2);
}
}
și să afișeze:
constructorul lui Main
metoda Main
metoda Main cu int2
Binețeles, dacă primește parametrii diferiți poți avea mai mulți constructori cu același nume la un singur obiect, de genul:
public class Main {
public Main(){
System.out.println("constructorul lui Main");
}
public Main(String parametru){
System.out.println("constructorul lui Main cu parametrul "+parametru);
}
public void Main(){
System.out.println("metoda Main");
}
public void Main(int valoare){
System.out.println("metoda Main cu int="+valoare);
}
public static void main(String[] args) {
Main main=new Main();
main=new Main("Hai noroc");
}
}
care va afișa:
constructorul lui Main
constructorul lui Main cu parametrul Hai noroc
public class Main {
private Mamifer mamifer;
public Main(){
System.out.println("generam clasa Main::");
}
public void arataAnimale(){
//metoda statica
Mamifer.definitie();
//instantiere
mamifer=new Mamifer("catel");
//setare publica
mamifer.setSunet("HAM");
//apelare publica
mamifer.faSunet();
//o noua instantiere
mamifer=new Pisica();
mamifer.faSunet();
}
public static void main(String[] args) {
/*
* instantierea si apelarea directă
* a unei clase nu este de obicei
* recomandată deoarece nu există un
* control direct asupra variabile generate.
* Ea este permisă de obicei în
* metoda main de compilare, doar dacă
* este singură.
* */
new Main().arataAnimale();
}
}
Voi folosi ca IDE, Eclipse-ul, pentru că e OpenSource iar pentru exemplele de mai jos este numai bun.
Deschideți deci Eclipse, selectați File-New Project-Java-Java Project, dați un nume, gen "TutorialObiecteJava", salvați-l pe desktop și dați "Finish".
Dați click dreapta pe folderul "src" - și deocamdată creați o nouă clasă, asigurându-vă că bifați opțiunea "public static void main(String [] args)".
Acum o să aveți următorul cod în pagină:
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
rețineți că java va compila numai ce se află în funcția "main(String[] args )". Pentru cei obișnuiți cu Actionscript va fi foarte dureros să constate că în Java nu există cuvântul "function". Fiecare metodă se declară direct cu "public void" sau "private int" sau "protected string".
Deocamdată clasa "Main" după cum vedeți nu are un constructor. Constructorii de clasă se declară simplu cu "public Constructor(){}", fără a mai pune void. Spre deosebire de Actionscript unde lucrurile functionează în ambele variante, în Java e foarte important să nu pui void după constructor. De ce? Pentru că în Java poți avea mai multe funcții cu același nume dar cu parametrii diferiți.
Adică poți face codul tău să arate cam așa:
public class Main {
public Main(){
System.out.println("constructorul lui Main");
}
public void Main(){
System.out.println("metoda Main");
}
public void Main(int valoare){
System.out.println("metoda Main cu int="+valoare);
}
public static void main(String[] args) {
Main main=new Main();
main.Main();
main.Main(2);
}
}
și să afișeze:
constructorul lui Main
metoda Main
metoda Main cu int2
Binețeles, dacă primește parametrii diferiți poți avea mai mulți constructori cu același nume la un singur obiect, de genul:
public class Main {
public Main(){
System.out.println("constructorul lui Main");
}
public Main(String parametru){
System.out.println("constructorul lui Main cu parametrul "+parametru);
}
public void Main(){
System.out.println("metoda Main");
}
public void Main(int valoare){
System.out.println("metoda Main cu int="+valoare);
}
public static void main(String[] args) {
Main main=new Main();
main=new Main("Hai noroc");
}
}
care va afișa:
constructorul lui Main
constructorul lui Main cu parametrul Hai noroc
(asta o puteți numi programare monoverbală - adică să folosești un cuvânt în tot codul)
1. Pachete
Dar haide mai bine să separăm lucrurile: dați click dreapta pe folderul "src" din proiect si creați un nou pachet: "lume.animale", iar în pachetul "lume.animale" adăugați clasa "Mamifer".
Observați că prima linie este
package lume.animale;
Pentru a importa în Main clasa Mamifer puteți folosi
import lume.animale.Mamifer;
fie cu wildcard, pentru tot pachetul:
import lume.animale.*;
Observați că spre deosebire de ActionScript, în Java pachetul nu trebuie marcat cu acolade.
2.Clase
Inițializarea unei clase se face după modelul:
Clasă variabilă=new Clasă();
adică
private Mamifer mamifer=new Mamifer();
iar clasa Mamifer, dupa modelul stabilit deja, poate avea următorul cod:
package lume.animale;
public class Mamifer {
static public String BIPED="biped";
private String numeMamifer;
private String sunet="nedefinit";
public int numarDePicioare=0;
protected int numarDeOchi=2;
public String getSunet() {
return sunet;
}
public String getNume() {
return numeMamifer;
}
public void setSunet(String sunet) {
this.sunet = sunet;
}
protected void faZgomot(){
System.out.println(numeMamifer +" face "+getSunet());
}
private void pregatire(){
System.out.println(numeMamifer +" se apleaca si face...");
}
public void faSunet(){
pregatire();
faZgomot();
}
public Mamifer(String nume){
if(nume==null){
numeMamifer="numeNedefinit";
}else{
numeMamifer=nume;
}
}
public Mamifer(){
numeMamifer="mamifer necunoscut";
}
public static void definitie(){
String definitie = "Clasă de vertebrate superioare care au corpul acoperit cu păr, nasc pui vii și îi hrănesc cu laptele lor";
System.out.println(definitie);
}
}
3.Proprietăți și metode private, parametrii impliciți
Observați că Mamifer are 2 constructori: astfel
new Mamifer() // va returna numele mamiferului "mamifer necunoscut"
new Mamifer("caine") // va returna numele mamiferului "caine", iar
new Mamifer(null) // va returna numele mamiferului "numeNedefinit"
dacă am fi renunțat la constructorul Mamifer() la instanțierea
new Mamifer() // codul ar fi aruncat o eroare de compilare, deoarece constructorul Mamifer(String nume) necesită cel puțin un parametru, caz în care programatorul este obligat să scrie între acolade un șir de caractere
Apropo: în Java, spre deosebire de ActionScript există o diferență fundamentală între ghilimele duble - "" și cele single: ''. Cele single se folosesc la variabile tip char, gen 'a', iar cele duble la String-uri, gen "aa". Cine știe puțin C e obișnuit cu diferențierea.
4. Proprietățile și metodele publice știm deja că pot fi apelate de oriunde, iar proprietățile pot fi schimbate cum vrem. Nici aici, și nici în ActionScript nu e posibil să suprascrii o metodă publică după instanțiere. (Rog specialiștii să nu râdă, și să aștepte lecția de Javascript)
5. După cum v-am spus, getteri și setteri sunt tot metode publice, și sunt tratate ca atare:
setSunet("ham") va face ca getSunet() să returneze "ham" iar getNume() va returna variabila privata definita de constructor. Din păcate, în Java nu avem cuvântul "get" ca să putem face metode pe care să le scriem ca pe variabile.
6. Metode și proprietății statice:
Simplu: pot fi apelate fără instanțiere: Mamifer.definitie(); sau System.out.println(Mamifer.BIPED);
7. Proprietățile și metodele protejate sunt accesibile numai claselor care extind clasa curentă. Deci haide să creăm clasa Pisică astfel:
La extindere, o clasa in Java ia automat proprietățile constructorului din clasa-mamă.
Pentru că Mamifer are un constructor fara parametrii, Pisica va moșteni acest constructor. Dacă comentăm codul
// public Mamifer(){
// numeMamifer="mamifer necunoscut";
// System.out.println("constructor fara string");
// }
din "Mamifer", o sa vedem că linia
new Pisica()
va arunca o eroare de genul
Implicit super constructor Mamifer() is undefined for default constructor. Must define an explicit constructor
Cred ca intelegeți ideea: orice clasa are nevoie de minim un constructor implicit, fie al ei, fie moștenit.
Să considerăm în continuare că Mamifer are un constructor implicit, deci Pisica nu mai are nevoie musai de un constructor. Dacă nu-i definim un constructor însă, Pisica nu va avea un nume prestabilit. La instanțiere numele ei nu va fi pisică, deoarece constructorii din Mamifer returneaza doar "numeNedefinit" și "mamifer necunoscut", iar proprietatea "numeMamifer" este privată. La "numarDeOchi" avem acces, deoarece este protejată, la fel și la "faZgomot()", dar nu și la "numeMamifer". Așa că suprascriem constructorul astfel:
public Pisica(){
super("pisica");
}
8. Polimorfism, ovveride și superiorizare:
Hai sa facem un experiment: scrieți în clasa Pisica codul ăsta:
public void faZgomot(){
System.out.println("miau");
}
Ce am făcut? Am creat functia publică faZgomot(). Cum așa? Păi în Mamifer nu există o funcție cu același nume și cu aceeași parametrii, doar că era protejată? Ba da... tocmai ce am suprascris-o, ba chiar am făcut-o și publică. Atenție însă, dacă îi schimb tipul, nu o mai pot superioriza. Codul
public void faZgomot(){
System.out.println("miau");
super.faZgomot();
}
va arunca un stack overflow; Corect este
protected void faZgomot(){
System.out.println("miau");
super.faZgomot();
}
Acum, clasa Pisica va arăta cam așa:
package lume.animale;
public class Pisica extends Mamifer {
public Pisica(){
super("pisica");
}
protected void faZgomot(){
System.out.println("MIAU");
}
}
și da, o putem instanția fără probleme astfel:
Mamifer pisica=new Pisica();
9. Să recapitulăm ce avem în Main:
import lume.animale.*;
1. Pachete
Dar haide mai bine să separăm lucrurile: dați click dreapta pe folderul "src" din proiect si creați un nou pachet: "lume.animale", iar în pachetul "lume.animale" adăugați clasa "Mamifer".
Observați că prima linie este
package lume.animale;
Pentru a importa în Main clasa Mamifer puteți folosi
import lume.animale.Mamifer;
fie cu wildcard, pentru tot pachetul:
import lume.animale.*;
Observați că spre deosebire de ActionScript, în Java pachetul nu trebuie marcat cu acolade.
2.Clase
Inițializarea unei clase se face după modelul:
Clasă variabilă=new Clasă();
adică
private Mamifer mamifer=new Mamifer();
iar clasa Mamifer, dupa modelul stabilit deja, poate avea următorul cod:
package lume.animale;
public class Mamifer {
static public String BIPED="biped";
private String numeMamifer;
private String sunet="nedefinit";
public int numarDePicioare=0;
protected int numarDeOchi=2;
public String getSunet() {
return sunet;
}
public String getNume() {
return numeMamifer;
}
public void setSunet(String sunet) {
this.sunet = sunet;
}
protected void faZgomot(){
System.out.println(numeMamifer +" face "+getSunet());
}
private void pregatire(){
System.out.println(numeMamifer +" se apleaca si face...");
}
public void faSunet(){
pregatire();
faZgomot();
}
public Mamifer(String nume){
if(nume==null){
numeMamifer="numeNedefinit";
}else{
numeMamifer=nume;
}
}
public Mamifer(){
numeMamifer="mamifer necunoscut";
}
public static void definitie(){
String definitie = "Clasă de vertebrate superioare care au corpul acoperit cu păr, nasc pui vii și îi hrănesc cu laptele lor";
System.out.println(definitie);
}
}
3.Proprietăți și metode private, parametrii impliciți
Observați că Mamifer are 2 constructori: astfel
new Mamifer() // va returna numele mamiferului "mamifer necunoscut"
new Mamifer("caine") // va returna numele mamiferului "caine", iar
new Mamifer(null) // va returna numele mamiferului "numeNedefinit"
dacă am fi renunțat la constructorul Mamifer() la instanțierea
new Mamifer() // codul ar fi aruncat o eroare de compilare, deoarece constructorul Mamifer(String nume) necesită cel puțin un parametru, caz în care programatorul este obligat să scrie între acolade un șir de caractere
Apropo: în Java, spre deosebire de ActionScript există o diferență fundamentală între ghilimele duble - "" și cele single: ''. Cele single se folosesc la variabile tip char, gen 'a', iar cele duble la String-uri, gen "aa". Cine știe puțin C e obișnuit cu diferențierea.
4. Proprietățile și metodele publice știm deja că pot fi apelate de oriunde, iar proprietățile pot fi schimbate cum vrem. Nici aici, și nici în ActionScript nu e posibil să suprascrii o metodă publică după instanțiere. (Rog specialiștii să nu râdă, și să aștepte lecția de Javascript)
5. După cum v-am spus, getteri și setteri sunt tot metode publice, și sunt tratate ca atare:
setSunet("ham") va face ca getSunet() să returneze "ham" iar getNume() va returna variabila privata definita de constructor. Din păcate, în Java nu avem cuvântul "get" ca să putem face metode pe care să le scriem ca pe variabile.
6. Metode și proprietății statice:
Simplu: pot fi apelate fără instanțiere: Mamifer.definitie(); sau System.out.println(Mamifer.BIPED);
7. Proprietățile și metodele protejate sunt accesibile numai claselor care extind clasa curentă. Deci haide să creăm clasa Pisică astfel:
La extindere, o clasa in Java ia automat proprietățile constructorului din clasa-mamă.
Pentru că Mamifer are un constructor fara parametrii, Pisica va moșteni acest constructor. Dacă comentăm codul
// public Mamifer(){
// numeMamifer="mamifer necunoscut";
// System.out.println("constructor fara string");
// }
din "Mamifer", o sa vedem că linia
new Pisica()
va arunca o eroare de genul
Implicit super constructor Mamifer() is undefined for default constructor. Must define an explicit constructor
Cred ca intelegeți ideea: orice clasa are nevoie de minim un constructor implicit, fie al ei, fie moștenit.
Să considerăm în continuare că Mamifer are un constructor implicit, deci Pisica nu mai are nevoie musai de un constructor. Dacă nu-i definim un constructor însă, Pisica nu va avea un nume prestabilit. La instanțiere numele ei nu va fi pisică, deoarece constructorii din Mamifer returneaza doar "numeNedefinit" și "mamifer necunoscut", iar proprietatea "numeMamifer" este privată. La "numarDeOchi" avem acces, deoarece este protejată, la fel și la "faZgomot()", dar nu și la "numeMamifer". Așa că suprascriem constructorul astfel:
public Pisica(){
super("pisica");
}
8. Polimorfism, ovveride și superiorizare:
Hai sa facem un experiment: scrieți în clasa Pisica codul ăsta:
public void faZgomot(){
System.out.println("miau");
}
Ce am făcut? Am creat functia publică faZgomot(). Cum așa? Păi în Mamifer nu există o funcție cu același nume și cu aceeași parametrii, doar că era protejată? Ba da... tocmai ce am suprascris-o, ba chiar am făcut-o și publică. Atenție însă, dacă îi schimb tipul, nu o mai pot superioriza. Codul
System.out.println("miau");
super.faZgomot();
}
va arunca un stack overflow; Corect este
protected void faZgomot(){
System.out.println("miau");
super.faZgomot();
}
Acum, clasa Pisica va arăta cam așa:
package lume.animale;
public class Pisica extends Mamifer {
public Pisica(){
super("pisica");
}
protected void faZgomot(){
System.out.println("MIAU");
}
}
și da, o putem instanția fără probleme astfel:
Mamifer pisica=new Pisica();
9. Să recapitulăm ce avem în Main:
import lume.animale.*;
public class Main {
private Mamifer mamifer;
public Main(){
System.out.println("generam clasa Main::");
}
public void arataAnimale(){
//metoda statica
Mamifer.definitie();
//instantiere
mamifer=new Mamifer("catel");
//setare publica
mamifer.setSunet("HAM");
//apelare publica
mamifer.faSunet();
//o noua instantiere
mamifer=new Pisica();
mamifer.faSunet();
}
public static void main(String[] args) {
/*
* instantierea si apelarea directă
* a unei clase nu este de obicei
* recomandată deoarece nu există un
* control direct asupra variabile generate.
* Ea este permisă de obicei în
* metoda main de compilare, doar dacă
* este singură.
* */
new Main().arataAnimale();
}
}
Cum sa faci o carte cu sunete pentru iPad/iPhone folosind xCode si Objective-C
Tutorialul acesta necesită un Mac 10.8.2 și un xCode 4.5.2 - nu de alta, dar la cum schimbă Apple tehnologia nu mă miră mâine ce scriu eu aici să nu mai fie la zi.
Deschideți xCode si creați un nou proiect de iOS, folosind template-ul Page-Based Application:
Dați "Next" și dați-i un nume: (nu uitați să aveți bifata casuta de Devices:Universal)
Salvați proiectul local și testați-l dând click pe "Run":
După ce se compileaza o sa vedeți o aplicație tristă în care puteți da pagina, iar e fiecare pagina apara numele unei luni... "ianuarie, februarie, bla bla..." Dați "Stop" la execuția programului și importați in folderul curent resursele: imagini și sunete. Pozele vor avea nume "x.jpg" iar sunetele "x.mp3" unde x intre 1 si 12. Luați-le pur si simplu cu drag-and drop pe zona unde scrie numele proiectului, la importare bifați opțiunea de copiere locală:
... în final veți avea structura asta:
Acum, selectați "Build Phases - Link Binaries with Libraries" si adaugați librăria AVFoundation.framework apăsând pe "+":
Mutați librăria în folderul de frameworks pentru a avea structura asta:
Dacă după mutare veți vedea in Build Phases ca linia de AVFoundation.framework e scrisă cu roșu, selectați-o, apăsați "-" pentru a o șterge, apoi adăugați-o din nou. E o eroare de cale a xCode-ului pe care o veți rezolva astfel.
În structura de proiect dați click pe fișierul MainStoryboard_ipad.storyboard pentru a edita fisierul pentru iPad. Nu uitați la run să aveți selectată platforma de iPad pentru a testa. Apăsați pe semnul "=" pentru a da fit la pagină:
Selectați pagina "DataViewController - View" din meniul din stanga, apoi potriviți pagina cu zoom:
Având primul "View" selectat, cautați in dreapta jos itemul UIimageView
Luați-l cu drag'n drop și puneți-l în Data View Controller. Acum în stânga o să aveți structura:
În DataViewController.h importați headerul de la frameworkul AVFoundation, creați câteva variabile
în constructor, si o proprietate int. Pagina acum ar trebui sa arate cam asa:
@interface DataViewController : UIViewController{
IBOutlet UIImageView *poza; // aici va fi poza
AVAudioPlayer *playerSunet; // aici va fi sunetul
}
@property (strong, nonatomic) IBOutlet UILabel *dataLabel;
@property (strong, nonatomic) id dataObject;
@property int indexPagina;
@end
Acum, cel mai important este să legați obiectul UIImageView pe care l-ați pus în storyboard cu proprietatea "poza" declarata în DataViewController.h. Mergeți în MainStoryboard_ipad.storyboard și selectați "ImageView" din meniul din stânga. Apoi, în dreapta, dați click pe sageata aia mica, iar de sub "Referencig Outlets", în dreptul la "New Referencing Outlet" vedeți că e un punct. Dați click pe el, și fără a ridica mouse-ul, mergeți pe zona albastră din storyboard. Apoi ridicați mouse-ul, și alegeți proprietatea "poza".
E un procedeu dificil, și sigur vă întrebați de ce naibii trebuie un programator să facă drag'n drop ca să ruleze un program. Nu știu, considerați că pur și simplu treaba asta i se părea cool lui Steve Jobs.
Salvați și deschideți fișierul de implementare, DataViewController.m, unde adaugați metodele necesare pentru ca fisierul să arate cam așa:
#import "DataViewController.h"
@interface DataViewController ()
@end
@implementation DataViewController
- (void)dealloc{
[_dataLabel release];
[_dataObject release];
[super dealloc];
}
- (void)viewDidLoad{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
self.dataLabel.text = [self.dataObject description];
//print ca metoda se apeleaza:
NSLog(@"VIEW WILL APPEAR_%u", [self indexPagina]);
//setam numele pozei in functie de indexul paginii
NSString *numePoza=[NSString stringWithFormat:@"%u.jpg", [self indexPagina]];
//facem un print ca sa ne asiguram ca merge:
NSLog(numePoza, @"este poza", self.dataLabel.text);
//cream o noua imagine
UIImage *img=[UIImage imageNamed:numePoza];
//punem imaginea in container:
[poza setImage:img];
}
-(void)viewDidAppear:(BOOL)animated{
int number=[self indexPagina];
//dupa ce apare view-ul cream numele sunetului in functie de indexul paginii:
NSString *soundName=[NSString stringWithFormat:@"%d", number];
//convertim numele sunetului in cale
NSString* path = [[NSBundle mainBundle] pathForResource:soundName ofType:@"mp3"];
//print calea catre sunet:
NSLog(@"osn %@ cale: %@", soundName, path);
NSURL *url=[NSURL fileURLWithPath:path];
//creeam o eroare pe care playerul sa o apleze daca sunt probleme:
NSError *error;
//cream instanta de player:
playerSunet=[[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
//setam de cate ori sa se repete sunetul, -1 e infinit, 0 e o data
playerSunet.numberOfLoops=-1;
//dam play la sunet
[playerSunet play];
}
-(void)viewDidDisappear:(BOOL)animated{
//oprim sunetul cand view-ul dispare
[playerSunet stop];
}
@end
Acum, dacă o sa testați o să vedeți că indexul de pagina nu se incrementeaza. Pentru asta, trebuie sa editați un pic fisierul ModelController.m Căutați linia
- (DataViewController *)viewControllerAtIndex:(NSUInteger)
iar înainte de
return dataViewController;
.. când obiectul este returnat, scrieți
dataViewController.indexPagina=index;
funcția o să arate cam așa:
- (DataViewController *)viewControllerAtIndex:(NSUInteger)index storyboard:(UIStoryboard *)storyboard{
// Return the data view controller for the given index.
if (([self.pageData count] == 0) || (index >= [self.pageData count])) {
return nil;
}
// Create a new view controller and pass suitable data.
DataViewController *dataViewController = [storyboard instantiateViewControllerWithIdentifier:@"DataViewController"];
dataViewController.dataObject = self.pageData[index];
dataViewController.indexPagina=index;
return dataViewController;
}
Acum dacă testați o să vedeți că totul merge, dar când ajungeți la capăt, trebuie să o luați înapoi. Asta pentru că tot în ModelController.m, când indexul e prea mic sau prea mare, funcția returnează nil, în loc ca indexul să ia o nouă valoare. Asta e simplu de modificat: pur și simplu în loc de return nil scrieți ce valoare să ia indexul în situațiile respective. Sincer să fiu, eu n-am avut chef să mai stilizez nimic, iar la rulare, programelul arată cam așa:
Deschideți xCode si creați un nou proiect de iOS, folosind template-ul Page-Based Application:
Dați "Next" și dați-i un nume: (nu uitați să aveți bifata casuta de Devices:Universal)
Salvați proiectul local și testați-l dând click pe "Run":
După ce se compileaza o sa vedeți o aplicație tristă în care puteți da pagina, iar e fiecare pagina apara numele unei luni... "ianuarie, februarie, bla bla..." Dați "Stop" la execuția programului și importați in folderul curent resursele: imagini și sunete. Pozele vor avea nume "x.jpg" iar sunetele "x.mp3" unde x intre 1 si 12. Luați-le pur si simplu cu drag-and drop pe zona unde scrie numele proiectului, la importare bifați opțiunea de copiere locală:
... în final veți avea structura asta:
Acum, selectați "Build Phases - Link Binaries with Libraries" si adaugați librăria AVFoundation.framework apăsând pe "+":
Mutați librăria în folderul de frameworks pentru a avea structura asta:
Dacă după mutare veți vedea in Build Phases ca linia de AVFoundation.framework e scrisă cu roșu, selectați-o, apăsați "-" pentru a o șterge, apoi adăugați-o din nou. E o eroare de cale a xCode-ului pe care o veți rezolva astfel.
În structura de proiect dați click pe fișierul MainStoryboard_ipad.storyboard pentru a edita fisierul pentru iPad. Nu uitați la run să aveți selectată platforma de iPad pentru a testa. Apăsați pe semnul "=" pentru a da fit la pagină:
Selectați pagina "DataViewController - View" din meniul din stanga, apoi potriviți pagina cu zoom:
Având primul "View" selectat, cautați in dreapta jos itemul UIimageView
Luați-l cu drag'n drop și puneți-l în Data View Controller. Acum în stânga o să aveți structura:
În DataViewController.h importați headerul de la frameworkul AVFoundation, creați câteva variabile
în constructor, si o proprietate int. Pagina acum ar trebui sa arate cam asa:
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
@interface DataViewController : UIViewController{
IBOutlet UIImageView *poza; // aici va fi poza
AVAudioPlayer *playerSunet; // aici va fi sunetul
}
@property (strong, nonatomic) IBOutlet UILabel *dataLabel;
@property (strong, nonatomic) id dataObject;
@property int indexPagina;
@end
Acum, cel mai important este să legați obiectul UIImageView pe care l-ați pus în storyboard cu proprietatea "poza" declarata în DataViewController.h. Mergeți în MainStoryboard_ipad.storyboard și selectați "ImageView" din meniul din stânga. Apoi, în dreapta, dați click pe sageata aia mica, iar de sub "Referencig Outlets", în dreptul la "New Referencing Outlet" vedeți că e un punct. Dați click pe el, și fără a ridica mouse-ul, mergeți pe zona albastră din storyboard. Apoi ridicați mouse-ul, și alegeți proprietatea "poza".
E un procedeu dificil, și sigur vă întrebați de ce naibii trebuie un programator să facă drag'n drop ca să ruleze un program. Nu știu, considerați că pur și simplu treaba asta i se părea cool lui Steve Jobs.
Salvați și deschideți fișierul de implementare, DataViewController.m, unde adaugați metodele necesare pentru ca fisierul să arate cam așa:
#import "DataViewController.h"
@interface DataViewController ()
@end
@implementation DataViewController
- (void)dealloc{
[_dataLabel release];
[_dataObject release];
[super dealloc];
}
- (void)viewDidLoad{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
self.dataLabel.text = [self.dataObject description];
//print ca metoda se apeleaza:
NSLog(@"VIEW WILL APPEAR_%u", [self indexPagina]);
//setam numele pozei in functie de indexul paginii
NSString *numePoza=[NSString stringWithFormat:@"%u.jpg", [self indexPagina]];
//facem un print ca sa ne asiguram ca merge:
NSLog(numePoza, @"este poza", self.dataLabel.text);
//cream o noua imagine
UIImage *img=[UIImage imageNamed:numePoza];
//punem imaginea in container:
[poza setImage:img];
}
-(void)viewDidAppear:(BOOL)animated{
int number=[self indexPagina];
//dupa ce apare view-ul cream numele sunetului in functie de indexul paginii:
NSString *soundName=[NSString stringWithFormat:@"%d", number];
//convertim numele sunetului in cale
NSString* path = [[NSBundle mainBundle] pathForResource:soundName ofType:@"mp3"];
//print calea catre sunet:
NSLog(@"osn %@ cale: %@", soundName, path);
NSURL *url=[NSURL fileURLWithPath:path];
//creeam o eroare pe care playerul sa o apleze daca sunt probleme:
NSError *error;
//cream instanta de player:
playerSunet=[[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
//setam de cate ori sa se repete sunetul, -1 e infinit, 0 e o data
playerSunet.numberOfLoops=-1;
//dam play la sunet
[playerSunet play];
}
-(void)viewDidDisappear:(BOOL)animated{
//oprim sunetul cand view-ul dispare
[playerSunet stop];
}
@end
Acum, dacă o sa testați o să vedeți că indexul de pagina nu se incrementeaza. Pentru asta, trebuie sa editați un pic fisierul ModelController.m Căutați linia
- (DataViewController *)viewControllerAtIndex:(NSUInteger)
iar înainte de
return dataViewController;
.. când obiectul este returnat, scrieți
dataViewController.indexPagina=index;
funcția o să arate cam așa:
- (DataViewController *)viewControllerAtIndex:(NSUInteger)index storyboard:(UIStoryboard *)storyboard{
// Return the data view controller for the given index.
if (([self.pageData count] == 0) || (index >= [self.pageData count])) {
return nil;
}
// Create a new view controller and pass suitable data.
DataViewController *dataViewController = [storyboard instantiateViewControllerWithIdentifier:@"DataViewController"];
dataViewController.dataObject = self.pageData[index];
dataViewController.indexPagina=index;
return dataViewController;
}
Acum dacă testați o să vedeți că totul merge, dar când ajungeți la capăt, trebuie să o luați înapoi. Asta pentru că tot în ModelController.m, când indexul e prea mic sau prea mare, funcția returnează nil, în loc ca indexul să ia o nouă valoare. Asta e simplu de modificat: pur și simplu în loc de return nil scrieți ce valoare să ia indexul în situațiile respective. Sincer să fiu, eu n-am avut chef să mai stilizez nimic, iar la rulare, programelul arată cam așa:
Programare orientată pe obiecte: Actionscript 3 - pachete, clase, metode și proprietăți
Pentru această lecție (e mai degrabă o lecție decât un tutorial) aveți nevoie de un IDE pentru Actionscript. Eu voi folosi FlashDevelopp dar dacă sunteți pe un Mac/Linux vă recomand varianta free de la FDT.
Bun, deschideți deci IDE-ul și creați un nou proiect AS3:
1. Pachete:
Dați-i un nume, gen "Tutorial". În structura pe directoare veți vedea un folder "src" unde există fișierul "Main.as". Ăsta e fișierul care se va compila. Dați click dreapta pe folderul "src" și creați un folder nou cu numele "lume". În folderul "lume" creați un nou folder cu numele "animale". Tocmai ați creat pachetul "lume.animale".
2. Clase
Dați click dreapta pe folderul "animale" și selectați "Add-NewClass".
O să vă apară fereastra asta:
Scrieți numele clasei: "Mamifer" și dați "ok". Tocmai ați creat clasa "Mamifer". Când veți deschide fișierul la dublu click, veți avea predefinit următorul format de clasă:
package lume.animale {
public class Mamifer {
public function Mamifer() {
}
}
}
După cum vedeți sus e numele pachetului: lume.animale, mai jos avem clasa publică mamifer, apoi constructorul public function Mamifer (){}.
Între acoladele de constructor scrieți
trace ("sunt un mamifer")
Metoda "trace" va afișa în output textul scris între paranteze.
Deschideți fișierul "Main.as", și scrieți sub acoloada de început de clasă o nouă instanță a clasei "Mamifer":
var mamifer:Mamifer;
care se traduce cu: "variabila mamifer de tipul Mamifer". La compilare (Project - TestProject) veți vedea că vă dă o eroare cu textul:
Error: Type was not found or was not a compile-time constant: Mamifer. var mamifer:Mamifer;
Asta pentru că nu ați importat pachetul cu clasa respectivă.
Orice clasă pe care vreți să o folosiți trebuie importată cu sintaxa:
import lume.animale.Mamifer;
ActionScript vă permite să importați mai multe clase din același pachet folosind un wildcard, adică:
import lume.animale.*;
Iar asta înseamnă că ați importat și puteți folosi toate clasele din pachetul "lume.animale". Nu toate limbajele permit această facilitate. De exemplu Haxe, care are o sintaxă asemănătoare cu ActionScript, necesită importarea per-clasă, ca în primul exemplu de mai sus.
După ce importați pachetul, compilați din nou, iar de data aceasta va merge, doar că veți avea un warning, care va spune:
Warning: var 'mamifer' will be scoped to the default namespace: Main: internal. It will not be visible outside of this package.
Asta pentru că proprietatea "mamifer" nu are nici un namespace (nici un tip). Compilatorul vă spune că automat va fi considerată publică. Pentru a suprima această eroare, puneți înainte de "var" cuvântul "private". Compilați din nou și de data aceasta nu veți mai avea erori. Dar nu veți avea nici un output. De ce? Pentru că deocamdată variabila scrisă nu are nici un constructor. Pentru a apela constructorul, variabila trebuie scrisă astfel:
private var mamifer:Mamifer=new Mamifer();
Acum avem un constructor al proprietății "mamifer" și la compilare o să vedem outputul pe care l-am scris în constructor.
Haide să populăm clasa "Mamifer" cu diferite proprietăți și metode pe care le voi explica în cele ce urmează:
package lume.animale {
public class Mamifer {
//constante statice:
static public const BIPED:String = "biped";
static public const PATRUPED:String = "patruped";
//private
private var nume:String = "nu am nume";
private var _sunet:String="nu am sunet"
//publica
public var numarDeOchi:int = 2;
//protejata
protected var _numarDePicioare:int = 4;
//constructor
public function Mamifer(param_nume:String="nu am nume") {
nume = param_nume;
var introducere:String="sunt un mamifer:"
trace(introducere + nume);
}
//setare publica (tip java)
public function setSunet(param_sunet:String):void {
_sunet = param_sunet;
}
//getter public (tip java)
public function getSunet():String {
return _sunet
}
//getter public
public function getNume():String {
return nume;
}
//metoda protejata
protected function faZgomot():void {
trace (nume + " face " + getSunet());
}
//metoda privata:
private function pregatire():void {
trace (nume+" se apleaca, si...")
}
//metoda publica
public function faSunet():void {
pregatire();//private
faZgomot();//protejata
}
//getter tip as3
public function get numarDePicioare():int {
return _numarDePicioare;
}
//setter tip as3
public function set numarDePicioare(value:int):void {
_numarDePicioare = value;
}
Bun, deschideți deci IDE-ul și creați un nou proiect AS3:
1. Pachete:
Dați-i un nume, gen "Tutorial". În structura pe directoare veți vedea un folder "src" unde există fișierul "Main.as". Ăsta e fișierul care se va compila. Dați click dreapta pe folderul "src" și creați un folder nou cu numele "lume". În folderul "lume" creați un nou folder cu numele "animale". Tocmai ați creat pachetul "lume.animale".
2. Clase
Dați click dreapta pe folderul "animale" și selectați "Add-NewClass".
O să vă apară fereastra asta:
Scrieți numele clasei: "Mamifer" și dați "ok". Tocmai ați creat clasa "Mamifer". Când veți deschide fișierul la dublu click, veți avea predefinit următorul format de clasă:
package lume.animale {
public class Mamifer {
public function Mamifer() {
}
}
}
După cum vedeți sus e numele pachetului: lume.animale, mai jos avem clasa publică mamifer, apoi constructorul public function Mamifer (){}.
Între acoladele de constructor scrieți
trace ("sunt un mamifer")
Metoda "trace" va afișa în output textul scris între paranteze.
Deschideți fișierul "Main.as", și scrieți sub acoloada de început de clasă o nouă instanță a clasei "Mamifer":
var mamifer:Mamifer;
care se traduce cu: "variabila mamifer de tipul Mamifer". La compilare (Project - TestProject) veți vedea că vă dă o eroare cu textul:
Error: Type was not found or was not a compile-time constant: Mamifer. var mamifer:Mamifer;
Asta pentru că nu ați importat pachetul cu clasa respectivă.
Orice clasă pe care vreți să o folosiți trebuie importată cu sintaxa:
import lume.animale.Mamifer;
ActionScript vă permite să importați mai multe clase din același pachet folosind un wildcard, adică:
import lume.animale.*;
Iar asta înseamnă că ați importat și puteți folosi toate clasele din pachetul "lume.animale". Nu toate limbajele permit această facilitate. De exemplu Haxe, care are o sintaxă asemănătoare cu ActionScript, necesită importarea per-clasă, ca în primul exemplu de mai sus.
După ce importați pachetul, compilați din nou, iar de data aceasta va merge, doar că veți avea un warning, care va spune:
Warning: var 'mamifer' will be scoped to the default namespace: Main: internal. It will not be visible outside of this package.
Asta pentru că proprietatea "mamifer" nu are nici un namespace (nici un tip). Compilatorul vă spune că automat va fi considerată publică. Pentru a suprima această eroare, puneți înainte de "var" cuvântul "private". Compilați din nou și de data aceasta nu veți mai avea erori. Dar nu veți avea nici un output. De ce? Pentru că deocamdată variabila scrisă nu are nici un constructor. Pentru a apela constructorul, variabila trebuie scrisă astfel:
private var mamifer:Mamifer=new Mamifer();
Acum avem un constructor al proprietății "mamifer" și la compilare o să vedem outputul pe care l-am scris în constructor.
Haide să populăm clasa "Mamifer" cu diferite proprietăți și metode pe care le voi explica în cele ce urmează:
package lume.animale {
public class Mamifer {
//constante statice:
static public const BIPED:String = "biped";
static public const PATRUPED:String = "patruped";
//private
private var nume:String = "nu am nume";
private var _sunet:String="nu am sunet"
//publica
public var numarDeOchi:int = 2;
//protejata
protected var _numarDePicioare:int = 4;
//constructor
public function Mamifer(param_nume:String="nu am nume") {
nume = param_nume;
var introducere:String="sunt un mamifer:"
trace(introducere + nume);
}
//setare publica (tip java)
public function setSunet(param_sunet:String):void {
_sunet = param_sunet;
}
//getter public (tip java)
public function getSunet():String {
return _sunet
}
//getter public
public function getNume():String {
return nume;
}
//metoda protejata
protected function faZgomot():void {
trace (nume + " face " + getSunet());
}
//metoda privata:
private function pregatire():void {
trace (nume+" se apleaca, si...")
}
//metoda publica
public function faSunet():void {
pregatire();//private
faZgomot();//protejata
}
//getter tip as3
public function get numarDePicioare():int {
return _numarDePicioare;
}
//setter tip as3
public function set numarDePicioare(value:int):void {
_numarDePicioare = value;
}
//doar getter tip as3
public function get descriereDupaPicioare():String {
if (_numarDePicioare==4) {
return PATRUPED;
}
else if (_numarDePicioare == 2) {
return BIPED;
}
return "nu are un nume prestabilit"
}
//metoda statica
public static function definitie():void {
var definitie:String = "Clasă de vertebrate superioare care au corpul acoperit cu păr, nasc pui vii și îi hrănesc cu laptele lor";
trace(definitie);
trace("un mamifer poate fi " + BIPED + " sau " + PATRUPED);
}
}
}
3. Proprietăți și metode private; parametrii impliciți
După cum vedeți, am pus în constructorul clasei "Mamifer" un parametru implicit: variabila "nume" are valoarea "pisică". Parametrii impliciți sunt o facilitate a limbajului ActionScript. În alte limbaje, acest sistem trebui tratat altfel. Asta înseamnă că la instanțiere (adică atunci când creăm constructorul) nu e nevoie să punem neapărat un parametru.
Dacă în loc de
public function Mamifer(param_nume:String="nu am nume")
am fi avut
public function Mamifer(param_nume:String)
atunci codul
private var mamifer:Mamifer=new Mamifer();
ar fi aruncat o eroare de compilare, anunțând că aveți nevoie de cel puțin un parametru, și am fi fost obligați să scriem:
private var mamifer:Mamifer=new Mamifer("pisica");
Tot în constructor vedem că dăm o nouă valoare proprietății private "nume":
nume = param_nume;
.. și folosim o variabilă locală (disponibilă numai în interiorul acestei metode) pentru a face un trace.
O variabilă privată poate fi folosită oriunde în interiorul unei clase. Asta înseamnă că o putem folosi în interiorul oricărei metode private, publice sau protejate din această clasă.
4. Proprietățile și metodele publice pot fi apelate oriunde în interiorul clasei (ca și cele private) dar și din exteriorul clasei:
mamifer.faSunet()
va afisa:
"pisica se apleaca, si...
pisica face nu am sunet"
De asemenea, metodele publice pot fi suprascrise si citite oricand si oricum:
mamifer.numarDeOchi=2;
trace(mamifer.getNume() + " are" + mamifer.numarDeOchi +"ochi");
va afisa "pisica are2ochi"
Observați că tot publice sunt și metodele getSunet() respectiv setSunet(), astfel încât
mamifer.setSunet("miau");
mamifer.faSunet();
va afisa:
pisica se apleaca, si...
pisica face miau
pentru că faSunet() apeleaza metoda privata pregatire() și metoda protejata faZgomot(), care la rândul ei apeleza getSunet();
5. Getterii și setterii sunt metode publice sau private cu sintaxa de proprietăți.
De exemplu, în loc de:
public function getnumarDePicioare():int{
return _numarDePicioare;
}
public function setnumarDePicioare(value:int):void{
_numarDePicioare = value;
}
am scris:
public function get numarDePicioare():int{
return _numarDePicioare;
}
public function set numarDePicioare(value:int):void{
_numarDePicioare = value;
}
Diferența constă în apelare: în loc de
mamifer.getnumarDePicioare()
voi scrie
mamifer.numarDePicioare; //(fără acolade la sfârșit)
Și în loc de
mamifer.setnumarDePicioare(4);
voi scrie
mamifer.numarDePicioare=4;
În general, rolul unui getter sau al unui setter este de a proteja accesul la o variabila privata. Pe de-o parte, vrem sa avem acces la numarul de picioare al animalului, dar sa zicem ca nu vrem ca cineva sa seteze un numar impar de picioare. Astfel, în setter putem scrie
if (value%2!=0){
throw new Error("un mamifer nu poate avea un numar impar de picioare");
}
... adică dacă numărul dat e impar, aruncăm o eroare de cod. În Java de exemplu, nu există getteri și setteri propriu-ziși, cu sintaxă de proprietăți, așa cum e în C#, ci doar metode publice care pot seta sau returna o valoare. Desigur, același lucru l-am fi putut face și într-o functie de forma setnumarDePicioare(4), dar nu am mai fi avut un cod atât de "cool" când scriem mamifer.numarDePicioare=4; Da, singura diferență în cazul de față este doar de sintaxă.
6. Metode si proprietăți statice
În exemplul cu "Mamifer", proprietatea "BIPED" este o constată (are mereu aceeasi valoare) statică (nu poate fi modificată). Metoda "definitie()" este tot statică. Asta înseamnă că pentru ele nu avem nevoie de constructor. Putem apela direct:
Mamifer.definitie();
și va fi afișată definiția mamiferului sau
trace(Mamifer.BIPED);
pentru a afișa stringul "biped";
Atenție: într-o metodă statică nu putem folosi decât proprietăți statice, sau variabile locale
7. Proprietățile și metodele protejate sunt disponibile în interiorul clasei existente și în interiorul clasei extinse. Dar despre ele nu putem vorbi fără să extindem o clasă:
Dați click dreapta pe folderul "animale" și creați clasa "Pisică" astfel încât să arate cam așa:
package lume.animale{
public class Pisica extends Mamifer{
public function Pisica(){
super("pisica");
_numarDePicioare = 4;
setSunet("miau");
}
override protected function faZgomot():void{
trace (this.getSunet().toUpperCase());
}
override public function faSunet():void{
trace("ATENTIE! MIAUNA PISICA")
super.faSunet();
}
override public function set numarDePicioare(value:int):void{
if (value%2!=0){
throw new Error("un mamifer nu poate avea un numar impar de picioare");
}
super.numarDePicioare = value;
}
}
}
8. Polimorfism - ovveride și superiorizare
Vedeți în cod că aveți clasa "Pisică" ce extinde "Mamifer", iar în constructor am dat o valoare implicită parametrului "nume" folosind super("pisica"). Acum putem apela:
var pisica:Pisica = new Pisica();
fără nici un parametru;
Pentru că proprietatea _sunet din "Mamifer" era privată, tot în constructorul "Pisica" am dat o valoare implicită sunetului, cu
setSunet("miau");
Tot aici, am dat ovveride la metoda publica "faSunet()" adaugand un trace, și superiorizând-o. Asta înseamnă că după trace-ul meu, se va efectua restul functiei definite în "Mamifer"
La metoda faZgomot() însă, am dat ovveride fără a o superioriza, deci restul funcției din "Mamifer" nu se va mai executa. Astfel, codul
var pisica:Pisica = new Pisica();
pisica.faSunet();
va afisa:
sunt un mamifer:pisica
ATENTIE! MIAUNA PISICA
pisica se apleaca, si...
MIAU
Pentru a înțelege ce e polimorfismul, puteți șterge linia
var pisica:Pisica = new Pisica();
pisica.faSunet();
și o puteți înlocui cu
mamifer = new Pisica();
mamifer.faSunet();
Outputul va fi același. Pentru ca Pisica este o clasă ce extinde Mamifer, ea poate avea instanța inițială tot Mamifer
9. Să recapitulăm :
package{
import flash.display.Sprite;
import flash.events.Event;
import lume.animale.Mamifer;
import lume.animale.Pisica;
public class Main extends Sprite{
private var mamifer:Mamifer;
public function Main():void{
Mamifer.definitie();
/* Apeleaza o metoda statica si afiseaza:
Clasă de vertebrate superioare
care au corpul
acoperit cu păr,
nasc pui vii și îi hrănesc cu laptele lor
un mamifer poate fi biped sau patruped
*/
mamifer = new Mamifer("catel");
/*creaza o instanta a clasei mamifer,
afiseaza "sunt un mamifer:catel"*/
mamifer.setSunet("HAM");
/*seteaza un sunet pentru catel*/
mamifer.faSunet();
/*apleaza pregatire() si faZgomot(),
* afiseaza sunt un mamifer:catel
* catel se apleaca, si...
* catel face HAM
* */
mamifer = new Pisica();
/* creaza o instanta a clasei Pisica()
cu un nume implicit;*/
mamifer.faSunet();
/*apeleaza o metoda publica marcata
cu ovveride.*/
trace(mamifer.descriereDupaPicioare);
/*afiseaza un string stabilit
* in functie de numarul de picioare*/
}
}
}
Outputul va fi:
Clasă de vertebrate superioare care au corpul acoperit cu păr, nasc pui vii și îi hrănesc cu laptele lor
un mamifer poate fi biped sau patruped
sunt un mamifer:catel
catel se apleaca, si...
catel face HAM
sunt un mamifer:pisica
ATENTIE! MIAUNA PISICA
pisica se apleaca, si...
MIAU
patruped
public function get descriereDupaPicioare():String {
if (_numarDePicioare==4) {
return PATRUPED;
}
else if (_numarDePicioare == 2) {
return BIPED;
}
return "nu are un nume prestabilit"
}
//metoda statica
public static function definitie():void {
var definitie:String = "Clasă de vertebrate superioare care au corpul acoperit cu păr, nasc pui vii și îi hrănesc cu laptele lor";
trace(definitie);
trace("un mamifer poate fi " + BIPED + " sau " + PATRUPED);
}
}
}
3. Proprietăți și metode private; parametrii impliciți
După cum vedeți, am pus în constructorul clasei "Mamifer" un parametru implicit: variabila "nume" are valoarea "pisică". Parametrii impliciți sunt o facilitate a limbajului ActionScript. În alte limbaje, acest sistem trebui tratat altfel. Asta înseamnă că la instanțiere (adică atunci când creăm constructorul) nu e nevoie să punem neapărat un parametru.
Dacă în loc de
public function Mamifer(param_nume:String="nu am nume")
am fi avut
public function Mamifer(param_nume:String)
atunci codul
private var mamifer:Mamifer=new Mamifer();
ar fi aruncat o eroare de compilare, anunțând că aveți nevoie de cel puțin un parametru, și am fi fost obligați să scriem:
private var mamifer:Mamifer=new Mamifer("pisica");
Tot în constructor vedem că dăm o nouă valoare proprietății private "nume":
nume = param_nume;
.. și folosim o variabilă locală (disponibilă numai în interiorul acestei metode) pentru a face un trace.
O variabilă privată poate fi folosită oriunde în interiorul unei clase. Asta înseamnă că o putem folosi în interiorul oricărei metode private, publice sau protejate din această clasă.
4. Proprietățile și metodele publice pot fi apelate oriunde în interiorul clasei (ca și cele private) dar și din exteriorul clasei:
mamifer.faSunet()
va afisa:
"pisica se apleaca, si...
pisica face nu am sunet"
De asemenea, metodele publice pot fi suprascrise si citite oricand si oricum:
mamifer.numarDeOchi=2;
trace(mamifer.getNume() + " are" + mamifer.numarDeOchi +"ochi");
va afisa "pisica are2ochi"
Observați că tot publice sunt și metodele getSunet() respectiv setSunet(), astfel încât
mamifer.setSunet("miau");
mamifer.faSunet();
va afisa:
pisica se apleaca, si...
pisica face miau
pentru că faSunet() apeleaza metoda privata pregatire() și metoda protejata faZgomot(), care la rândul ei apeleza getSunet();
5. Getterii și setterii sunt metode publice sau private cu sintaxa de proprietăți.
De exemplu, în loc de:
public function getnumarDePicioare():int{
return _numarDePicioare;
}
public function setnumarDePicioare(value:int):void{
_numarDePicioare = value;
}
am scris:
public function get numarDePicioare():int{
return _numarDePicioare;
}
public function set numarDePicioare(value:int):void{
_numarDePicioare = value;
}
Diferența constă în apelare: în loc de
mamifer.getnumarDePicioare()
voi scrie
mamifer.numarDePicioare; //(fără acolade la sfârșit)
Și în loc de
mamifer.setnumarDePicioare(4);
voi scrie
mamifer.numarDePicioare=4;
În general, rolul unui getter sau al unui setter este de a proteja accesul la o variabila privata. Pe de-o parte, vrem sa avem acces la numarul de picioare al animalului, dar sa zicem ca nu vrem ca cineva sa seteze un numar impar de picioare. Astfel, în setter putem scrie
if (value%2!=0){
throw new Error("un mamifer nu poate avea un numar impar de picioare");
}
... adică dacă numărul dat e impar, aruncăm o eroare de cod. În Java de exemplu, nu există getteri și setteri propriu-ziși, cu sintaxă de proprietăți, așa cum e în C#, ci doar metode publice care pot seta sau returna o valoare. Desigur, același lucru l-am fi putut face și într-o functie de forma setnumarDePicioare(4), dar nu am mai fi avut un cod atât de "cool" când scriem mamifer.numarDePicioare=4; Da, singura diferență în cazul de față este doar de sintaxă.
6. Metode si proprietăți statice
În exemplul cu "Mamifer", proprietatea "BIPED" este o constată (are mereu aceeasi valoare) statică (nu poate fi modificată). Metoda "definitie()" este tot statică. Asta înseamnă că pentru ele nu avem nevoie de constructor. Putem apela direct:
Mamifer.definitie();
și va fi afișată definiția mamiferului sau
trace(Mamifer.BIPED);
pentru a afișa stringul "biped";
Atenție: într-o metodă statică nu putem folosi decât proprietăți statice, sau variabile locale
7. Proprietățile și metodele protejate sunt disponibile în interiorul clasei existente și în interiorul clasei extinse. Dar despre ele nu putem vorbi fără să extindem o clasă:
Dați click dreapta pe folderul "animale" și creați clasa "Pisică" astfel încât să arate cam așa:
package lume.animale{
public class Pisica extends Mamifer{
public function Pisica(){
super("pisica");
_numarDePicioare = 4;
setSunet("miau");
}
override protected function faZgomot():void{
trace (this.getSunet().toUpperCase());
}
override public function faSunet():void{
trace("ATENTIE! MIAUNA PISICA")
super.faSunet();
}
override public function set numarDePicioare(value:int):void{
if (value%2!=0){
throw new Error("un mamifer nu poate avea un numar impar de picioare");
}
super.numarDePicioare = value;
}
}
}
8. Polimorfism - ovveride și superiorizare
Vedeți în cod că aveți clasa "Pisică" ce extinde "Mamifer", iar în constructor am dat o valoare implicită parametrului "nume" folosind super("pisica"). Acum putem apela:
var pisica:Pisica = new Pisica();
fără nici un parametru;
Pentru că proprietatea _sunet din "Mamifer" era privată, tot în constructorul "Pisica" am dat o valoare implicită sunetului, cu
setSunet("miau");
Tot aici, am dat ovveride la metoda publica "faSunet()" adaugand un trace, și superiorizând-o. Asta înseamnă că după trace-ul meu, se va efectua restul functiei definite în "Mamifer"
La metoda faZgomot() însă, am dat ovveride fără a o superioriza, deci restul funcției din "Mamifer" nu se va mai executa. Astfel, codul
var pisica:Pisica = new Pisica();
pisica.faSunet();
va afisa:
sunt un mamifer:pisica
ATENTIE! MIAUNA PISICA
pisica se apleaca, si...
MIAU
Pentru a înțelege ce e polimorfismul, puteți șterge linia
var pisica:Pisica = new Pisica();
pisica.faSunet();
și o puteți înlocui cu
mamifer = new Pisica();
mamifer.faSunet();
Outputul va fi același. Pentru ca Pisica este o clasă ce extinde Mamifer, ea poate avea instanța inițială tot Mamifer
9. Să recapitulăm :
package{
import flash.display.Sprite;
import flash.events.Event;
import lume.animale.Mamifer;
import lume.animale.Pisica;
public class Main extends Sprite{
private var mamifer:Mamifer;
public function Main():void{
Mamifer.definitie();
/* Apeleaza o metoda statica si afiseaza:
Clasă de vertebrate superioare
care au corpul
acoperit cu păr,
nasc pui vii și îi hrănesc cu laptele lor
un mamifer poate fi biped sau patruped
*/
mamifer = new Mamifer("catel");
/*creaza o instanta a clasei mamifer,
afiseaza "sunt un mamifer:catel"*/
mamifer.setSunet("HAM");
/*seteaza un sunet pentru catel*/
mamifer.faSunet();
/*apleaza pregatire() si faZgomot(),
* afiseaza sunt un mamifer:catel
* catel se apleaca, si...
* catel face HAM
* */
mamifer = new Pisica();
/* creaza o instanta a clasei Pisica()
cu un nume implicit;*/
mamifer.faSunet();
/*apeleaza o metoda publica marcata
cu ovveride.*/
trace(mamifer.descriereDupaPicioare);
/*afiseaza un string stabilit
* in functie de numarul de picioare*/
}
}
}
Outputul va fi:
Clasă de vertebrate superioare care au corpul acoperit cu păr, nasc pui vii și îi hrănesc cu laptele lor
un mamifer poate fi biped sau patruped
sunt un mamifer:catel
catel se apleaca, si...
catel face HAM
sunt un mamifer:pisica
ATENTIE! MIAUNA PISICA
pisica se apleaca, si...
MIAU
patruped
Cum să faci un widget de feed RSS pentru MacOS folosind Dashcode
Tutorialul ăsta e de dificultate -1.
În primul rând aveți nevoie de Dashcode, pe care îl puteți downloada gratuit dacă aveți un Mac.
Deschideți programul, și o să vă sară în față imaginea asta:
În primul rând aveți nevoie de Dashcode, pe care îl puteți downloada gratuit dacă aveți un Mac.
Deschideți programul, și o să vă sară în față imaginea asta:
În cazul în care nu apare automat fereastra pentru un proiect now, mergeți la File-NewProject și tot fereastra asta o să vă apară. Selectați tabul "Dashboard", proiectul tip "RSS". Dați "Choose" și... gata...
aveți un proiect Dashcode pentru RSS care ar trebui să arate cam așa:
Din meniul din stânga, dați click pe "Widget Attributes" și veți avea fereastra asta:
Căutați în josul paginii câmpul "Feed URL", unde scrie "Drag or enter a feed URL here", și dați paste la propriul url-feed, în cazul meu, http://tutorialepecod.blogspot.com/feeds/posts/default. Acum... tot în poza de mai sus... vedeți în stânga sus un buton rotund verde cu un triunghiuleț sub care scrie "Run"? Apăsați pe el... pe ecran o să apară asta:
Pentru a opri rularea apasați butonul roșu mare din stânga sus, sub care scrie "Stop". Dați click pe proiectul mare în stanga (tabul "Untiteld"), pentru a vedea widgetul în design mode:
.. iar pentru setări avansate apăsați pe "i" (inspector) sau pe iconița aia cu multe cărți (Library). Dacă vă jucați un pic, vă puteți stiliza cum vreți widgetul. Asta ține de curiozitatea voastră. Nu uitați ca după ce faceți o modificare să apăsați pe "Run" pentru a fi împachetate modificările voastre. Salvați proiectul unde vreți voi pe hard.
Acum... dacă vreți doar să-l instalați pe propriul calculator, fără a-l mai da altcuiva, puteți selecta "File-Deploy". Dacă vreți să-l puneți undeva de unde lumea să-l poată downloada, așa cum am făcut eu, aveți nevoie de build-ul din pachetul de proiect. Eu unul fac așa: mă duc în Finder acolo unde am salvat proiectul, dau click dreapta pe proiect, selectez "Show Package Contents", și mă duc în folderul "projects":
Fisierul cu extensia .wdgt este build-ul meu. Pe el îl copiez și-l distribui cum vreau. La dublu click, o să mi-l pună în lista de widget-uri disponibile, iar la instalare, al meu arată cam așa:
Cum să instalezi Ubuntu Linux pe VirtualBox
Cerințe:
Evident, înainte de a instala un Ubuntu pe o mașină virtuală, ai nevoie de un Ubuntu și de o mașină virtuală, în cazul de față VirtualBox. Imaginile sunt în varianta pentru MacOS, dar nu vă speriați, nu sunt diferențe decât de layout pentru versiunea de Windows/Linux.
VirtualBox-ul îl instalăm, iar Ubuntu îl salvăm pe hard în versiunea .iso. Nu vă grăbiți să instalați orice pe VirtualBox în ideea că veți putea testa la performanțe acceptabile orice sistem de operare. Nu orice sistem de operare bun în sine înseamnă că se va prezenta aceptabil și într-un mediu virtual. De exemplu, eu m-am descurcat cel mai bine cu Ubuntu 11.04 sau cu Linux Mint 13+. PinGuy, Fedora, Ubuntu 12 sau Haiku nu au suport pentru "guest additions", deci nu le veți putea vedea în fullscreen. Iar OpenSUSE are nevoie de mulți rami ca să se miște acceptabil. Chiar dacă tutorialul acesta se aplică în cazul oricărui sistem de operare, sfatul meu pentru un calculator de minim 4 GB rami este să folosiți un Ubuntu 11.04.
Deschidem VirtualBox și dăm click pe "New":
Îi dăm un nume: dacă scriem "Ubuntu" ar trebui să se completeze singure celelalte câmpuri. În caz contrar, selectăm manual "Type: Linux" și "Version: Ubuntu".
Alegem câți rami să folosească mașina virtuală. Sfatul meu e să nu depășiți banda verde. Click pe "Continue"
Bifăm "Create a virtual hard drive now" și dăm click pe "Create":
Bifăm "VDI (Virtual Disk Image)" și click pe "Continue":
Bifăm "Dynamically allocated", apoi "Continue":
Selectăm numărul maxim de gigabiți pe care-l poate folosi mașina virtuală. 18-20GB e suficient. Click pe "Create":
Avem o mașină virtuală!
Înainte de a o porni, dăm click pe "Settings":
Alegem "Storage", dăm click pe "Empty" imediat sub "IDE Controller", dăm click pe cerculețul ăla mic albastru, click apoi pe "Choose a virtual CD/DVD disk file", se deschide o prietenoasă fereastră de open, alegem fișierul .iso cu Ubuntu abia downloadat, ok... ok... si după ce se închide fereastra de setări, dăm și start
Acum avem un Ubuntu care butează de pe un .iso
Suntem atenți să selectăm install, dăm ENTER, și începe instalarea.
Cum sa configurezi un server Ubuntu in Virtual Box
Preliminarii:
Înainte de a continua acest tutorial vei avea nevoie de:
1. Una bucata Ubuntu instalată pe Virtual Box, ca în tutorialul de aici.
2. Apache si MySQL instalat pe bucata de Ubuntu, ca în tutorialul de aici.
3. Un ip local static, pe care sa-l asignezi masinei, gen 192.0.0.4
4. Un numar de subnet mask, gen 225.225.225.0
5. Un numar de gateway default, care este de fapt ip-ul tău, iar in exemplul de mai jos va fi 192.0.5
Înainte de a porni mașina virtuală ne asigurăm că este conectată la internet printr-un "Bridge Adapter", adică click pe "Settings-Network-Attached to: BridgeAdapter":
Acestea fiind spuse, putem continua pornind mașina virtuală:
- deschidem Terminalul și edităm fișierul de interfețe cu:
sudo gedit /etc/network/interfaces
si inlocuim textul
auto eth0 iface
eth0 inet dhcp
cu:
auto eth0 iface
eth0 inet static address 192.0.0.4
netmask 255.255.255.0
gateway 192.0.5
salvăm și închidem. Ne asiguram ca gateway-ul este acelasi si in configurare cu comanda:
sudo gedit /etc/resolv.conf
iar aici ar trebui sa avem textul
# Generated by NetworkManager
domain loc
search loc
nameserver 192.0.0.4
(dacă nu e așa, îl facem noi să fie, înțelegeți ideea), salvăm și închidem.
Restartăm rețeaua cu:
sudo /etc/init.d/networking restart
iar acum, deschidem un browser pe orice calculator mai puțin pe mașina virtuală nu, și scriem ip-ul mașinii în browser: http://192.0.0.4/
Ca sa ne asigurăm că modificările noastre se petrec, putem edita fișierul default din /var/www cu
sudo gedit /var/www/index.html
Înainte de a continua acest tutorial vei avea nevoie de:
1. Una bucata Ubuntu instalată pe Virtual Box, ca în tutorialul de aici.
2. Apache si MySQL instalat pe bucata de Ubuntu, ca în tutorialul de aici.
3. Un ip local static, pe care sa-l asignezi masinei, gen 192.0.0.4
4. Un numar de subnet mask, gen 225.225.225.0
5. Un numar de gateway default, care este de fapt ip-ul tău, iar in exemplul de mai jos va fi 192.0.5
Înainte de a porni mașina virtuală ne asigurăm că este conectată la internet printr-un "Bridge Adapter", adică click pe "Settings-Network-Attached to: BridgeAdapter":
Acestea fiind spuse, putem continua pornind mașina virtuală:
- deschidem Terminalul și edităm fișierul de interfețe cu:
sudo gedit /etc/network/interfaces
si inlocuim textul
auto eth0 iface
eth0 inet dhcp
cu:
auto eth0 iface
eth0 inet static address 192.0.0.4
netmask 255.255.255.0
gateway 192.0.5
salvăm și închidem. Ne asiguram ca gateway-ul este acelasi si in configurare cu comanda:
sudo gedit /etc/resolv.conf
iar aici ar trebui sa avem textul
# Generated by NetworkManager
domain loc
search loc
nameserver 192.0.0.4
(dacă nu e așa, îl facem noi să fie, înțelegeți ideea), salvăm și închidem.
Restartăm rețeaua cu:
sudo /etc/init.d/networking restart
iar acum, deschidem un browser pe orice calculator mai puțin pe mașina virtuală nu, și scriem ip-ul mașinii în browser: http://192.0.0.4/
Ca sa ne asigurăm că modificările noastre se petrec, putem edita fișierul default din /var/www cu
sudo gedit /var/www/index.html
Cum să instalezi MongoDB pe Ubuntu
Când vine vorba de MongoDB pe Linux, treaba nu e chiar la fel de simplă ca și cu un Redis.
În primul rând trebuie să creăm un nou fisier pe care pachetul apt-get să îl citească pentru a downloada Mongo.
Deschidem Terminalul si ne logam ca admin:
sudo su
navigam in folderul de apt-get:
cd /etc/apt/sources.list.d
creăm un nou fisier cu numele 10gen.list:
touch 10gen.list
deschidem fisierul cu un editor: (eu folosesc gedit, pentru că arata mai uman decat nano sau vim)
gedit 10gen.list
adăugăm linia asta in fisierul nou creat:
deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen
salvam si inchidem fișierul 10gen.list, revenim la Terminal si facem un update:
apt-get update
instalăm Mongo:
apt-get install mongodb-10gen
iar acum vom vedea la adresa http://127.0.0.1:28017/ că rulează o instanță de Mongo (spre deosebire de Redis, Mongo vine cu un client prestabilit).
Dacă se întâmplă cumva sa nu vedeți această pagină, închideți Terminalul curent și deschideți o nouă instanță, apoi opriți sau restartați serviciul cu:
sudo service mongodb stop
sau
sudo service mongodb restart
Dacă tot nu merge, eliminați fisierul lock cu
sudo rm /var/lib/mongodb/mongod.lock
apoi apelați un repair:
mongod --repair
porniți din nou mongo cu:
sudo start mongodb
sau cu
sudo service mongodb start
și verificați dacă merge cu:
sudo status mongodb
Puteți porni acum consola de mongo scriind pur și simplu:
mongo
Restul comenzilor le găsiți în documentațiile oficiale.
Și pentru că nu-mi place să fac o treabă până la jumătate, iată cum să instalați și clasele de Mongo pentru PHP:
Downloadați în ordine următoarele pachete:
sudo apt-get install php-pear
sudo apt-get install php5-dev
sudo apt-get install libcurl3-openssl-dev
Apoi instalați serviciul pecl, dând ENTER la toate întrebările pentru o configurare default:
sudo pecl install pecl_http
Dacă aveți vreun mesaj care să vă ceară modificarea fisierului php.ini, deschideți php.ini cu
sudo gedit /etc/php5/apache2/php.ini
si adăugați linia asta la sfârșit: extension=http.so
Salvați php.ini și închideți apoi restartați serviciul apache:
sudo /etc/init.d/apache2 restart
Abia acum puteți instala extensiile php pentru Mongo:
sudo pecl install mongo
Editați din nou fisierul php.ini adaugând la final linia:
extension=mongo.so
Pentru a verifica dacă extensia funcționează, puteți foloso următorul cod:
$connection = new Mongo();
$arr=$connection->listDBs();
print_r($arr);
În primul rând trebuie să creăm un nou fisier pe care pachetul apt-get să îl citească pentru a downloada Mongo.
Deschidem Terminalul si ne logam ca admin:
sudo su
navigam in folderul de apt-get:
cd /etc/apt/sources.list.d
creăm un nou fisier cu numele 10gen.list:
touch 10gen.list
deschidem fisierul cu un editor: (eu folosesc gedit, pentru că arata mai uman decat nano sau vim)
gedit 10gen.list
adăugăm linia asta in fisierul nou creat:
deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen
salvam si inchidem fișierul 10gen.list, revenim la Terminal si facem un update:
apt-get update
instalăm Mongo:
apt-get install mongodb-10gen
iar acum vom vedea la adresa http://127.0.0.1:28017/ că rulează o instanță de Mongo (spre deosebire de Redis, Mongo vine cu un client prestabilit).
Dacă se întâmplă cumva sa nu vedeți această pagină, închideți Terminalul curent și deschideți o nouă instanță, apoi opriți sau restartați serviciul cu:
sudo service mongodb stop
sau
sudo service mongodb restart
Dacă tot nu merge, eliminați fisierul lock cu
sudo rm /var/lib/mongodb/mongod.lock
apoi apelați un repair:
mongod --repair
porniți din nou mongo cu:
sudo start mongodb
sau cu
sudo service mongodb start
și verificați dacă merge cu:
sudo status mongodb
Puteți porni acum consola de mongo scriind pur și simplu:
mongo
Restul comenzilor le găsiți în documentațiile oficiale.
Și pentru că nu-mi place să fac o treabă până la jumătate, iată cum să instalați și clasele de Mongo pentru PHP:
Downloadați în ordine următoarele pachete:
sudo apt-get install php-pear
sudo apt-get install php5-dev
sudo apt-get install libcurl3-openssl-dev
Apoi instalați serviciul pecl, dând ENTER la toate întrebările pentru o configurare default:
sudo pecl install pecl_http
Dacă aveți vreun mesaj care să vă ceară modificarea fisierului php.ini, deschideți php.ini cu
sudo gedit /etc/php5/apache2/php.ini
si adăugați linia asta la sfârșit: extension=http.so
Salvați php.ini și închideți apoi restartați serviciul apache:
sudo /etc/init.d/apache2 restart
Abia acum puteți instala extensiile php pentru Mongo:
sudo pecl install mongo
Editați din nou fisierul php.ini adaugând la final linia:
extension=mongo.so
Pentru a verifica dacă extensia funcționează, puteți foloso următorul cod:
$connection = new Mongo();
$arr=$connection->listDBs();
print_r($arr);
Abonați-vă la:
Comentarii (Atom)

















































