Déménagé

octobre 10, 2006

Blogged déménage.

Using Open Source projects as documentation

I’ve been gearing myself on learning Ruby On Rails for a month or so now. Having read “Agile web development with Rails” as well as the most interesting – in my opinion – recipes in “Rails Recipes” I’ve started my own project… and you’ve prolly guessed right, a(nother) CMS.

Anyhow, problems occurred rather quickly, or, were they problems? I guess that the troubles I’m running into are only related to the learning curve that is rather steep for somebody that passed the past six years working exclusively on ASP and ASP.NET applications (Although I had some PHP/Perl experience prior to that, but six years… it’s allot).

One way I cope with some issues when I don’t know the language, especially when the question is “what’s the most efficient way to…”, is to look at examples. One thing RoR isn’t lacking is open source projects you can look at to get some hints.

So what’s the most efficient way to…

Most blogs have an “archives” link section containing dates (months and years) where at least one article was posted. So I naturally needed to do the same for my own CMS.

That particular feature wouldn’t of caused me a sweat or even a thought in ASP.NET but since Rails works so closely with the database schema I felt kindof tied up by the framework which left me wondering howto achieve this properly and effectively. So I’ve looked in a popular Rails CMS application (that I wont name since I did find lots more useful hints than bad ones from this application).

Common configuration

The database schema was really similar for both the open source project and my project, plus or minus some fields. I find this happens a lot with RoR projects, must be what happens when convention is enforced (it’s really not, but considering the benefits, it’s as if it was…) and respected by the developers.

Here’s the – trimmed down – migration class:

class InitialSchema < ActiveRecord::Migration
  def self.up
    create_table :blogs do |table|
        table.column :title,        :string,  :limit => 255, :null => false
        table.column :description,  :string,  :limit => 255, :null => false
    end

    create_table :articles do |table|
      table.column :blog_id,    :integer, :null => false
      table.column :user_id,    :integer, :null => false
      table.column :title,      :string,  :limit => 255, :null => false
      table.column :content,    :text,    :null => false
      table.column :created_at, :datetime
      table.column :updated_at, :datetime
      table.column :published,  :boolean, :null => false, :default => 0
    end
  end

  def self.down
    drop_table :blogs
    drop_table :articles
  end
end

 

The solution that was proposed

The proposed solution was rather simple so I will not go through it in details here. Acknowledging you have a Blog model with a relationship to article model as follow:

class Blog < ActiveRecord::Base
  has_many :articles_published,
    :class_name => "Article",
    :conditions => "published = 1",
    :order => "created_at"
end

 

In the view used to render your archived date list you can keep the “current” year and month in a variable (initializing them at zero) and then in a for-loop on ALL of your articles display the dates when the article month or year is different than the “current” date. Sort of as follow:

<%
  currentmonth = 0
  currentyear = 0
  for article in @blog.articles_published
      if (article.created_at.month != currentmonth ||
        article.created_at.year != currentyear)
          currentmonth = article.created_at.month
          currentyear = article.created_at.year %>
      <!-- RENDER HTML -->
      <% end
  end
%>

 

Note: Rendering was sniped out there’s a more complete rendering example following.

Now this might work for a blog like mine (as of now, there’s not a whole lot of activity here). But on a larger, more active blog, if the page isn’t cached properly there’s lots of unneeded processing taking place: fetching all of the articles, for-looping unwanted items.

Integrating article archived dates in the Blog model

I didn’t like the proposed solution and knew enough to say that there probably was another way to achieve the same result without querying too much data having to for-loop that extra unneeded data. So this is what I came up with…

Consider the same Blog model but with an extra relationship as follow:

class Blog < ActiveRecord::Base
  has_many :articles_published,
    :class_name => "Article",
    :conditions => "published = 1"
    :order => "created_at"

  has_many :articles_archived_dates,
    :class_name => "Article",
    :select => "DATE_FORMAT(created_at, '%Y-%m-01') as
      ArchivedDate, Count(id) AS ArticleCount",
    :group => "ArchivedDate",
    :order => "ArchivedDate DESC",
    :conditions => "published = 1"
