Per ragioni che ignoro, da qualche giorno vedo tutti i miei file nascosti. Ho chiesto a google come fare per nasconderli e mi ha insegnato questo:
$ defaults write com.apple.Finder AppleShowAllFiles NO
Per ragioni che ignoro, da qualche giorno vedo tutti i miei file nascosti. Ho chiesto a google come fare per nasconderli e mi ha insegnato questo:
$ defaults write com.apple.Finder AppleShowAllFiles NO
Anche quest'anno sono stato al PhpDay. Per tutta la durata della conf era presente uno stand in cui era possibile acquistare libri con lo sconto del 40% così, in preda ad un raptus, ho comprato 4 libri e due di questi erano dedicati a Node.js. Ne sentii parlare già al PhpDay2012 ma non mi ero mai spinto a tanto (comprare dei libri su Node.js). Dopo i primi pomodori di lettura, eccomi qui a raccontarvi le mie prime impressioni.
pillole di best practices
Tanto per iniziare, i files node.js sono scritti in javascript. Per convenzione si tende ad assegnare l'estensione .njs in questo modo possiamo distinguerli dai normali .js. Questo ci permetterà di fare una netta separazione tra ciò che è javascript lato client e ciò che è javascript lato server.
il primo server http
In questo primo post dedicato a node.js il mio scopo è scrivere un triviale "Hello Simone" nel browser ottenendo il nome (Simone) attraverso la querystring. Più esattamente, richiamando la pagina http://127.0.0.1:1337/?nome=Simone dal mio browser. Iniziamo subito con le prime righe del mio http.njs:
var http = require('http');
var static = require('node-static');
Queste due righe di codice non fanno altro che caricare dei moduli di Node.js. Il modulo http è built-in dentro node, mentre node-static deve essere installato. Per farlo lanciare il comando
$ npm install node-static
I moduli vengono caricati con la funzione require, presente tra le API di Node.js.
mettersi in ascolto di una porta
Questo è tutto il codice che ci serve per metterci in ascolto della porta 1337 all'indirizzo ip 127.0.0.1 altrimenti noto come localhost. Il nostro codice, sarà in grado di ascoltare una richiesta come questa: http://127.0.0.1:1337/?nome=Simone
http.createServer(function(req, res){
// niente da fare per il momento
}).listen(1337, '127.0.0.1');
"cloniamo" $_GET di php
In PHP quando abbiamo una variabile passata tramite querystring abbiamo a disposizione un array super globale chiamato $_GET[]. Con Node.js possiamo costruircelo in questo modo. Ovviamente ci sono modi più eleganti per ottenere lo stesso risultato.
var _GET = {};
var urlparts = req.url.split('?');
if(urlparts.length>=2) {
var query = urlparts[urlparts.length-1].split('&');
for (var p=0; p<query.length; ++p){
var pair = query[p].split('=');
_GET[pair[0]] = pair[1];
}
}
Questo invece è lo snippet di codice necessario per dare risposta 200 e trasmettere una pagina di tipo text/html.
res.writeHead(200, {'Content-Type': 'text/html'});
res.end('hello ' + _GET['ciao']);
Ecco il codice del mio primo server http per intero. Se ...
otterrete un bel risultato =).
var http = require('http');
var static = require('node-static');
var file = new static.Server();
http.createServer(function(req, res){
var _GET = {};
var urlparts = req.url.split('?');
if(urlparts.length>=2) {
var query = urlparts[urlparts.length-1].split('&');
for (var p=0; p<query.length; ++p){
var pair = query[p].split('=');
_GET[pair[0]] = pair[1];
console.log(pair[0] + ' = ' + pair[1]);
}
}
res.writeHead(200, {'Content-Type': 'text/html'});
res.end('<?php echo "MOM"; ?> hello ' + _GET['ciao']);
}).listen(1337, '127.0.0.1');
console.log('Server is running');
Messo così serve davvero a poco, ma può essere l'inizio di un client FTP scritto in php. Quello che succede qui, altro non è che l'upload di un file. Con qualche altro pezzetto di codice potremmo anche cercare tutti i files di un nostro progetto e magare caricarlo per interno nel server di produzione.
<?php
$ftp_user_name = FTP_USER_NAME;
$ftp_user_pass = FTP_PASSWORD;
$server = FTP_SERVER;
$source = PATH_LOCAL_FILE;
$dest = PATH_REMOTE_FILE;
$connection = ftp_connect($server);
$login = ftp_login($connection, $ftp_user_name, $ftp_user_pass);
if (!$connection || !$login) {
die('Connection attempt failed!');
}
$upload = ftp_put($connection, $dest, $source, FTP_BINARY);
if (!$upload) {
echo 'FTP upload failed!';
}
ftp_close($connection);
Lo sviluppo di yii2 prosegue e la community è decisamente attiva. Ci teniamo al nostro framework. In particolare ho forkato il progetto ieri e prima di scrivere questo post ho fatto una pull request per vedere tutti gli aggiornamenti fatti. PHP5.3 inizia a comparire (con i namespace), e questo mi rende abbastanza contento (anche se non mi dispiacerebbe iniziare a vedere gli array in stile 5.4).
Migrations Per esempio è stata scritta la documentazione che riguarda le migrations. Io adoro questo strumento di lavoro. =) In Yii per creare una migration dobbiamo eseguire questo comando:
$ ./yiic migrate/create che_cosa_fa_la_migration
Questo comando creerà un file simile a questo:
class m101129_185401_create_news_table extends \yii\db\Migration
{
public function up()
{
$this->db->createCommand()->createTable('tbl_news, array(
'id' => 'pk',
'title' => 'string NOT NULL',
'content' => 'text',
))->execute();
}
public function down()
{
$this->db->createCommand()->dropTable('tbl_news')->execute();
}
}
è una public preview Non dimentichiamoci che si tratta di una public preview. Yii2 non è assolutamente da usare in produzione. Tanto per dirne una i namespace potrebbero cambiare (come stanno facendo) senza alcun tipo di garanzia. La roadmap di yii2 non ha milestone stabili in vista. Io mi aspetto di vedere un prodotto completo nel 2014.
Finalmente possiamo iniziare a giocare con la Public Preview di Yii2. Ci sono tantissime novità in questa nuova versione del framework. Tanto per cominciare, blueprint è stato soppiantato da bootstrap. Per ora si può fare ben poco ma vi lascio qualche piccola indicazione per provare subito il nostro nuovo giochino =).
clonare yii2
$ git clone git@github.com:yiisoft/yii2 Cloning into 'yii2'... remote: Counting objects: 7147, done. remote: Compressing objects: 100% (1698/1698), done. remote: Total 7147 (delta 5218), reused 7142 (delta 5213) Receiving objects: 100% (7147/7147), 1.87 MiB | 486 KiB/s, done. Resolving deltas: 100% (5218/5218), done.
virtualhost
Per provare mi sono costruito un semplice virtualhost con lo stesso nome del repository. Ah! Non dimenticatevi di modificare anche il file /etc/hosts aggiungendo il vostro yii2. No, questo passaggio non è necessario.
<VirtualHost *:80>
ServerAdmin admin@yourdomain.com
ServerName yii2
DocumentRoot /home/UTENTE/Sviluppo/yii2/app
DirectoryIndex index.php
<Directory /home/UTENTE/Sviluppo/yii2/app>
AllowOverride all
</Directory>
</VirtualHost>
Dentro app troviamo una piccola applicazione di esempio. Il suo solo scopo, in pratica, è mostrarci che le nuove applicazioni create con yii2 sono già integrate con bootstrap.
assets
La cartella assets non ha il permesso di scrittura quindi quel che ho fatto io per evitare di vedere strane eccezioni è:
$ chmod 777 -R yii2/app/assets/
conclusioni
Siamo a poche ore dal rilascio di yii2. Ancora non si può dire nulla.
Uno dei piccoli problemi nei quali ci si imbatte abbastanza spesso, è quello di modificare il redirect di un utente dopo aver effettuato il logout. In effetti, nel sito nel quale stavo operando, al logout venivo sempre ridirezionato alla rotta "/". Nel mio caso specifico la mia "/" è una splash page da mostrare solo al primo accesso dell'utente al mio sito web e la vera home é "/homepage". Così sono andato in SiteController::actionLogout(); per vedere come veniva eseguito prima il logout e poi il redirect:
/**
* Logs out the current user and redirect to homepage.
*/
public function actionLogout()
{
Yii::app()->user->logout();
$this->redirect(Yii::app()->homeUrl);
}
Ci sono diversi modi di modificare il redirect, per esempio potrei semplicemente sostituire Yii::app()->homeUrl con un createUrl oppure, come ho fatto nello snippet che segue, modificare al volo il valore di homeUrl utilizzato il setter messo a disposizione da CApplication.
/**
* Logs out the current user and redirect to homepage.
*/
public function actionLogout()
{
Yii::app()->user->logout();
Yii::app()->setHomeUrl('/homepage');
$this->redirect(Yii::app()->homeUrl);
}
Trovo questa una soluzione un po' costosa visto che si tira su un intero singleton. Diciamo che si poteva fare di meglio =). Però funziona. Magari con qualche commento potrei anche decidere di arricchire questo post con dei suggerimenti.
Qualche giorno fa ho seguito questa guida che insegna ad impostare il proprio ambiente di sviluppo in OsX. Ad un certo punto però mi sono imbattuto in un guaio. Il guaio è che ad ogni singolo comando, il terminale mi mostrava sempre lo stesso messaggio:
-bash: __git_ps1: command not found
La cosa è un po' fastidiosa, ma grazie a stackoverflow ho risolto. In poche parole ho installato una versione di git-completion.bash dal master dove la funzione __git_ps1 è stata spostata in un nuovo file: git-prompt.sh.
Per risolvere il problema, bisogna scaricare lo script in questione e poi eseguirlo.
$ curl -o ~/.git-prompt.sh \ https://raw.github.com/git/git/master/contrib/completion/git-prompt.sh $ source ~/.git-prompt.sh
A questo punto, potremo vedere il branch corrente nel nostro prompt =)
if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)] ) {
UIImage * image = [UIImage imageNamed:@"01_navbar_portrait.png"];
[self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
}
Ciao a tutti!!! Finalmente mi sono deciso ad eliminare wordpress per ricostruire questo blog usando yii. Per non fare troppa fatica inutile, sono partito dal blog che possiamo trovare scaricando yii.
L'ho fatto per tante ragioni:
In ogni caso mi sono scontrato subito con un problema: modificare la password presente nel file sqlite blog.db.
Ebbene, ce l'ho fatta. Ora vi mostro lo snippet che ho utilizzato:
<?php $user = new User(); ?>
<?php echo crypt('yiinotes', $user->hashPassword('yiinotes')); ?>
Anche se questo blog ha nel suo titolo Yii, vorrei trattare più temi. Ne ho almeno due particolarmente a cuore. Il primo di cui vi parlo è Symfony2.2. Da pochi giorni, infatti, è uscita la versione 2.2. In verità io attendo la versione 2.3 in quanto avremo a che fare con una LTS. Non vedo l'ora che arrivi il mese di maggio. In quei giorni, infatti, avremo il rilascio di Symfony2.3.