Posts Tagged ‘ubuntu’

Using Chamilo juju charm to setup a dev environment on Digital Ocean

June 23, 2014 8 comments

If you’re in a hurry/on speed, know this:

  • this procedure is slightly more difficult (so longer) than installing the charm on Amazon
  • you can skip directly to “Installing Juju”
  • if you already have juju installed, you can skip to the last 2 lines of the “Installing juju” section
  • if you already have juju-docean installed and configured, you can skip directly to “Provisioning VMs”
  • otherwise, just continue reading, it’s worth a few minutes…

This tutorial regroups a lot of advanced notions, so if you want to know more about one of the following elements, please follow these links:

Before anything else, please note that the following is highly experimental. There are still a series of issues that should be worked out in order to make this process failproof.

Basic setup

Before we start using commands and stuff, you’ll have to note the following:

  • We are using a Chamilo Charm developed by José Antonio Rey (kudos to him) as a voluntary contribution to the project
  • Charms are configurations to install applications (and stuff) inside the Juju framework
  • The Juju framework is developed by the Ubuntu team, so we’re using an Ubuntu (14.04) desktop (or in this case laptop) to launch all the following
  • Digital Ocean is one cloud hosting provider, which is particularly cheap and good for development purposes. The “default” environment for Juju is Amazon, so we’ll have a few additional steps because of this choice. The Digital Ocean plugin to Juju is developed by geekmush on Github, and as far as I know he is not related to either Ubuntu nor Digital Ocean, so he is also worth praising for his contribution
  • Chamilo requires a web server and a database server. In this Charm, it is assumed that we want both of these on separate virtual machines, so you will need two of them (unless you change the parameters a little)
  • Juju is written in Go but relies on several Python libraries. As such, you’ll have to have python installed on your system and maybe Juju will shout because it is missing a few dependencies. Notably, I installed python3-yaml to avoid a few warnings (it is required for the following, although the installer for Juju says it’s optional)

Installing Juju

On a default Ubuntu desktop installation, you’ll have to install Juju first. Because we are going to use Juju connected to Digital Ocean, we need a recent version of Juju, so let’s add it the unconventional way (with the ppa), launching the following on the command line:

sudo add-apt-repository ppa:juju/devel
sudo apt-get update && apt-get install juju
juju version

For some reason, in my case, this created my home directory’s .juju/ folder with root permissions, which then prevented me to reconfigure my environment (requirement for the Digital Ocean Juju plugin), so I changed permissions (my user is “ywarnier”, so change that to your user):

sudo chown -R ywarnier:ywarnier .juju

Then we need to install the juju-docean plugin:

sudo apt-get install python3-yaml
sudo pip install -U juju-docean

Setting up Digital Ocean access

Now we need to configure our Digital Ocean (D.O.) API so the system will be able to call D.O. in our place and create instances (and stuff).

You first need to grab your API key, client ID and SSH key ID from the Digital Ocean interface. You can do that from the Digital Ocean API page. Obviously, you need a Digital Ocean account to do this and a few bucks of credit (although you can get $10 free credit from several places). If your API key says “Hidden”, that’s because you must have it stored somewhere already (for other services?). If you don’t, you’ll have to re-generate one. Your SSH key ID is the name you gave to the SSH key you use from your computer to connect to your new instances. If you don’t have it, that’s probably because you haven’t configured any. Please do in the “SSH Keys” menu item on the left side of your D.O. panel.

 export DO_CLIENT_ID=aseriesof21alphanumericalcharacters
 export DO_SSH_KEY="user@computer"
 export DO_API_KEY=aseriesof32characters

Setting up the Digital Ocean Juju environment

Now we need a bit of manual config to be able to use Digital Ocean (last bit, promised). Edit the ~/.juju/environments.yaml file and paste the following:

 type: manual
 bootstrap-host: null
 bootstrap-user: root

Just a note: the “type: manual” line implies it is a bit more complicated than on amazon later on, and we will have to launch a few more commands to provision new machines *before* we deploy Chamilo.

Generating the Juju environment

Now we’re going to create our Juju controller. The Juju controller can be an independent Virtual Machine (VM), or it can be the same as the one on which you will deploy Chamilo. It all depends on your budget and your requirements.

juju docean bootstrap --constraints="mem=1g, region=nyc1"
  2014/06/22 11:50.24:INFO Launching bootstrap host
  2014/06/22 11:51.29:INFO Bootstrapping environmen