end

 

The second relationship adds an array of Articles objects in the Blog model containing only the date (first day of the month) and the count of articles published within that month.

Notes: For some reasons, even if you CAST AS DateTime in the SQL query, the ArchivedDate property of the Article child object of article_archived_dates will not be of DateTime type. I might also of missed something…

It basically resumes to doing the following query:

SELECT DATE_FORMAT(created_at, '%Y-%m-01') as ArchivedDate,
  Count(id) AS ArticleCount, created_at
FROM articles
WHERE (articles.blog_id = 1 AND (published = 1))
GROUP BY ArchivedDate
ORDER BY ArchivedDate DESC

 

So why not use the “:filter_sql” attribute. Well you actually can, that is, if you’re running a single blog on your site. I want to run multiple blogs on the same site. With a filter_sql statement you cannot set the needed relation blog_id dynamically according to the requested blog thus you would end up with an archived date list for all blogs.

You can then render the archive list in your view as follow:

<% for ad in @blog.articles_archived_dates -%>
  <li>
    <%= link_to
      "#{Date::MONTHNAMES[Date._parse(ad.ArchivedDate, true).values_at(:mon).to_s.to_i]}
       #{Date._parse(ad.ArchivedDate, true).values_at(:year)}",
      :controller => "yourcontroller"
      :action => "youraction",
      :month => sprintf("%02d", Date._strptime(ad.ArchivedDate).values_at(:mon).to_s),
      :year => Date._strptime(ad.ArchivedDate).values_at(:year).to_s  %>
    (<%= ad.ArticleCount %>)
  </li>
<% end -%>

 

Note: As mentioned, the ArchivedDate property is of String type so it will not carry the strftime() method allowing you to format a DateTime variable in a much more graceful manner.

This method uses a much more efficient SQL query (not querying all articles) thus minimize the for-loop. Now even if it’s included in the Blog model, unless you use “:include”, it will only be executed when invoked in the controller action or view (I personally thought it would be executed all the time).

Quoique les paroles soient assez puissantes – akh et shurik’n restent fidèles à eux-mêmes -, le clip (apparemment censuré) l’est d’autant plus cette fois-ci.

Shurik’n:

