Primi passi con Docker e Prestashop 1.7

Ieri è stata la giornata del Prestashop day a Milano, un evento di cui parlerò meglio in un altro post. Quello di cui voglio parlarti oggi è come ho cominciato a smanettare con Docker.

Prestashop 1.7 è da qualche giorno in RC e ho pensato di dedicarmici un attimo per comprenderne le novità di cui ho sentito parlare e magari iniziare a produrci qualcosa.
Per scaricare questa nuova versione sono andato sulla pagina dedicata ai download delle versioni per sviluppatori e mi sono incuriosito dal prominente link con la balena che campeggia ad altezza occhio.Screenshot 2016-09-30 10.08.12.png

Ho visto e sentito grandi cose su Azure, ma per ora concentriamoci su Docker.

Cliccando il link si viene rimandati alla pagina dell’immagine da scaricare e viene proposto un comodissimo comando docker pull prestashop/prestashop  da eseguire da terminale.

Ammazza che semplicità” ho pensato, e ho capito che era giunto il momento di dare una opportunità a Docker.

Scaricato e installato il dmg, l’ho eseguito, e un balenottero si è aggiunto alle altre icone nella tray del mac. Al primo avvio un popup incita a prendere familiarità coi comandi di docker, e per comododità te li riporto tutti qui:

⇒ docker help
Usage: docker [OPTIONS] COMMAND [arg...]
docker [ --help | -v | --version ]

A self-sufficient runtime for containers.

Options:

--config=~/.docker Location of client config files
-D, --debug Enable debug mode
-H, --host=[] Daemon socket(s) to connect to
-h, --help Print usage
-l, --log-level=info Set the logging level
--tls Use TLS; implied by --tlsverify
--tlscacert=~/.docker/ca.pem Trust certs signed only by this CA
--tlscert=~/.docker/cert.pem Path to TLS certificate file
--tlskey=~/.docker/key.pem Path to TLS key file
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit

Commands:
attach Attach to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes on a container's filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container's filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on a container, image or task
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
login Log in to a Docker registry.
logout Log out from a Docker registry.
logs Fetch the logs of a container
network Manage Docker networks
node Manage Docker Swarm nodes
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart a container
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
service Manage Docker services
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
swarm Manage Docker Swarm
tag Tag an image into a repository
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
volume Manage Docker volumes
wait Block until a container stops, then print its exit code

Per ognuno di questi comandi è poi disponibile un help dedicato, ad esempio docker help run ci fornirà indicazioni sulle opzioni disponibili per il comando docker run.

Le opzioni messe a disposizione dal team Prestsahop per configurare il container sono molte, elencate in fondo alla pagina, e per utilizzarle, vanno incluse nel comando di run in uno dei due modi seguenti, dove il primo elenca le variabili di ambiente e i loro valori runtime con l’opzione -e mentre il secondo consente di utilizzare un comodo file .env che va creatoa parte

⇒  docker run -ti --name prestashop-test -p 8080:80 -d -e "PS_COUNTRY='it'" prestashop/prestashop
⇒  docker run -ti --name prestashop-test -p 8080:80 -d --env-file ".env" prestashop/prestashop

Esempio di file .env

PS_LANGUAGE="it"
PS_COUNTRY="it"

Ma attenzione, perchè una volta fatto partire il container, e avviata l’installazione ti ritroverai con un problemuccio (che a dire il vero è segnalato come important note)
Non c’è il server MySQL!!1!
(continua)

 

 

 

Pubblicità

Wordmove

Il bravissimo Andrea Barghigiani ti può spiegare in questo articolo che cos’è Wordmove e come si installa. In questo post invece, ti racconterò la mia ultima esperienza con questo ottimo tool e come ho risolto i problemi che ho incontrato.

Partiamo dal principio: l’ultima volta che ho usato Wordmove ne ero rimasto molto impressionato. E’ uno di quegli strumenti su cui puoi fare affidamento ad occhi chiusi, scommettendo mani, figli e quant’altro con i tuoi colleghi sul fatto che faccia quello che gli si dice senza darti problemi. Questa è la volta in cui ho perso mani, figli e quant’altro 🙂

Come puoi leggere nel post di Andrea, è piuttosto semplice installare Wordmove su Mac. Ma utilizzandolo con Vagrant, ti renderai subito conto che non devi utilizzarlo su mac, ma sulla tua macchina guest, che è quella che contiene il database. Quindi, se la tua Vagrant non si basa su una box che ha già installato Wordmove (come l’ottima Vccw) bisogna installarlo a manina e vediamo come.

Verificare la versione di Ruby

Alcune dipendenze di Wordmove richiedono Ruby >= 2.0.0 e la nostra piccola.. dolce.. Vagrant Machine (basata su Ubuntu 14.04) ha installato la versione 1.9. Bisogna allora aggiornarla, con questi comandi

