6 septembre 2008

Regex Named group

En lisant la présentation de Bruce Williams, je tombe sur une fonctionnalité très intéressante des expressions régulières sous ruby 1.9, les named group.
En particulier "?<>" qui permet d'extraire des expressions sous forme de hash. exemple :
>> "His name is Joe".match(/name is (?\S+)/)[:name]
=> "Joe"
J'adore ça.

Fait étonnant, cette fonctionnalité est déjà présente dans la dernière version de JRuby : 1.1.4 (je n'ai pas tester les précédentes).

8 avril 2008

Installer le gem memcached sous freebsd

memcached est un plugin memcache de Evan Weaver qui a des benchmarks impressionants, en effet memcached est jusqu'à 150x plus rapide que memcache-client, et jusqu'à 15x plus rapide que caffeine. Il s'appuie sur la librairie libmemcached.

Installation de libmemcached

le plugin nécessite la version 0.16.
avec portdowngrade selectionner la version 0.16.
cd /usr/ports/databases/libmemcached/ && make install clean
si durant l'installation le port libmemcached-0.16.tar.gz est introuvable le télécharger ici et le placer dans le répertoire /usr/ports/distfiles, puis relancer l'installation

Installation du gem

gem install --no-ri --no-rdoc memcached -- --with-opt-include=/usr/local/include

6 avril 2008

Configuration de base d'un serveur freebsd

Services à proscrire

Ne surtout pas activer telnetd et ftpd.

Configuration du réseau

1. /etc/rc.conf
hostname="nom_de_la_machine"
ifconfig_ed0="inet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx"
defaultrouter="xxx.xxx.xxx.xxx"

2. /etc/resolv.conf
domain mon_domaine
nameserver adresse.du.dns

Ports

1. /etc/make.conf
Fichier utilisé par make et important car les ports sont compilés avec cet outil pour la plupart d'entre eux. Ajouter la ligne suivante:
CFLAGS= -O -pipe

2. /usr/local/etc/pkgtools.conf
Fichier utilisé par portupgrade et autres portinstall. Compléter MAKE_ARGS de la façon suivante:
MAKE_ARGS = {
'java/jdk*' => 'WITHOUT_WEB=yes',
'editors/vim' => 'NO_GUI=yes',
}

3. recupération des ports
portsnap fetch && portsnap extract

Programmes de base

vim

cd /usr/ports/editors/vim && make install NO_GUI=yes clean

sudo

cd /usr/ports/security/sudo && make install clean
éditer le fichier /usr/local/etc/sudoers et ajouter la ligne:
%wheel ALL=(ALL) ALL
ici le groupe "wheel" aura le droit de faire des sudo

portupgrade

Installation:
cd /usr/ports/ports-mgmt/portupgrade; make install clean
Met à jour les applications installés via le système des ports (interactif et toutes les applications) :
portupgrade -Rria

pkg_cutleaves

Installation :
cd /usr/ports/ports-mgmt/pkg_cutleaves; make install clean

date et heure du serveur

On ne précise pas le drift, qui est par défaut dans /var/db/ntpd.drift et qu'il faut créer pour éviter les problèmes non évalués pour le moment avec un :
sudo touch /var/db/ntpd.drift
Le contenu de /etc/ntp.conf est le suivant :

# les trois pools français fournissant l'heure
server 0.fr.pool.ntp.org
server 1.fr.pool.ntp.org
server 2.fr.pool.ntp.org
# pour éviter que ce serveur soit également un serveur de temps
restrict default ignore

Dans le fichier /etc/rc.conf pour le rendre disponible au démarrage:
# Date
ntpdate_enable="YES"
ntpdate_program="/usr/sbin/ntpdate"
ntpdate_flags="-b"
ntpd_enable="YES"
ntpd_program="/usr/sbin/ntpd"

sécurisation

ttys

Mettre insecure à la place de tous les secure pour empêcher de se logguer en root (via telnet et cie)
En single-user, le password sera demandé parce que si console reste secure, le password n'est pas demandé.
vi /etc/ttys
:%s/secure/insecure/g

configuration de ssh

1. Activer dans le fichier de config /etc/rc.conf
sshd_enable="YES" 

2. Dans /etc/ssh/sshd_config, décommenter :
# interdiction du login root en ssh
PermitRootLogin no
# utile en cas de mis en place de jails
ListenAddress adresse.du.serveur 

3. Générer une clé publique et privée avec openssh du côté des machines clients se connectant au serveur FreeBSD :
ssh-keygen -t dsa (avec tous les choix par défaut).
Placer ensuite la clé publique (~/.ssh/id_dsa.pub) dans le fichier authorized_keys du répertoire .ssh de votre compte côté serveur.

firewall

1. à activer dans /etc/rc.conf via:
firewall_enable="YES"
firewall_logging="YES"
firewall_script="/etc/ipfw.rules"

2. Définir le verbose du logging dans /etc/sysctl.conf via:
net.inet.ip.fw.verbose_limit=5

3. Créer le fichier /etc/ipfw.rules avec les règles voulues

3 avril 2008

installation de mysql sous freebsd7

Installation du package

cd /usr/ports/databases/mysql51-server

make install BUILD_STATIC=yes BUILD_OPTIMIZED=yes WITH_CHARSET=utf8 WITH_COLLATION=utf8_general_ci clean

Possibilité d'ajouter l'option WITH_LINUXTHREADS=yes mais je ne sais pas si ça change quelque chose sur freebsd7 contenu des perfs de mysql

initialisation

  • initialisation de db: mysql_install_db

  • chown -R mysql /var/db/mysql/

  • chgrp -R mysql /var/db/mysql/

  • /usr/local/bin/mysqld_safe –user=mysql &

  • renseignement du password root : /usr/local/bin/mysqladmin -u root password 'newpassword'
editer /etc/rc.conf et ajouter:
mysql_enable="YES"
ajouter les règles suivantes au firewall pour mysql si vous souhaitez l'administer à distance
# Allow in/out MySQL

$cmd 00190 allow tcp from me to any 3306 out via $pif setup keep-state
$cmd 00191 allow tcp from any to me 3306 in via $pif setup keep-state


autorisé le root à distance (pas secure, seulement pour les configurations de test)
mysql -u root -p

GRANT ALL ON *.* TO root@'192.168.1.10' IDENTIFIED BY 'password';

installation ebb sous freebsd7

ebb est LE serveur web pour les applications ruby le plus rapide du moment.

installer glib2

cd /usr/ports/devel/glib20/ && make install clean

installer libev

cd /usr/ports/devel/libev/ && make install clean

installer le gem

installer ruby-gems si ce n'est pas déjà fait:
cd /usr/ports/devel/ruby-gems/ && make install clean

puis
gem install --no-ri --no-rdoc ebb

utiliser en suite ebb avec rails :
ebb_rails
ou avec merb :
merb -a ebb

15 mars 2008

fonzz.com

Un message uniquement pour dire à quel point je suis content d'avoir des retour bons et moins sur un service que nous (7theories) avons lancé.
C'est le cas pour fonZz qui a été le sujet de 3 posts cette semaine:
Et nous allons faire en sorte que ce ne soit que le début.

11 mars 2008

jquery et protect_from_forgery

protect_from_forgery est parfait pour protéger des attaques CSRF, mais il n'est pas possible d'utiliser les verbes POST, PUT, DELETE sans donner la clé au serveur.
Dans une implémentation rails classique c'est à dire avec prototype, c'est plutôt facile de faire des actions Ajax, car link_to_remote n'est autre qu'un formulaire avec la clé inclue.

Voici la solution que j'utilise avec jquery:
J'utilise des classes css sur mes liens pour dire quel verbe http utiliser. par exemple:
link_to 'toto', post_path(@post), :class => 'delete remote'

Mon code jquery pour géré le lien est les suivant:
$('a.remote.delete').bind('click',function(){
var _href = this.getAttribute('href')
$.ajax({
url: _href, data: {_method: "delete"},
beforeSend: function(xhr) {
xhr.setRequestHeader("Accept", "text/javascript")},
dataType: 'script',
type: 'DELETE'})
return false })


Jusqu'ici tout va bien... Malheureusement quand on essaie de cliquer sur le lien on aura une erreur, la clé n'est pas présente.
Donc je soumet la clé (form_authenticity_token) directement dans le lien. voici le petit helper qui m'aide à faire ça :
def secure_link_to(name, options = {}, html_options = nil, *parameters_for_method_reference)
options += (options.include?('?') ? '&' : '?') +
"#{request_forgery_protection_token.to_s}=#{form_authenticity_token}"
link_to(name, options, html_options)
end


Il suffit maintenant d'appeler:
secure_link_to 'toto', post_path(@post), :class => 'delete remote'
et le tour est joué.

10 mars 2008

4 beta invites pour github

S'il y en a que ça intéresse j'ai 4 invitations pour github, ça vous évitera d'attendre le délai de quelques jours. mailez moi à cette adresse:
ruby>> "jney@%s.com" % "7theories"

9 mars 2008

Des contraintes jusqu'à 127 caractères sous postgresql

Si vous voulez des noms de contraintes (et autres dont colonnes, fonctions,...) sous postgresql qui soient limités à 127 caractères au lieu de 63, il faut:
  • Télécharger les sources de postgresql:
    wget http://wwwmaster.postgresql.org/download/mirrors-ftp?file=%2Fsource%2Fv8.2.6%2Fpostgresql-8.2.6.tar.gz

  • Décompresser les sources:
    tar xzvf postgresql-8.2.6.tar.gz
    cd postgresql-8.2.6

  • Modifier la valeur NAMEDATALEN dans le fichier src/include/postgres_ext.h, la passer à 128 à la place de 64

  • Ensuite compiler postgresql:
    ./configure --prefix=/usr/local && make && make install



Voila, vous n'avez plus qu'à configurer normalement votre base de données préférée et vous pourrez utiliser des noms beaucoup parlant!

8 mars 2008

namespacing avec jquery

A un moment donné j'avais besoin de "namespacé" mes fonctions et plugins avec jquery donc j'avais posé la question sur le groupe jquery.

Voici le code permettant d'avoir la fonction namespace:
$.namespace = function(ns, functions){
$.fn[ns] = function() {return this.extend(functions)}
}
$.namespace('$', $.fn) // the default namespace


Une fois, cette fonction déclarée vous pouvez déclarer les namespaces que vous desirez.

exemple:
$.namespace('mon_namespace', {
ma_fonction: function(){
$(this).each(function(){alert($(this).attr('id'))})
}
})

que vous appelerez comme ceci:
$('#mon_div').mon_namespace().ma_fonction()

importer les contacts avec ruby on rails

Il est toujours intéressant de proposer à l'utilisateur d'importer les contacts de ces différents réseaux, aussi bien pour lui que pour agrandir votre propre réseau.

Importer les contacts avec rails n'a pas été si facile la seule librairie disponible été contacts. Très facile d'utilisation mais les seuls comptes fonctionnant était les comptes gmail. Ceci étant dis cette librairie a été remise à jour récemment. Donc j'imagine qu'elle doit marcher normalement maintenant.

Il y a quelques mois de ça, est sortie la librairie Blackbook, simple et fiable. Pour importer les contacts pas besoin de selectionner le réseau (hotmail, gmail, yahoo etc...), simplement login et le mot de passe et la Blackbook se débrouille :
@contacts = Blackbook.get :username => params[:email], :password => params[:password]

Ceci retournera un Array de Hash. Le soucis c'est que selon le reseau les Hash renvoyés n'auront pas les mêmes clés.
sous gmail:
{:name=>"johnny", :email=> "johnny.h@fakemail.fr"}
sous hotmail/live:
{:name=>"johnny", :email=>"", :"Windows Live ID"=>"johnny.h@fakemail.fr"}
sous yahoo:
{:name=>"mail: johnny.h@fakemail.fr ", :email=>"@yahoo.com"}

Donc le seul moyen est de parser l'Array et d'en extraire nom et email:

@contacts = @contacts.collect do |contact|
email = nil # doit être initialiser
# initialalisation du nom du contact
name = contact[:name] if !contact[:name].include?('@')
# recherche de l'email dans toutes clés du hash
contact.each_value do |e|
# on regarde avec une expression regulière
# si on trouve qqchose qui ressemble a un email
# si on trouve on passe à l'élément suivant
(email = e.match(/([_\w\d-]+(\.[_\w\d-]+)*@[\w\d-]+(\.[\w\d-]{2,})+)|(^$)/i)[0] rescue nil) && break
end
{:name => name, :email => email} if !email.blank? && !current_user.email?(email)
end.compact


Voilà, le tour est joué on se retrouve avec un array de hash bien organisé, du style:
{:name=>"johnny", :email=> "johnny.h@fakemail.fr"}
quelque soit le compte sur lequel on se connecte.

à noter que les noms ne seront pas obligatoirement bon mais le principal est d'avoir les emails pour envoyer les invitations.