Regarde ma terre en pleure
Mais les choses ici prennent une telle ampleur
Les fils partent avant les pères, y a trop de mères en sueur
Quand les fusils de la bêtise chantent le même air en cœur
Le mangeur d’âme à chaque repas s’abreuve de nos rancœurs
Je l’entends toutes les nuits, las des fantômes qui la hantent,
Las de leurs complaintes,tellement que des fois elle en tremble
Par le sang de la haine, constamment ensemencée,au pas cadencé, Quand ce dernier chasse le vent hors des plaines
Rien n’a changé depuis, où je vis, Juifs, Catholiques,
Musulmans, noirs ou blancs, fermez vos gueules, vous faites bien trop de bruit
Comme ces orages dont l’eau se mêle à nos larmes,
Et leurs chocs sur le sol aride dont l’uranium à voler l’âme
Je veux pas d’une ville aux cimetières plus grand que la surface habitable
Même si paraît que de l’autre coté tout est plus calme, plus stable
Je veux pas qu’après le jour J, les survivants survivent sous le néon,
Trop proches du néant, car le soleil les prive de rayons
Les artères pleines d’amer comme un caddy au Géant,
On charge, on charge, à la sortie c’est tout dans les dents
J’crois que c’est dans l’ère du temps, chacun cherche son bouque émissaire
Ouais, d’une simple vie ratée à l’envoi d’une bombe nucléaire
L’amour manque d’air dans leur monde, nous on suffoque, tout ce qu’on supporte,
Ca pressurise, et c’est les psys qui vont exorciser,
Que quelqu’un me dise,si j’ai des chances de voir enfin la paix exigée.
Qu’un jour les abrutis s’instruisent,
Perché sur ma plume, j’attends c’ moment observe ce bordel
De petites flammes montées au ciel, pour elle j’ai saigné ce gospel
“Héra” se barre à tire d’ailes; las de la sève qu’on tire d’elle
On clame tous ce qu’on l’aime, mais aucun de nous n’est fidèle
Jalousie et convoitise, se roulent de grosses pelles
Quand les problèmes viennent, on règle ça à coup de grosses pêches
Et pendant ce temps là, certains amassent des sous par grosses bennes
Devine qui est ce qui creuse mais avec des plus grosses pelles
Quand est ce qu’on y arrive, là où le bonheur désaltère
Mon futur se construit, sans cris, sans mecs à terre,
Ni de centrale en fuite rien sur le compteur Gegere
Et finalement conscient qu’ici, on est que locataire
Tu parle d’une location, regarde un peu ce qu’on en a fait
Quand le vieux fera l’état des lieux, on fera une croix sur la caution
On aurait du le rendre comme on nous l’a donné,
Clean, sans taches, et innocent comme un nouveau né,
Seulement les nôtres meurent de faim en Afrique
Et y a pas assez de fric pour eux
Alors la dalle faudra la tempérer
Les hommes tombent sous les rafales racistes,
Mais on peut rien pour eux,
Alors les balles faudra les éviter
Le cul devant la télé, occupé à rêver,
le doigt poser sur la commande, on se sent exister
On râle, on gueule, on vote, espérant que ça va changer
Mais dresse tes barricades et tu les verra tous hésiter
Garni d’incompréhension et de stèles géantes,
Le globe rêve de compassion et de bourgeons renaissant sur ses branches
Les mêmes qu’on laissera crever un soir de décembre, dans le silence,
Juste un bout de carton pour s’étendre,
Tout le monde à ses chances, de quelle planète vient celui qu’à dit ça ?
Un homme politique, je crois, live de Bora Bora
Pendant que les foyers subissent, façon tora tora,
Mais bon c’est bien trop bas, alors forcément il ne nous voit pas
Parole et paroles et paroles, ils ont promis monts et merveilles,
Mais les merveilles se sont envolées,
Il reste que des monts, mais c’est raide à grimper
Et au sommet, y a que des démons en costumes cendrés
Et en bas, c’est les jeux du cirque, César Avé
Parce qu’on va se faire bouffer par des fauves qu’ils ont dressés
On note une sévère chute de sang sur la map, une montée d’air noir
Un jour on payera cher pour une bouffée d’air pur
Ici c’est chacun sa culture, chacun son racisme
Seulement sur fond blanc, c’est le noir qui reste la meilleure cible
Les temps changent c’est sur, mais y a toujours des irascibles
Ils ont le bonjour d’Henry, d’Arron, Mormeck ou Zinédine
A l’heure où les gens dînent,
Y en a encore trop cherchent, pour eux pas de 8 pièces, ils crèchent au parking
Tout le monde s’en indigne,
Ca dévalue le quartier, ça effraye mémé,
Et on sait bien ce que mémé va voter
Du haut de leurs tours de biz’, droites comme la tour de Pise
Jumelles sur le pif, ils fractionnent, divisent à leur guise
On s’étonne ensuite que ça finisse en fratricide
Car tout ce qui compte c’est de gonfler les commandes de missiles
Vive la démocratie, celle qui brandie la matraque, face à des pacifistes,
T’es pas d’accord, on te frappe,
Multirécidivistes : c’est jamais ceux là qu’on traque
Ils vivent en haut des listes et mettent leurs tronches sur les tractes
Ce monde agonise, vu ce qu’on y fait, c’était prévisible
Comme la goutte sur le front, dès que la merde se profile
Mais la peur atrophie les cœurs, peur de tout ce qu’on connaît pas
Alors on se barde de préjugés débiles
De partout les extrêmes dominent, en prime time,
A chaque fois qu’ils déciment une famille
Et bien avant ces régions où sévie la famine
Image trop crue pour un beauf devant sa viande trop cuite
Lui qui croyait que l’euro ferait beaucoup d’heureux,
Pour les vacances faudra attendre un peu ou gagner aux jeux
Mais là c’est pas trop l’heure, demain très tôt y a le taffe
Comprend ce monde va trop vite, aucune chance qu’on le rattrape
Sur la route des principes, ils ont mis des pièges à Loups,
Des gilets dynamites, et des skeud y en a un peu partout
Faudra faire gaffe aux mines, aux puits d’où la mort s’écoule
Il a beau être vif, mais à la longue il évitera pas tout
Et un de ces quatre il finira par tomber,
J’espère qu’il y a aura quelqu’un pour aider le prochain à se relever
J’espère qu’il sera pas comme le notre, aigri et crever
Et j’espère surtout que celui-là essayera pas de se faire sauter