$ sudo apt-get install python-software-properties
$ sudo apt-add-repository ppa:brightbox/ruby-ng
$ sudo apt-get update
$ sudo apt-get install ruby2.1 ruby-switch
$ sudo ruby-switch --set ruby2.1

Installare il gem

Questa è stata facile

sudo apt-get install rubygems-integration

Installare Wordmove

sudo gem install wordmove

Installare lftp

Anche questa è stata facile

sudo apt-get install lftp

Quando poi finalmente ti sembra tutto a posto e puoi eseguire il push, noterai che lftp si incazza e inizia a blaterare qualcosa riguardo ai certificati ssl. Per farlo smettere, bisogna dirgli che non ci interessa la verifica di quei certificati, impostando un parametro in ~/.lftprc
echo ssl:verify-certificate false > ~/.lftprc

Verifica e impostazione del locale

Se si sta lavorando su siti in italiano, è probabile che alla fine della push, quando stai per festeggiare che tutto è andato bene e più precisamente durante l’adattamento del dump – sì, Wordmove adatta il dump tra i vari host, si ottenga un errore del tipo “invalid byte sequence in US-ASCII”. Questo vuol dire che la tua guest non è configurata per lavorare con il locale in italiano. Per sistemare, puoi eseguire questi due comandi per generare il locale italiano e imporre l’utilizzo al sistema:

sudo locale-gen "it_IT.UTF-8"
echo "LC_ALL=\"it_IT.UTF-8\"" | sudo tee -a /etc/environment

E fu così che sono riuscito ad usare ancora una volta, con supremo piacere Wordmove, che rimane un tool insostituibile da affiancare a wp-cli.

Ora a letto bambini, che è tardi. Bambini?? Ah già li ho persi.. 😀

 

Vagrant da riga di comando, come un ninja

Se sei pigro almeno quanto me, non hai proprio voglia di dover scrivere e riscrivere sempre gli stessi comandi dal terminale. E allora cerchi delle App come Vagrant manger che ti forniscano una Interfaccia Utente in grado di farti risparmiare quel continuo battere sui tasti.

Il problema è che tu adori battere sui tasti, lo fai anche a occhi chiusi, e il solo pensiero di avere un’altra applicazione installata e residente in memoria ti urta.

E allora come si può evitare di perdere energie, soprattutto con ‘sto caldo, e massimizzare la produttività di Vagrant? Semplicissimo. Usa pure questo Gist.


alias vu="vagrant up"
alias vup="vagrant up –provision"
alias vh="vagrant halt"
alias vd="vagrant destroy"
alias vs="vagrant status"
alias vgs="vagrant global-status"
alias vsh="vagrant ssh"

view raw

vagrant.sh

hosted with ❤ by GitHub

Prego 😉

PS: Se non sai come usare il Gist qua sopra, non farti chiamare ninja dai tuoi amici, è ancora troppo presto.

Installare Virtualbox su Ubuntu 16.04

Virtualbox è una splendida applicazione di virtualizzazione dell’architettura hardware x86, che ci consente di avere più sistemi operativi avviabili in finestre separate dal nostro computer.

La versione attualmente disponibile per Linux, Windows e Mac è la 5.0.22 e oggi vedremo come installarla su Ubuntu 16.04 LTS, utilizzando il modo più semplice e veloce: un paio di click e via!

Schermata del 2016-06-19 19.18.23Cominciamo quindi scaricando il pacchetto deb dal sito ufficiale di Virtualbox, scegliendo la variante che corrisponde alla nostra architettura tra i386 (32bit) e AMD64 (64bit). Potete verificare l’architettura della vostra macchina digitando il comando uname -m che risponde con x86_64 nel caso di kernel a 64bit o i686 (o varianti iN86, dove N è 3, 4 o 5) nel caso di kernel a 32bit.

Una volta stabilità l’architettura, possiamo scaricare il pacchetto, salvarlo o aprirlo direttamente da Ubuntu Software. Se lo abbiamo salvato, una volta terminato il download, dovremmo aprire la cartella in cui è stato salvato e farci doppio clic, per aprirlo in Ubuntu Software, e un click su Installa per avviare l’installazione.

Schermata del 2016-06-19 19.29.47Schermata del 2016-06-19 19.32.50

 

 

Schermata del 2016-06-19 19.39.12Vi verrà richiesta la password di amministrazione per eseguire il comando di installazione, e in pochi secondi sarà completata e dalla dash potrete avviare l’interfaccia di amministrazione (GUI) delle vostre macchine virtuali.

Se non doveste trovare subito l’icona di Virtualbox nella dash, terminate la sessione corrente e rifate il login, la troverete dove dovrebbe essere.

 

Schermata del 2016-06-19 19.43.14

Using your API across domains