Note that we took a decision to use a 1GB (RAM) VM here (mem=1g), in a datacenter in New York (region=nyc1). For the record, I tried creating them in nyc2, which is also a valid D.O. datacenter, but it failed miserably (sometimes not creating the VM, sometimes creating it without IP, sometimes creating it fully, but in the end never returning with a proper success response for my environment to be created), so sticking to nyc1 is probably a reasonable time-saver.

Provisioning VMs

To be able to deploy Chamilo, we’ll use two VMs: one for the web server and one for the database

juju docean add-machine -n 2 --constraints="mem=1g, region=nyc1"
2014/06/22 12:44.59:INFO Launching 2 instances
2014/06/22 12:46.42:INFO Registered id:1908893 name:digitalocean-8d14c9bc671555ff872d8d6731f84d68 ip: as juju machine
2014/06/22 12:49.08:INFO Registered id:1908894 name:digitalocean-a9ba29cfe55549f58e5f7e365199c5ed ip: as juju machine

Now, the “-n 2” above allows you to create these 2 instances, but you could also launch 2 different instances of different properties, doing it one by one. In our case, I suggest you use version Trusty of Ubuntu for the MySQL machine, to avoid a little bug in the Precise version of the charm:

juju docean add-machine --constraints="mem=2g, region=nyc1"
juju docean add-machine --series=trusty --constraints="mem=1g, region=nyc1"

The important thing here being that you can later identify the machine itself by a simple ID, using juju status:

juju status
environment: digitalocean
  agent-state: started
  agent-version: 1.19.3
  instance-id: 'manual:'
  series: precise
  hardware: arch=amd64 cpu-cores=1 mem=994M
  state-server-member-status: has-vote
  agent-state: started
  agent-version: 1.19.3
  instance-id: manual:
  series: precise
  hardware: arch=amd64 cpu-cores=1 mem=994M
  agent-state: started
  agent-version: 1.19.3
  instance-id: manual:
  series: trusty
  hardware: arch=amd64 cpu-cores=1 mem=994M

If you made a mistake at some point or just wanna try things out, you can destroy these instances with

juju docean terminate-machine 1

where “1” is the ID of the machine, as shown above before each of them.

Deploying Chamilo

Now we’ve got our machines, we just need to deploy the Chamilo Charm and the MySQL Charm (you need MySQL to run Chamilo):

juju deploy cs:~jose/chamilo --to 1
juju deploy mysql --to 2

Please note that the “–to n” option is to specify on which machine you want to deploy the selected service.

Now, we need to configure Chamilo a little. We’re going to give it a domain name (you’ll have to redirect this domain name to the IP of the first machine – the one with the Chamilo service – in order to use it when ready) and a password for the “admin” user (the user created by default):

juju set chamilo pass=blabla

Now we still need to tell Juju to link the Chamilo service with the MySQL service:

juju add-relation chamilo mysql

And finally, apply all the above and expose the chamilo service to the public:

juju expose chamilo

If something goes wrong with a service, you can always remove it with:

juju destroy-service chamilo

You can replace “chamilo” by the service with which you are having the issue, of course. If that doesn’t work out, you can always remove (terminate) the machine itself (see above).

Useful tricks

You can connect at any time to any of your virtual machines through the command

juju ssh chamilo/0

where “chamilo/0” is the name appearing below “units” in your services.

You can check the status of all your instances with

juju status

Note that, sometimes, you might end up with dozens or hundreds of instances. In this case, it won’t be as practical to show the status of all instances (I have no solution for that now, but I’m sure there is a way to filter the results of a juju status).

You can launch a command on the virtual machines’ command line like this:

juju run --service chamilo "tail /var/log/juju/unit-chamilo-0.log"

This way, you are actually executing the command remotely and getting the results locally.

You can also see the error log locally, connecting in SSH (first) and then launching:

 tail /var/log/juju/unit-chamilo-0.log

Obviously, that gives you a little more flexibility.

Notes about unexpected errors

One of the “silent” things is that Juju considers the default machine to be Ubuntu Precise. In the case of MySQL, the default Charm is configured for Trusty. This means that if you want to install this package, you need to install a virtual machine in Trusty. Otherwise, you might get some other issues. In my case, the Precise Charm didn’t really work (missing yaml), so I decided to go for Trusty.