Akhenaton:

Tu sais, on vit dans la télé,
Le globe s’est fêlé,
Ils servent de l’emballé mais en vrai c’est la mêlé
On s’prend à espérer des choses simples
Mais leur fabrique à peur s’est mise en branle
Tout ça pour les dérégler
cris sans cicatrices, terreur dans la matrice
Ils disent qu’une vie de plus à New York Paris Londres ou Madrid
Alors c’est comme ça une échelle dans la peine
On aime ces catastrophes quand des gens manquent à l’appel
Surtout s’ils nous ressemble, on les film à la morgue,
Et nous dans les sofas content d’échapper à la mort,
Il reste dans les cœurs l’anomalie appelée peur
Et grâce à ça de toute part ils ont recours à la force,
C’est une révolution, cette fois elle est de droite
Voilà pourquoi le chantage à l’emploi dans pleins de boîtes
Voilà pourquoi ils veulent à tout prix implanter la croix
Et face à la télé souvent on les croit dans leur droit,
Ils disent c’est humanitaire
Mais ils niquent les mers et la terre pour chaque écart c’est la guerre
Si le quotidien est précaire,
C’est qu’ils nous dressent à être délétères et se contenter de joies éphémères
Si l’Afrique est en colère, c’est parce que les trusts la pillent
Seuls les généraux corrompus coopèrent et jouent des vies au poker
Est-ce que la rancœur et le désir d’revanche est tout ce qu’on leur a offert?
On parle du droit des femmes quand leurs maris les frappent,
Avec des clichés religieux sortis tout droit des fables
Comme ci ici elles étaient bien depuis le Moyen-Âge
Mais c’est en 46 que c’est ouverte une nouvelle page
Maintenant elles nous valent, on dit dans les ouvrages
Pourquoi elles touchent moins de pognon à compétences égales?
Pourquoi elles seraient moins faites pour êtres responsables ?
Alors qu’elles nous ont tous torché le cul nu dans le sable
On force sur la boisson, parie sur les canassons
Mais la réalité c’est qu’ils nous font bouffer du poison
Et dans l’hôtel du bonheur beaucoup font la valise,
L’ espoir tué par des fanatiques libéralistes
Pas de bombes S.A.L , ni de grosses salves
La stratégie est simple ils exploitent et ils affament
Quand on les voit à la télé ces cons ont l’air affables
Mais le monde est à genoux quand ces bandits sont dix à table
Des comptes sous faux noms ils prétendent agir au nom de la liberté
Mais c’est la monarchie du pognon
La France et les States par factions interposées
Se livre une guerre en Afrique, et tu veux rester posé?
Freedom par-ci démocratie par-là
Mais j’ai mater sous la table et j’ai vu que c’était que des palabres
La vrai mafia non la cherche pas en Calabre ni dans ce bled
Où dans les quartiers pauvres à quarante ans on tombe malade
A fumer du mauvais tabac et manger de la merde
Où le xanax fait un tabac avec l’alcool fort
Les rues deviennent des grosses forges
Et le métal y est commun monté sur grosses crosses
La violence au quotidien de tant de gosses pauvres
Et moi j’attends l’apocalypse après cette apostrophe
J’en ai marre de tous ces mensonges qu’ils colportent
Pour les servir , dans de nombreux cas il y a mort d’homme
Tous terroristes j’entend leurs théories
Venter le sacrifice pour des principes c’est horrible
Les mômes survivent nourris à l’eau et au riz
Pendant que leur pouf se baladent à Aspen ou St Morritz
La flore crame la faune canne
Dit : c’était des barbus qui lâché l’agent orange sur le nord Vietnam ?
Non c’était les boys mais qui peut m’indiquer la justesse d’une cause
En partant de là chacun écrit ses droits
Désolé je trouve aucune excuse à Hiroshima
On peint l’histoire comme on colorie vite une image
Et peut importe qui se fait tuer chaque fois je le vit mal
On croit en nos gendarmes qui servent et nous protègent
Du moins, est ce au Rwanda quand ils jouent du lance rocket?
Pour placer le pantin qui conviendra a la France
Une casserole de plus au ministère de la défense
Il se crêpe le chignon au fond ils sont ignobles
Sur la conscience des députés y en a plus d’un million
“Quand ils font les aiguilles nos politiques ont des chignoles”
Défilent sur des chars le 14 , ils se bignolent au son de la marseillaise
Et d’une imagerie guerrière qu’ils veulent tranquillement refiler aux élèves de leur appart dans le 16
On voit un tableau différent : ils disent croire en dieu mais croit en ce qu’ils possèdent
Ils trouvent même pas un corps dans les ruines du world-trade mais sortent des débris le passeport de Mohamed
Je peux plus exprimer combien on trouve ça grotesque
Tu comprends pourquoi “ça le désire” dans les bibliothèques
Au collège de le vie ils jouent les profs d’histoire
Et abreuvent le quotidien de milles sornettes illusoires
On a battis une forteresse on l’a nommé alamut
Coincé physiquement entre garde à vue et garde à vous
Compte tenu de la pression patriotique j’admire les gens de gauche en Israël , en Amérique
est ce qu’on vaut mieux en France
désolé si j’insiste mais regardons nous franchement,
on est aussi raciste, ensuite on vend de la liberté au marché public,
putain le drame avec les valeurs de la république.
La république, elle passe ces week-end en régate
puis se prostitue de toutes part pour un airbus ou une frégate,
elle exécute dans une grotte des opposants canaques
et mange à table avec des gars style Giancanna
puis explose le rainbow warriors
et dessine les frontières du tiers monde à la terrasse du Mariot,
sponsorisent les fanatiques aux 4 coins du monde,
les entraînent aux combats et manipuler les bombes
le collier casse, ces cons échappent à tous contrôles
et quand ils mordent la main du maître alors on crie aux monstres.
ils discutent notre futur autour d’un pichet
pour notre sécurité zarma, ils veulent nous ficher.
C’est la france de derrière les stores
et j’en ai marre de me faire gruger
par des tronche de dispenser de sport.
je me bat pas pour la porche mais pour un meilleur monde
avec mes petits bras
Souvent à cette époque ou la terreur gronde
ou la frayeur monte, je travaille sur moi chaque seconde
pour être un meilleur homme.
On vit en ces temps où dans un taudis de Paris.
36 gosses meurent brûlés vifs quand les demandes en HLM dorment
depuis des années dans les archives
alors que des employés de la mairie en obtiennent avec terrasse et parking
t’appelle pas ça du racisme
après ils pleurent quand perdu on revient aux racines.
ils ont caricaturés nos discours radicaux
et l’on résumé par wesh wesh ou yo yo !
Nous complexé, si peu sûr de soi,
on s’interpelle entre nous, comme rital, rebeu ou renoi.
Chaque jour, la grande ville resserre l’étreinte
et tu peux voir les noms des nôtres évaporés écrits sur des trains.
Ma vie, un mic, une mix-tape, loin des ambitions
de ce qui sera élu président en 2007
j’adore ce moment où il dévoile le minois
de qui devra tailler des pipes monumentales au chinois.
à défaut d’argent putain, donnons du temps,
dans nos bouches le mot liberté devient insultant
car c’est les soldats qui le portent et non plus le vent
comme si le monde était rempli de cruel sultan.
Mécontent des schémas qu’on nous propose, je cultive maintenant
les roses dans mon microcosme.
Mesure les dégâts minimes que mon micro cause.
Ca ne peut qu’aller mieux alors j’attends la fin de leur monde…