Learning is a very tight journey that never ends. Recently I faced an error never met before, on accessing a resource on a different domain via HTTP.

The error was about a browser block because of a missing header in the response, so digging about this thing I came up with its explanation, that you can find here .

This involves CORS (Cross-Origin Resource Sharing) and it restricts access to resource on the server, if they are made from scripts in different domains, for security reasons.

So if you are building an API and you want to consume it from a different domain, you must place an additional header in the response to allow the browser to get the data.

Fairly simple you should put header('Access-Control-Allow-Origin', '*') in your response headers, and replace * with the domain(s) you want to allow, if you want to enable only a few domains (* means anyone can access it).

Replace in a serialized array string

When you need to replace some values in a serialized array string, you can use the following Gist:


<?php
/**
* This function will replace a given text with a new value
* in a serialized string
*
* @param string $input serialized value to seek
* @param string $search text to be replaced
* @param string $replace replacement text
* @return string new serialized string
*/
function serialize_replace($input, $search, $replace) {
$ua = unserialize($input);
$replace_callback = function (&$value, $key, $data) {
if(!is_int($value))
$value = str_replace($data['search'], $data['replace'], $value);
};
array_walk_recursive($ua, $replace_callback , ['search' => $search, 'replace' => $replace]);
$b = serialize($ua);
return $b;
}

WWDC, E3 e Euro 2016

Ieri è stata una giornatona: 3 eventi in un solo giorno, poi ci si lamenta che non succede mai niente.

La Wordwide Developer Conference di Apple è stata teatro di importanti novità, riportate in tempo zero (o live) da praticamente tutte le testate online che si occupano di tecnologia. Una cosa che mi ha fatto molto piacere è stato il minuto di silenzio all’inizio del keynote, dedicato alle vittime della tragedia di Orlando, che dimostra la straordinaria sensibilità di Mr. Tim Cook.

Se vi siete persi il keynote, ecco una sintesi di Verge, o se avete tempo la versione integrale è qui

Per quanto riguarda le novità della conferenza internazionale sull’intrattenimento E3, le notizie che più mi hanno stupito per ora sono la nuova piccola Xbox e il ritorno di Quake, uno dei giochi a cui sono più legato dai tempi della mia adolescenza. Ecco il trailer di Quake Champions

Giusto per curiosità, anche se con il calcio non è che vado molto d’accordo, ho poi deciso di guardare la partita dell’Italia e devo ammettere che soprattutto il secondo gol mi ha sorpreso. E pensare che volevo scommettere sulla sconfitta dell’Italia, meno male che non l’ho fatto 🙂

Oh My Zsh alias list

Recently I switched the default shell from bash to zsh, thanks to this beautiful project. For the setup and config, you should wait for a next post or just follow the documentation, but in the mean time just have a look at this alias list and enjoy.