You can choose the distribution of your machine with –series=trusty, for example:

juju docean add-machine --series=trusty --constraints="mem=2g, region=nyc1"

We tested the chamilo charm relatively extensively.

Unmounting the whole thing

If this was just a test, and you’re happy, maybe you want to remove everything. If so, the quickest way to do that is to launch a destroy-environment command, but you will first need to destroy each machine and, before that, each services that :

juju destroy service chamilo mysql
juju destroy machine 1 2
juju destroy-environment digitalocean

This should reasonnably quickly remove the whole setup.

You should still check your Digital Ocean’s dashboard, though, as apparently it doesn’t always delete the nodes you created with Juju…

Quick commands list for the impatient

Assuming you’re running Ubuntu 14.04 and that you know which values to change in the commands below:

sudo add-apt-repository ppa:juju/devel
sudo apt-get update && apt-get install juju
sudo chmod -R 0700 .juju
sudo apt-get install python3-yaml
sudo pip install -U juju-docean
export DO_CLIENT_ID=aseriesof21alphanumericalcharacters 
export DO_SSH_KEY="user@computer" 
export DO_API_KEY=aseriesof32characters
juju docean bootstrap --constraints="mem=1g, region=nyc1"
juju docean add-machine --constraints="mem=2g, region=nyc1"
juju docean add-machine --series=trusty --constraints="mem=1g, region=nyc1"
juju deploy cs:~jose/chamilo --to 1
juju deploy mysql --to 2
juju set chamilo pass=blabla
juju add-relation chamilo mysql
juju expose chamilo

And connect your browser to (that you must have redirected to the corresponding IP first) and login with admin/blabla.


1 laptop + 2 lcd = 3 pantallas para un solo escritorio, bajo Linux

December 18, 2013 Leave a comment

Por los que están interesados en aumentar su capacidad de visualización de aplicaciones en su lugar de trabajo, los costos empiezan a ponerse democráticos (pantalla 19″ alrededor de $100, adaptadores también) para extender su laptop no con una pantalla más, sino con 2.

El tema es que las cosas todavía no son “tan” sencillas (pero deberían serlo dentro de muy poco) para usuarios de Linux, porque el kernel 3.11 (el estable usado en Ubuntu 13.10) no tiene un muy buen soporte para el tipo de extensión necesario.

No os preocupeis demasiado, que el kernel 3.12 en realidad es muy sencillo instalar, gracias a nuestros amigos de Ubuntu Handbook, quienes nos dan una lista de 4 comandos que entrar en una terminal para actualizar Ubuntu 13.10 al kernel deseao. Bueno, ojo que conlleva unos riesgos, ya que podría no funcionar bien su Ubuntu con este kernel (depende mucho del hardware que uno tenga, y de los drivers que fueron instalados en este), pero de generar problemas, basta con ir a ver las opciones avanzadas de arranque de Ubuntu, seleccionar el kernel anterior (3.11) en modo normal, para volver al modo anterior y desinstalar el kernel no funcional.

En mi caso particular, como lo iba a explicar, funcionó todo bien. Seguí las instrucciones del blog de Ubuntu Handbook y reinicié mi máquina, y ya funcionó la tercera pantalla. Demostración? Aquí va…Image

(la captura está en francés, pero ya os dais una idea de lo que representa)

Entonces, cual es lo que teneis que hacer ahí? Pues es bastante simple…

Primero, hay que tener una computadora (cualquiera) con Ubuntu instalada (Debian va también), una pantalla adicional (no es necesario tener 2, pero si solo teneis una, no importa mucho fregarse todo este procedimiento) y, muy importante, un adaptador USB a VGA (o DVI).

Por ejemplo, yo me compré un Trendnet TU2-DVIV por alrededor de 50€ en una tienda cercana y me funciona bien.

Una vez todo este material listo, quizás querais probar sin actualizar el kernel. Con suerte, funciona: solo hay que prender la pantalla, conectar el cable VGA al adaptador y enchufar el otro lado del adaptador en el puerto USB de la compu. De ahí es probable que haya que ir a Configuración -> Monitores para dar clic en “Detectar pantallas”, y luego (clic en la tercera pantalla detectada) activar esta nueva pantalla (no se porque, en mi caso no se había activado sola).