World Press Photo à Montreal

septembre 3, 2006

L’exposition de World Press photo est à Montréal.

01 September 2006 – 24 September 2006

Visiting hours:
Monday – Wednesday 11.00 – 20.00
Thursday 11.00 – 24.00
Saturday and Sunday 10.00 – 19.00

Address:
Just For Laughs Museum
2111 Saint-Laurent Boulevard
Montréal (Québec) Canada
H2X 2T5
Tel +49 514 845 4000

En…

août 26, 2006

Cap Enragé

août 6, 2006

Retour de vacances…

août 5, 2006

Photos prises entre Blacks Harbour et Grand Manan Island (NB)

MTL – PANO

juillet 7, 2006

Ma première photo postée sur PPS semble avoir été bien accueillie. Les critiques peuvent être cinglantes par moment sur ce site du style "ton noir et gris" pour faire référence à un noir et blanc sans contraste. C'est ce qui m'a donné des sueurs froides lorsque j'ai procédé à l'envoi de ma photo. Bref, tout est pour le mieux et en plus d'être très motivant, c'est constructif… pas comme les commentaires sur flickr.

HDRi

mai 3, 2006

Procédé intéressant, mais bon… à mon avis, soit que c'est réussi [1][2] [3] ou que ce ne l'est pas.