Alias Command
‘cd -‘
../..
…. ../../..
….. ../../../..
…… ../../../../..
1 ‘cd -‘
2 ‘cd -2’
3 ‘cd -3’
4 ‘cd -4’
5 ‘cd -5’
6 ‘cd -6’
7 ‘cd -7’
8 ‘cd -8’
9 ‘cd -9’
_ sudo
afind ‘ack -il’
cppcompile ‘c++ -std=c++11 -stdlib=libc++’
d ‘dirs -v | head -10’
envconfig ‘subl ~/Projects/config/env.sh’
g git
ga ‘git add’
gaa ‘git add –all’
gapa ‘git add –patch’
gb ‘git branch’
gba ‘git branch -a’
gbda ‘git branch –merged | command grep -vE “^(*|\smaster\s$)” | command xargs -n 1 git branch -d’
gbl ‘git blame -b -w’
gbnm ‘git branch –no-merged’
gbr ‘git branch –remote’
gbs ‘git bisect’
gbsb ‘git bisect bad’
gbsg ‘git bisect good’
gbsr ‘git bisect reset’
gbss ‘git bisect start’
gc ‘git commit -v’
‘gc!’ ‘git commit -v –amend’
gca ‘git commit -v -a’
‘gca!’ ‘git commit -v -a –amend’
gcam ‘git commit -a -m’
‘gcan!’ ‘git commit -v -a –no-edit –amend’
‘gcans!’ ‘git commit -v -a -s –no-edit –amend’
gcb ‘git checkout -b’
gcf ‘git config –list
gcl ‘git clone –recursive’
gclean ‘git clean -fd’
gcm ‘git checkout master’
gcmsg ‘git commit -m’
‘gcn!’ ‘git commit -v –no-edit –amend’
gco ‘git checkout’
gcount ‘git shortlog -sn’
gcp ‘git cherry-pick’
gcs ‘git commit -S’
gd ‘git diff’
gdca ‘git diff –cached’
gdct ‘git describe –tags git rev-list --tags --max-count=1
gdt ‘git diff-tree –no-commit-id –name-only -r’
gdw ‘git diff –word-diff’
gf ‘git fetch’
gfa ‘git fetch –all –prune’
gfo ‘git fetch origin’
gg ‘git gui citool’
gga ‘git gui citool –amend’
ggpull ‘git pull origin $(git_current_branch)’
ggpur ggu
ggpush ‘git push origin $(git_current_branch)’
ggsup ‘git branch –set-upstream-to=origin/$(git_current_branch)’
gignore ‘git update-index –assume-unchanged’
gignored ‘git ls-files -v | grep “^[[:lower:]]”‘
git-svn-dcommit-push ‘git svn dcommit && git push github master:svntrunk’
gk ‘\gitk –all –branches’
gke ‘\gitk –all $(git log -g –pretty=format:%h)’
gl ‘git pull’
glg ‘git log –stat’
glgg ‘git log –graph’
glgga ‘git log –graph –decorate –all’
glgm ‘git log –graph –max-count=10’
glgp ‘git log –stat -p’
glo ‘git log –oneline –decorate’
globurl ‘noglob urlglobber ‘
glog ‘git log –oneline –decorate –graph’
gloga ‘git log –oneline –decorate –graph –all’
glol ‘git log –graph –pretty=format:’\”%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset’\” –abbrev-commit’
glola ‘git log –graph –pretty=format:’\”%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset’\” –abbrev-commit –all’
glp _git_log_prettily
glum ‘git pull upstream master’
gm ‘git merge’
gmom ‘git merge origin/master’
gmt ‘git mergetool –no-prompt’
gmtvim ‘git mergetool –no-prompt –tool=vimdiff’
gmum ‘git merge upstream/master’
gp ‘git push’
gpd ‘git push –dry-run’
gpoat ‘git push origin –all && git push origin –tags’
gpristine ‘git reset –hard && git clean -dfx’
gpu ‘git push upstream’
gpv ‘git push -v’
gr ‘git remote’
gra ‘git remote add’
grb ‘git rebase’
grba ‘git rebase –abort’
grbc ‘git rebase –continue’
grbi ‘git rebase -i’
grbm ‘git rebase master’
grbs ‘git rebase –skip’
grep ‘grep –color=auto –exclude-dir={.bzr,CVS,.git,.hg,.svn}’
grh ‘git reset HEAD’
grhh ‘git reset HEAD –hard’
grmv ‘git remote rename’
grrm ‘git remote remove’
grset ‘git remote set-url’
grt ‘cd $(git rev-parse –show-toplevel || echo “.”)’
gru ‘git reset –‘
grup ‘git remote update’
grv ‘git remote -v’
gsb ‘git status -sb’
gsd ‘git svn dcommit’
gsi ‘git submodule init’
gsps ‘git show –pretty=short –show-signature’
gsr ‘git svn rebase’
gss ‘git status -s’
gst ‘git status’
gsta ‘git stash save’
gstaa ‘git stash apply’
gstd ‘git stash drop’
gstl ‘git stash list’
gstp ‘git stash pop’
gsts ‘git stash show –text’
gsu ‘git submodule update’
gts ‘git tag -s’
gtv ‘git tag | sort -V’
gunignore ‘git update-index –no-assume-unchanged’
gunwip ‘git log -n 1 | grep -q -c “--wip--” && git reset HEAD~1’
gup ‘git pull –rebase’
gupv ‘git pull –rebase -v’
gwch ‘git whatchanged -p –abbrev-commit –pretty=medium’
gwip ‘git add -A; git rm $(git ls-files –deleted) 2> /dev/null; git commit -m “–wip–“‘
history ‘fc -l 1’
l ‘ls -lah’
la ‘ls -lAh’
ll ‘ls -lh’
ls ‘ls -G’
lsa ‘ls -lah’
md ‘mkdir -p’
please sudo
po popd
pu pushd
rd rmdir
run-help man
which-command whence
zshconfig ‘subl ~/.zshrc’

Keeweb: il password manager moderno

Chi non ha almeno 50 mila password da memorizzare? Anche io. Ma recentemente ho trovato un fantastico software cross-platform che si chiama Keeweb. keeweb-demo

E’ realizzato in Electron con le moderne tecnologie web, e completamente open-source.

Fino a poco tempo fa usavo KeepassX, e questo ne è un degno successore visto che i database delle due applicazioni utilizzano lo stesso formato.

Email marketing fatto bene

Gianpaolo Antonante ha pubblicato un articolo in cui affronta il tema della promozione aziendale via mail, fornendo una serie di consigli sugli errori da evitare e nozioni molto utili sia per gli addetti ai lavori che per i manager che si trovano ad avere problemi di mancata ricezione e/o consegna delle mail su account aziendale.

Articolo originale: Email marketing da incubo