Si no se detecta ninguna nueva pantalla, hay que actualizar el kernel al 3.12. Para esto, seguir el procedimiento del Ubuntu Handbook descrito arriba, reiniciar e ir a la sección Configuración -> Monitores y (me repito) activar esta tercera pantalla. Quizás reposicionarlas un poco, y listo!

Espero haya sido útil para los que no tienen idea de como hacerlo (como yo hace una semana). Ojo que se puede poner más de una pantalla via USB, dependiendo de la cantidad de puertos libres que tiene.

Debian/Ubuntu: replicar lista de paquetes a otra máquina

October 4, 2013 2 comments

Si alguna vez compraste una nueva máquina y quisiste instalar la lista de programas instalados en tu anterior, sin tener una técnica especial para hacerlo, entenderás porque me interesa mucho esta técnica en Ubuntu para automatizar el proceso…

Primero, en nuestra máquina “antigua”, usamos apt-get para generar una lista de todos los paquetes instalados en un archivo llamado paquetes.txt:

dpkg --get-selections | grep -v deinstall > paquetes.txt

Después, en la nueva máquina, actualizamos la lista de fuentes de paquetes y usamos apt-get para instalar desde nuestro archivo (que podemos copiar por un comando scp o simplemente enviárselo por correo):

apt-get update
dpkg --set-selections < paquetes.txt
apt-get -u dselect-upgrade

Y ya está! Solo hay que dejarlo descargar.

Si, además, quieres recuperar todo lo que tenías de personal en la otra máquina, puedes también copiar tu carpeta home con el siguiente comando desde la nueva máquina:

cd; rsync -avz usuario@maquina-anterior:/home/usuario/ .

Para que funcione sin problema, vale mejor guardar el mismo nombre de usuario que usabas en la máquina anterior. Sino podría generar problemas de permisos.
Se recomienda primero recuperar la carpeta de usuarios y *después* instalar los paquetes. Así, la instalación tomará en cuenta los posibles parámetros importantes al momento de arrancar estas aplicaciones.

Experimentando con Digital Ocean… primeras impresiones

September 23, 2013 4 comments

El equipo de BeezNest estuvo experimentando con el servicio de alquiler de máquinas virtuales de Digital Ocean estos 2 últimos meses, y en el espíritu del compartir, aquí les damos nuestras primeras impresiones.


Ante todo, hablemos de costos. Se pueden obtener máquinas virtuales con disco SSD a partir de $5/mes. Esto es todo incluido, pagado desde PayPal o por tarjeta de crédito. Es más, existen algunos vouchers que permiten aprovechar de promociones de $10 “para probar”.

Con una máquina virtual (llamada “droplet” en este caso) de $5/mes, que es de 512MB de memoria y 20GB de disco duro, no se hace mucho, pero es suficiente, por ejemplo, para montar un pequeño sitio web Drupal o unas instalaciones de Chamilo LMS, de momento que el uso no sea masivo.

Lo que consideramos muy bueno es la accesibilidad para unas máquinas de entrada. Como que el costo no deja realmente lugar para pensar. Además, si solo lo usa dos semanas, pagará la mitad. Se descuenta por hora. Pero ojo, hay que apagarla, sacar una imagen de backup (snapshot) y borrar la máquina para que deje de descontar…


En términos de accesibilidad (y no estamos hablando de discapacidades, sino de facilidad de acceso al servicio), el servicio es impresionante de claridad: los costos aumentan en una proporción casi igual a los recursos: $10/mes para 30GB de disco SSD, 1 core y 1GB de RAM, $20/mes para 40GB, 2 cores y 2GB de RAM, etc. La lista de costos indica hasta máquinas de 24 cores y 96GB de RAM (pero claro, ahí sale costoso, a $960/mes, pero se puede tomar por horas a $1.429/h).

La lista de costos está a un clic de la página principal del sitio, y permite ver el costo por mes y por hora.

La creación de una cuenta de usuario es sencilla (usuario y contraseña), y a partir del momento en que paga en PayPal (link “Billing” y después “Manage payments” en la interface del usuario registrado) o por tarjeta de crédito, se activa el botón de creación de imágenes. En 2 clics y 2 minutos de espera, ya tiene una máquina virtual corriendo.

Disponibilidad de imágenes predefinidas