Rencontre

mai 3, 2006

Texte intéressant, amusant et un peu dur à suivre par moment qui m'a été envoyé par Dodo.

- Nous nous tutoyons ou nous nous vouvoyons?
- Tutoyons-nous; vous vouvoyez souvent?
- Je tutoie comme je vouvoie
- Moi, je me tue à tutoyer, mais tout me voue à vouvoyer
- Vous nous voyez nous vouvoyer?
- Nous voirons; je veux dire, nous verrons
- Tout à fait, toutefois tout nous fait nous tutoyer; d'ailleurs, qui vous vouvoie?
- Mes parents, mais je ne les vois jamais.
- Ainsi, vos vieux vous vouvoient sans vous voir
- Et toi, qui te tutoie?
- Mon oncle, mais seulement chez moi
- Donc, ton tonton te tutoie sous ton toit
- Oui, mais mon neveu ne veut nous vouvoyer
- Et que faites-vous des dames?
- Tutoyons les veuves et vouvoyons les tantes
- Mais ma tante est veuve; elle vouvoie son toutou et tutoie sa voiture
- Vous n'aurez qu'à louvoyer, tantôt la tutoyer, tantôt la vouvoyer
- Et les nouveaux venus, les vouvoierons-nous?
- Je veux voir les nouveaux venus nous vouvoyer. Les nouveaux non vouvoyants se verront renvoyés comme des voyous
- Et les non voyants?
- Les non voyants vouvoieront!
- Même au nouvel an? J'aimerais vous y voir, sous leur nombre les non vouvoyants vont vous noyer
- Au nouvel an, votre dévoué n'envoie de voeux qu'aux vouvoyants non dévoyés.
- Vous vous fourvoyez!
- Je ne me fourvoie pas, monsieur, mais je me fous de vous revoir!
- Alors, allez vous faire voir!