La lista de imágenes disponibles es bastante extendida, con 9 versiones de Ubuntu (incluyendo una de Ubuntu 10.04 64bit que permite instalar facílmente un servidor de videoconferencia BigBlueButton), 4 versiones de CentOS, Debian, ArchLinux y Fedora, además de unas imágenes de aplicativos pre-instalados como WordPress o Redmine. En fin, hay para todos los gustos o casi, por lo menos en Linux.


La información comunicada por e-mail es corta y al punto para quien conoce un poco de gestión de servidores y conexiones por SSH. Después de crear una nueva imagen, el tiempo de espera para recibir el correo con los accesos es mínimo: alrededor de 1 minutos (hasta 5 minutos en un caso).


Si bien existe poca (si alguna) información en Español, la calidad y rapidez del soporte es buena. En 5 comunicaciones con ellos, el tiempo promedio de atención fue de 30 minutos (tuvimos mala suerte en un caso, al parecer, ya que la mayoría de la gente en el foro indica que dan respuesta en menos de 5 minutos, y a nosotros una vez demoró 4 horas). Existen unos temas todavía un poco obscuros, para el equipo de soporte también, como la gestión del volumen de transferencia hasta la fecha, que si bien indica un límite en las características de las imagenes, parece que todavía no está controlado.

Tampoco queda claro si, una vez que se contabilice, se podrá hacer “pooling” (es decir compartir el volumen de transferencia entre varias máquinas) y si el límite es proporcional a la cantidad de horas usadas, o si, de frente, nos dan la cantidad correspondiente a un mes de uso.


El redimensionamiento de las máquinas no se hace en caliente. Es necesario tomar un snapshot, apagar la máquina virtual y volver a crear una nueva máquina de mayor dimensión. Existe una funcionalidad de redimensionamiento (“Resize”) pero no funciona para aumentar la capacidad en disco, por lo que se recomienda proceder por el apagado y el remplazo del droplet.

El remplazo del droplet mismo mantiene la dirección IP, aunque Digital Ocean no ofrece garantía sobre este punto (pero dicen que “en general” su sistema reserva esta IP por “un rato” para usted después de que el droplet haya sido eliminado. Muy importante entonces, para no tener que redefinir nombres de dominios y cosas así, solo apagar momentáneamente sus droplets y proceder uno por uno (no apagar 4 a la vez y después volver a crear imágenes en cualquier orden).

En nuestro caso, no tuvimos problemas de redimensionamiento, pero queda claro que si usan 25GB de disco y redimensionan a un droplet de 20GB de disco, van a enfrentarse con problemas…


El mayor problema que encontramos hasta la fecha fue la imposibilidad de redimensionar o distribuir a su gusto las particiones en el disco de las imágenes proveidas. Esto impide una serie de cosas, como el compartido de particiones entre varias máquinas (NFS, OCFS2, etc) y el uso de espacios de swap (en caso pase encima de la memoria autorizada).


Digital Ocean ofrce una API REST muy simple y bonita que permite crear nuevas imágenes a partir de un snapshot y un número de tipo de droplet, apagarlas, redimensionarlas, reiniciarlas, etc.

Como es REST, se puede probar hasta a partir de la ruta de un navegador.

También econtramos una librería PHP (de terceros) ya preparada para el uso de esta API, lo que reduce todavía los obstáculos para armar un sistema de gestión bien concreto con redimensionamiento adaptativo.

Esto siendo dicho, el panel de control todavía no ofrece opciones avanzadas para el redimensionamiento.

Calidad de las máquinas y servicios

Aunque no hayamos hecho benchmarking en los discos, como es de esperar para un disco SSD (que no presenta los mismos defectos que discos magneticos para el contexto de máquinas virtuales), el disco parece muy rápido.

También parecen tener mirrors de Debian y Ubuntu en su red, ya que la descarga de nuevos paquetes y las actualizaciones de estos dos sistemas es fulgurante (llegamos a 10MB/s para la instalación de BigBlueButton, que requiere más de 800MB de descarga).

Cuando se usan al extremo y se alcanza el límite de memoria, los servicios corriendo en la máquina se apagan, como es de esperar bajo Linux, por lo que es importante medir bien las primeras utilizaciones y dimensionar correctamente la máquina virtual.

Últimamente, y bajo presión popular al parecer, se agregó private networking dentro del segundo data center de Nueva York (y solo este). No hemos podido probarlo, pero entendemos que este permite generar menor latencia entre máquinas, en particular para el caso de replicación de bases de datos MySQL, por ejemplo.

Puede definir registros PTR a través de la interface.


En una (sola) oportunidad, quisimos acceder al panel de control un domingo en la mañana para redimensionar una máquina pero no se pudo, lo que nos generó bastante preocupación, pues no habíamos visto ninguna información correspondiente acerca de esta indisponibilidad. Todo el sitio de Digital Ocean siendo inaccesible, no pudimos verificar que estaba pasando, y solo teníamos una máquina virtual levantada, que no respondía. Por lo tanto, nos fue imposible determinar si esto había sido un caso excepcional o algo común. De lo observado desde este entonces (hace más de un mes ahora), no fue posible volver a observar este problema.


En esta etapa, todavía sigue siendo difícil entender exactamente el compromiso de Digital Ocean en términos de persistencia de los datos y de disponibilidad de la infraestructura, por lo que preferimos no usarlo para sistemas críticos. La dificultad de compartir particiones rinde imposible o por lo menos impráctico la elaboración de clusters totalmente redundantes. Esperamos encontrar una solución acerca de esto pronto.

Por lo general, estamos impresionados por la calidad del servicio ofrecido por Digital Ocean, en comparación con su costo, y recomendamos a todos los desarrolladores web trantando de comprobar la validez de nuevos sistemas de usar sus máquinas virtuales. Son muy prácticas y eficientes. Solo no se olviden de apagarlas y destruir el droplet después de haber tomado un snapshot para no seguir pagando mientras no las usan. Los montos pueden subir rápidamente, pero creemos que definitivamente representa un ahorro considerable en consideración del tiempo que se podría dedicar normalmente a la configuración de todas estas máquinas virtuales en un ambiente propio.

Volumen de alertas de Skype en Ubuntu

Si tiene el mismo problema que yo con el audio de Skype que no se escucha bajo Ubuntu, la respuesta está aquí:

El problema es que Skype usa Pulse Audio por defecto y que este no se configura por el gestor de volumen normal de Ubuntu. En realidad, si pone su audio a lo máximo, escuchará que sí suena, pero muy muy *muy* bajo.

Para arreglar, basta con instalar un gestor de volumen de Pulse Audio y cambiar el volumen:

sudo apt-get install pavucontrol


y ahí verá que la prima barra deslizable de volumen se llama “Sonidos del sistema”. Póngala a 100%. Ya está, ahora Skype suena normal (puede probarlo llendo en las opciones de Skype > Alertas > Reproducir el audio de “Llamada entrante”, por ejemplo).

Bueno, queda claro que no debería usar skype en un primer lugar porque no es software libre, pero si tiene que comunicarse con alguien lejos que no tiene un buen teléfono IP con su central para mejorar software libre… queda siendo una alternativa interesante.

Installing SoulFu on Ubuntu 12.04 64bit

September 23, 2012 Leave a comment

If you ever want to install the amazing multiplayer SoulFu medieval-fantasy game from Aaron Bishop (up to 4 players with joysticks & keyboard on a single computer) on your Ubuntu 12.04 (Precise) 64bit, follow the howto below. The most problematic point is that it depends on libjpeg62 compiled in a 32bit version. To install this one (although you’re running on 64bit) you need to issue a specific “apt-get install libjpeg62:i386” command (instead of the same version without :i386).

Follow the guide here: Namely, issue the following commands:

wget -q -O- | sudo apt-key add -
sudo echo "deb precise-getdeb games" >> /etc/apt/sources.list.d/playdeb.list
apt-get update
apt-get install soulfu libjpeg62:i38

Then launch SoulFu to start playing:


Enable Tagalog fonts in Firefox/Ubuntu

July 30, 2012 1 comment

Tagalog is the national language of Philippines and, although it’s now written mainly in latin fonts (as Wikipedia reports), it can also be found written using the Baybayin script.Well, somehow, it seems difficult to find any relevant information on how to display Baybayin fonts in your browser in Ubuntu. After a little bit of common web research, then a bit of trial-and-error research, I found out you can install the required fonts by installing the “unifont” package:

sudo apt-get install unifont

Then just refresh your browser and you’re ready to read this very exotic writing!

Did you know we were going to have a Tagalog translation for Chamilo soon? It’s been financed by the Linux Fund, and we’re very glad they did!

%d bloggers like this: