Skip to content

Tag: tutorial

Short urls with Glassfish+MySQL


Pipes, Creative Commons photo by flattop341.

1. The Problem

Internet is full of long urls and meaningless.

Long urls are difficult to remember or print, usually full of redundancy and low semantic. With short and meaningful urls you can avoid thes problems and even achieve profitable goals with SEO
SEO (search engine optimization) technics.

There are services like Tiny URL, Fancy URL, Moo URL and others. Although they solve part of the problems, they bring several others. Another problem is if you have a web site like example.com and use a third-party service for short urls you are losing part of your mind-share with your users and clients.

As an example, if a example.com company wants to promote a open work position would be preferable spread a example.com/jobs instead of a tinyurl.com/examplejobs, or even worst, a tinyurl.com/3i4i592 (meaningless hash).

2. Solution Approach

I created a little program called xort that can be placed on your own server and provide you own short maintening your base url.

I use a pipe abstraction. Each pipe redirects from a key url to an output url.

The idea is that you have xort installed and associated into your domain (preferably on /x). A pipe inside example.com would be like example.com/x/jobs.

3. Tools

All those tools are multi platform, open source and free.

3.1 Glassfish Application Server

Glassfish is an open source application server project led by Sun Microsystems for the Java Enterprise Edition (Java EE) platform. It’s very easy to install and run and have a very nice administration web interface where you can do from simple tasks like deploy a application to more complexes like clustering.


Glassfish Admin Console

To develop the application I’m using NetBeans 6.5 Beta that comes with Glassfish V3 prelude b15b. Netbeans also provides a integration of project, database and web server.

Nevertheless, Glassfish has no dependencies with any IDE and perfectly works by alone. If you need I wrote this post explaining how to install and deploy a application on Glassfish from scratch.

3.2 MySQL Relational Database

MySQL is a relational database management system and probably the most used database on internet (has more than 11 million installations). It’s also very easy to install and administer, through command line or many gui interfaces.

To install MySQL and JDBC driver on Ubuntu just run as root:

# apt-get install mysql-server libmysql-java

After installing and configuring it you can test the jdbc driver throught this servlet code. You can optionally register the MySQL on NetBeans to have a easier access to it thought the service tab.

At the command line you can invoke mysql command line interface and use MySql commands or SQL queries. I’ll login and create a database called xort:

$ mysql -u username -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 5.0.51a-3ubuntu5.3 (Ubuntu)

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.

mysql> create database xort;
Query OK, 1 row affected (0.06 sec)

You could also create this database by an SQL statement:

CREATE DATABASE xort;

To select the database xort:

mysql> use xort;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql>

Now we create a database called pipes with fields pin (pipe in) and pout (pipe out). They represent the input url and the output url of our pipe abstraction.

CREATE TABLE pipes (
   pin varchar(255) NOT NULL,
   pout varchar(255)
);

As we expect a lot of searches queries on this table, we can optionally create a index for it on pin field. This can reduce ours searches from O(n) to O(logn) (because pin’s will be ordered so don’t need to look all pipes, we can use logn algorithms like binary search).

CREATE INDEX pinindex ON pipes (pin);

Another trick to improve our speed is recycling connections through connection pools.

Creating a pool of MySQL connections on Glassfish is very easy. There’re two good tutorials on this subject:

And now we populate the database with some initial pipes.

INSERT INTO pipes VALUES ('blog','http://silveiraneto.net');
INSERT INTO pipes VALUES ('cejug','http://cejug.org/display/cejug/Home');
INSERT INTO pipes VALUES ('orkut','http://www.orkut.com.br/Main#Profile.aspx?rl=ls&uid=12443310329436634134');
INSERT INTO pipes VALUES ('glassfish','http://glassfish.dev.java.net');
INSERT INTO pipes VALUES ('mysql','http://dev.mysql.org');
INSERT INTO pipes VALUES ('twitter','http://twitter.com/silveira');
INSERT INTO pipes VALUES ('lab', 'http://maps.google.com/maps?f=q&geocode=&q=campus+do+pici&g=Fortaleza,+Brazil&ie=UTF8&t=h&ll=-3.745978,-38.574023&spn=0.002452,0.004823&z=18');
INSERT INTO pipes VALUES ('videos', 'http://br.youtube.com/user/NetoSilveira');
INSERT INTO pipes VALUES ('photos', 'http://flickr.com/photos/silveiraneto/');

4. Program

Basically we have just a program that implement this simple behavior:

  1. separate the key from the url.
  2. if the key is a pin from a pipe then redirect to that pout.
  3. else provide a way to create a new pipe.
  4. list all pipes.
  5. provide a way to remove a pipe.

To get the key we need to separate the proper part of the request uri:

String uri = request.getRequestURI();
String key = uri.substring(request.getContextPath().length()+1);

After that we check if it matches with a pin of some pipe. In this case we redirect user for the correspondent pout:

response.sendRedirect(pout);

Notice that using this approach we can connect a url to a extern or intern url (even to another pipe).

5. Download

Check out the xort project and sources at xort.dev.java.net:

Or grab sources and the current build with:

svn checkout https://xort.dev.java.net/svn/xort/trunk xort

Parameters can be passed by the the web.xml file:

   Set if users can add new pipes using the web interface.
allowNewPipes
true

   JDBC driver to use
driver
com.mysql.jdbc.Driver

   Username to login on the database.
username
root

   Password for the given username.
password
yourpassword

   JDBC path to database.
database
jdbc:mysql://localhost:3306/xort

Xort up and running:

[youtube]b2Mrk8XfvKk[/youtube]

Compiling Inkscape

Inkscape running

Inkscape is a Open Source vector graphics editor that works with SVG (Scalable Vector Graphics) format, Inkscape works with transparency, gradients, node editing, pattern fills, PNG export, and more. It also runs on Linux, Windows and OSX, those three are officially supported, but also runs in a broad list of Operational Systems. Is a software that I work daily and frequently is featured here in my blog.

You can download Inkscape or directly install it via some package system like Apt:

sudo apt-get install inskcape

But sometimes we need some special feature that is not available yet in the repositories or we want gain speed by having special binaries for our platforms or we want to help developing a new feature. In those cases we need to compile the software by ourself.

Those tips are valid for Ubuntu 8.04 but some part of them can be applied in others distributions. The Inkscape compiled here is the version 0.46+devel so newest versions can have compiling procedures slightly different.

Getting sources via APT.The easiest way to compile Inkscape on Ubuntu is

sudo su
apt-get build-dep inkscape
apt-get source inkscape
cd inkscape
./autogen.sh
./configure
make
make install

This will get a version of inkscape, compile it and install. If the first step doesn’t work well, you can try install all necessary packages by yourself using:

sudo apt-get install autotools-dev fakeroot dh-make build-essential autoconf automake intltool libglib2.0-dev libpng12-dev libgc-dev libfreetype6-dev liblcms1-dev libgtkmm-2.4-dev libxslt1-dev libboost-dev libpopt-dev libgsl0ldbl libgsl0-dev libgsl0-dbg libgnome-vfsmm-2.6-dev libssl-dev libmagick++9-dev libwpg-dev

Getting sources via SVN. The recipe I showed above will compile a stable version of Inkscape but not the last version of Inkscape. For that we need to grab the source directly from the Subversion repositories and so compile it.

At your home folder:

sudo apt-get install subversion
svn checkout https://inkscape.svn.sourceforge.net/svnroot/inkscape/inkscape/trunk inkscape

A alternative way to subversion is getting sources from here. Those are tarballs built every hour after someone change something in the development repositories. Download a tarball, and decompress it on your home folder.

Install all tools we need to compile Inkscape, this should fits:

sudo apt-get install autotools-dev fakeroot dh-make build-essential autoconf automake intltool libglib2.0-dev libpng12-dev libgc-dev libfreetype6-dev liblcms1-dev libgtkmm-2.4-dev libxslt1-dev libboost-dev libpopt-dev libgsl0ldbl libgsl0-dev libgsl0-dbg libgnome-vfsmm-2.6-dev libssl-dev libmagick++9-dev libwpg-dev

Enter in the directory with the Inkscape source and do:

./autogen.sh
mkdir build
cd build
../configure
make
sudo make install

In both cases, grabbing sources via svn or via apt, or can set the place where the software will be installed so it not cause conflicts with you already installed version of Inkscape. You can do that replacing the ./configure step with something like:

./configure –prefix=/home/yourname/inkscape

If you had some trouble in one of those steps, consider reading some of those other tutorials:

ps: thanks guys from the inkscape-devel@lists.sourceforge.net specially heathenx.

JavaFX, creating a sphere with shadow

This is a short tutorial about some JavaFX elements like ellipses, circles, effects and gradients.

In the first code we are creating a frame with a ellipse with center in (120,140), 60 pixels of horizontal radius, 20 pixels of vertical radius and color black. We have also a circle with center in (100,100), 50 pixels of radius and color red. The idea is make this circle appears like a sphere and make the ellipse look like a shadow.

import javafx.application.*;
import javafx.scene.paint.*;
import javafx.scene.geometry.*;

Frame {
    title: "JavaFX Sphere", width: 300, height: 300, visible: true
    stage: Stage {
        content: [
            Ellipse {
                 centerX: 120, centerY: 140, radiusX: 60, radiusY: 20
                 fill: Color.BLACK
            },
            Circle { centerX: 100, centerY: 100, radius: 50, fill: Color.RED }
        ]
    }
}

Now we will just add two thing, a effect and a radial gradient.

First we’ll just add javafx.scene.effect.* to our import list and just call the gaussian blur effect in our ellipse with

effect: GaussianBlur{ radius: 20 }

This creates a gaussian blur of radius 20. The first ellipse was like

and now with the effect becomes

Now we create a radial gradient for the circle appears like a sphere. We do that using the RadialGradient class at

RadialGradient {
   centerX: 75, centerY: 75, radius: 50, proportional: false
   stops: [
      Stop {offset: 0.0 color: Color.WHITE},
      Stop {offset: 0.3 color: Color.RED},
      Stop {offset: 1.0 color: Color.DARKRED},
   ]
}

First lets look at the gradient. It starts with a white color, going to red during the first 30% of the way. The remaining of the way is the color red going to a dark red. It creates a gradient like this one:

But it is a radial gradient, with center in (75,75) and radius 50. So this radial gradient looks like this:

As we place this radial gradient in our circle, it was like this:

And now is like this:

Now the complete code. I guess it’s simple and also concise.

import javafx.application.*;
import javafx.scene.paint.*;
import javafx.scene.effect.*;
import javafx.scene.geometry.*;

Frame {
    title: "JavaFX Sphere", width: 300, height: 300, visible: true
    stage: Stage {
        content: [
            Ellipse {
                centerX: 120, centerY: 140, radiusX: 60, radiusY: 20
                fill: Color.BLACK
                effect: GaussianBlur{ radius: 20 }
            },
            Circle {
                centerX: 100, centerY: 100, radius: 50
                fill: RadialGradient {
                    centerX: 75, centerY: 75, radius: 50, proportional: false
                    stops: [
                        Stop {offset: 0.0 color: Color.WHITE},
                        Stop {offset: 0.3 color: Color.RED},
                        Stop {offset: 1.0 color: Color.DARKRED},
                    ]
                }
            }
        ]
    }
}

Here is the final screenshot:

Script to Installing JavaFX Compiler

Right in this moment you can choose between three options to develop JavaFX:

I did this little script to download the last version of JavaFX continuos build and install it for you.

#!/bin/sh
envfile=$HOME/.bash_profile

#download and unpatch the last build of JavaFx
mkdir jfx
cd jfx
wget http://openjfx.java.sun.com/hudson/job/openjfx-compiler/lastBuild/artifact/openjfx-compiler/dist//*zip*/dist.zip
unzip dist.zip
rm dist.zip

#set files at bin folder as executable
chmod +x dist/bin/*

#add those executables to the path
echo "PATH=\$PATH:`pwd`/dist/bin" >> $envfile

Save this script as install_jfx.sh and execute it. Probably you want to execute it at you home directory. If you want to install JavaFX to root change envfile for /root/.bash_profile, if you want to install to all users change for /etc/profile. I tested this script successfully on my Ubuntu 8.04.

After that open a new terminal and try to see if javafx, javafxc and javafxdoc are available. You can test your enviroment with this simple program.

import javafx.ui.*;
import java.lang.*;

Frame {
  visible: true
  content: FlowPanel {
  content: Button {
      var n = 0
      text: bind Integer.toString(n)
      action: function() {
        n++;
      }
    }
  }
}

Save it as Counter.fx, compile with javafxc Counter.fx and so execute it with javafx Counter.fx.

To know more, take a look into the preliminary JavaFX API or in the article Using JavaFX GUI Toolkit.

Java assertion to prevent time travelers

cc broken pocket watches
Creative Commons photo by jekemp

public class PreventTimeTravelers {
    public static void main(String args[]){
        long startTime = System.currentTimeMillis();
        long endTime = System.currentTimeMillis();
        assert endTime >= startTime: "We came back in time!";
    }
}

Please do not execute this code in a time machine.

NumberFormatException Example

NumberFormatException: Thrown to indicate that the application has attempted to convert a string to one of the numeric types, but that the string does not have the appropriate format.

An simple example:

public class SummationExample {
    public static void main(String args[]){
        int sum = 0;
        for(String arg: args){
            System.out.println("+" + arg);
            sum += Integer.parseInt(arg);
        }
        System.out.println("= " + sum);
    }
}

$ javac SummationExample.java
$ java SummationExample 1 2 3 4 5
+1
+2
+3
+4
+5
= 15

but

$ java SummationExample 1 2 3 4 five
+1
+2
+3
+4
+five
Exception in thread “main” java.lang.NumberFormatException: For input string: “five”
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:447)
at java.lang.Integer.parseInt(Integer.java:497)
at SummationExample.main(SummationExample.java:6)

So

public class SummationExample {
    public static void main(String args[]){
        int sum = 0;
        for(String arg: args){
            try {
                sum += Integer.parseInt(arg);
                System.out.println("+" + arg);
            } catch (NumberFormatException e) {
                // nothing
            }
        }
        System.out.println("= " + sum);
    }
}

now

$ javac BetterSummationExample.java
$ java BetterSummationExample 1 2 3 4 5
+1
+2
+3
+4
+5
= 15

and also

$ java BetterSummationExample 1 2 3 4 five
+1
+2
+3
+4
= 10

Java Duke animated gif waving

Cannot create duplicate Solaris fdisk partitions

Eu estava com problemas para instalar o Solaris Express Community Edition b73.

Ocorria de sempre no inicio ou lá pelos 5% da instalação ela falhava. No log da instalação havia:

ERROR: Cannot create duplicate Solaris fdisk partitions (c0d0)

Isso acontecia quando eu instalava o Ubuntu e depois tentava instalar o Solaris. Quando eu tentava instalar o Solaris no disco todo não havia nenhum problema e a instalação transcorria normalmente.

Bem, o que eu acho que estava acontecendo era o seguinte. Por algum motivo o Solaris usa o mesmo código para identificar uma partição Solaris e uma partição linux-swap. Sempre que já havia alguma partição linux-swap ele iria pensar que já havia uma partição Solaris.

Para contornar isso, use uma ferramente da particionamento como o Gparted e modifique temporariamente o linux-swap para alguma outra coisa. No meu caso eu troquei para ext2.

Gparted

Depois é só instalar o Solaris normalmente e o problema não deve se manifestar sumir:

Opensolaris no notebook

Depois reformate a partição para linux-swap e torne o swap ativo:

Ativando o swap

Pronto.

Notebook Amazon PC FL 31

Como eu disse nesse outro post, eu estava procurando um modelo de notebook adequado paras minhas necessidades. Eu pesquisei bastante, colhi diversas dicas e sugestões e no final acabei fazendo uma ótima escolha, o Amazon PC FL 31.

Notebook Amazon PC FL 31
Vista frontal do Amazon PC FL 31

Nesse post eu vou fazer minha avaliação dele bem como mostrar algumas dicas para quem tem um modelo similar. Eu estou usando o Ubuntu 7.10, Gutsy Gibbon.

Monitor do sistema
O Monitor do Sistema do Gnome mostra a carga em cada core

Processador: Intel Core Duo 1.73Ghz. Cache de 1024kb. Aqui está o /proc/cpuinfo dele. O desempenho é muito bom e eu posso fazer minhas brincadeiras de computação concorrente com threads. A descrição mais detalhada, que consta no manual é: Intel Yonah FSB667 Mhz/2MbL2 Dual Core e Single Core.Memória: 1Gb de ram (). Para mim que já viva bem com 512 está ótimo e não tenho problemas em usar os meus aplicativos mais comuns, Gnome (com as extensões 3D ativadas), Firefox, Netbeans e outros aplicativos ao mesmo tempo. Mais tarde se eu quiser, eu ainda posso colocar mais um pente de 1Gb.

Tela:14.1″ WXGA TFT. É uma tela leve, com anti-reflexo e com um tamanho ideal, já que eu não gosto de monitores muito grandes. Eu uso ele com uma resolução de 1280×800 (que é bem maior do que a que eu usava no Desktop antes).

Ubuntu Compiz Cubo Gits Gimp Camera
Compiz rodando sem problemas

Vídeo: O suporte 3D está habilitado e funcionando muito bem. Foi necessário acionar o Gerenciador de Drivers Restritos. O chipset da placa mãe é Intel 945 GM + ICH7-M. O que eu tenho usado mais de suporte 3D é o Compiz que tem se saído muito bem.

Saída de vídeo

Na lateral esquerda há uma saída de vídeo para monitor externo. É um conector padrão de 15 pinos. Na Bios é possível configurar para quando você conectar no monitor externo se o LCD deverá se apagar ou não.

Saída S-Vídeo

Há também uma saída S-Video, para televisão.

Teclado do Notebook

Teclado: apesar de detestar teclados de notebook eu estou, na medida que se pode gostar de um teclado de notebook, até gostando desse aqui. As teclas não são detestavelmente leves mas também não fazem barulho.

Teclado do Notebook

A compatibilidade do Ubuntu com o teclado foi ótima, é um teclado Qwerty com cedilha e acentos. Todas as teclas de atalho estão funcionando e correspondendo com o que está escrito no teclado. Até as teclas de volume, brilho, multimídia e as teclas de chamar o gerenciador de emails e o navegador estão funcionando. Não foi preciso eu fazer nenhum configuração, funcionou de primeira.

Teclado do Notebook

A parte chata é que eles escolheram péssimos lugares para colocarem a ‘?’ e a ‘/’, preciso apertar a tecla Fn (a tecla azul de segunda função) e ‘0’ para fazer uma barra e o alt da direita e ‘W’ para fazer o ‘?’. É algo que eu ainda estou me acostumando.

Touchpad

Touchpad: funcionou bem mas como eu não faço a menor questão de usar eu comprei logo um mouse usb (de tamanho médio, para facilitar o transporte) e um mousepad bem firme. O mouse, um Genius, funcionou só plugando, sem nenhuma configuração.

Auto falantes do notebook

Som: há dois auto falantes, cada um ao lado do teclado. São bem fraquinhos mas já quebram um galho. Acho que são de 2 Watts cada um.

Microfone embutido

Há um microfone embutido, logo acima da tela. Ele não tem um alcance muito bom, então quando eu tenho que gravar algo eu uso um fone de ouvido com microfone que é mais sensível.

Saída de áudio e entrada para microfone na lateral

Além disso, na lateral direita há uma entrada de microfone e uma saída de áudio.

chave seletora do wifi

Wifi: O wifi funcionou sem problemas. No manual dizia que o wifi não iria funcionar no Linux, mas funcionou sem nenhuma configuração. Há um led indicador na frente do notebook e uma chave seletora com o ícone do wifi. Porém o led não acende (ele pisca quando eu ligo o notebook) e o comportamento do wifi não se altera quando eu ligo ou desligo a chave. Acho que é um defeito.

Drive do DVD fechado

DVD: A um drive na lateral esquerda no notebook. Eu já testei a leitura e a gravação de DVD e funcionou sem problemas. Também não foi necessário nenhuma configuração.

Drive do DVD aberto

No manual consta: combo drive 24 x Cdr W/8x DVD-ROM e DVD-Burner 4x DVD+R/-R/RW.

leds incicadores e leitora de cartão SD e MMC

Leitor de cartões: na frente do notebook há uma leitora de cartões que lê cartões SD e MMC.

leitora de cartões do notebook lendo um cartão MMC

Eu testei com um cartão MMC da Nokia, mas não aconteceu nada. A leitora funcionou que foi uma beleza. Espetei o cartão, os leds acenderam e uma janelinha saltou na tela com os arquivos. Sem configurações, sem drives, só alegria. Acho que dá primeira vez que eu tentei eu havia colocado o cartão de forma incorreta.

Entrada de rede

Rede com fios: há uma entrada de cabo de rede com fios, conector padrão RJ-45. Funcionou sem problemas.

RJ11

Há também um modem, com uma entrada para conector padrão RJ-11, na parte de trás do notebook.

Cartão PC e Cartão Express

Cartões: A duas entradas para cartões de notebook. O cartão PC (PCMCIA) e o cartão Express. Eu não tenho como testar porque não tenho nenhuma placa dessas.

Câmera integrada

Câmera: há uma câmera de 1.3 megapixels integrada. Ela não vai funcionar de primeira no Linux será necessário instalar manualmente um driver proprietário.

Se você der um lsusb você vai ver:

Bus 005 Device 002: ID 0c45:624f Microdia

A primeira coisa a fazer é baixar o pacote sn9cxxx_2.09-gutsy-1ubuntu1_i386.deb (no meu caso, que estou usando o Ubuntu 7.10). Ele está disponível aqui. Também há o mesmo driver para o Ubuntu 7.04 aqui.

Uma vez baixado, instale ele:

sudo dpkg -i sn9cxxx_2.09-gutsy-1ubuntu1_i386.deb

Agora reinicie o computador ou ative o módulo com o modprobe:

sudo modprobe sn9cxxx

Você vai notar que o arquivo /dev/video0 foi criado. Para testar a câmera você pode usar o mplayer:

mplayer tv:// -tv driver=v4l:width=640:height=480:device=/dev/video0 -vo x11

Aí está:

Eu na câmera do notebook
Sono …

A resolução está abaixo dos 1.3 megapixels já que 640×480=307200 que é 0.3 megapixels. Quando eu uso qualquer outra resolução no mplayer não dá certo, aparece só uma pequena tela, mostrando só meu rosto. 🙁

Obrigado ao Xisberto pela dica de como fazer essa câmera funcionar. O mesmo procedimento se aplica a qualquer outra câmera 0c45:624f Microdia.

Preço: essa foi a melhor parte no notebook. Eu comprei ele em uma promoção nas americanas.com e mesmo parcelado em 12 vezes eu consegui um desconto de 5%. Ele saiu por R$ 1.519,05 já com frete e todas as outras despesas. Não é a primeira vez que eu compro lá, a entrega é super rápida e segura, você acompanha tudo pela internet. Eu recomendo.

Quem mais comenta no seu blog?

Uma brincadeira de mão na massa com SQL e as tabelas do WordPress.

Logomarca do WordPress

Você vai precisar de:

  • Um blog em WordPress num servidor próprio.
  • Uma lugar onde você possa se conectar ao banco de dados (provavelmente o MySQL). Um terminal SSH no seu servidor ou mesmo o PhpMyAdmin servem.

Se você tiver acesso por SSH no servidor onde está seu blog, chame o prompt do mysql assim:

$ mysql -u USUÁRIO -p -h URL_DO_BANCO DATABASE

Trocando USUÁRIO por seu login no mysql, URL_DO_BANCO por a url do seu banco (geralmente 127.0.0.1) e DATABASE por a base de dados (geralmente wordpress). Em seguida será perguntada a sua senha.

Uma vez conectado dentro do seu banco de dados você pode executar algumas queries legais.

Os 10 maiores comentaristas do seu blog: você seleciona da wp_comments (a tabela de comentários do WordPress) selecionando só os nomes e agrupando pelo email do autor e fazendo uma contagem que chamados de quantidade. Também é feito uma ordenação usando o campo contagem. Aqui eu supondo que a pessoa sempre coloque seu próprio email, mas as vezes mude o nome, o que realmente acontece.

SELECT comment_author AS autor, COUNT(*) AS quantidade
   FROM wp_comments
   GROUP BY `comment_author_email`
   ORDER BY quantidade DESC
   LIMIT 10
;

Usando isso lá no banco de dados do eupodiatamatando.com que tem uns 3 mil comentários, deu o seguinte:

+---------------------------------------------+------------+
| autor                                       | quantidade |
+---------------------------------------------+------------+
| Silveira                                    |        511 |
| 2007 Janeiro 21 » Eu Podia Ta Matando       |        174 |
| Kct                                         |        133 |
| Filho                                       |         91 |
| Dora                                        |         83 |
| Leonardo                                    |         67 |
| manero                                      |         58 |
| Esdras                                      |         52 |
| Marlany                                     |         51 |
| Roney Marques                               |         50 |
+---------------------------------------------+------------+
10 rows in set (0.12 sec)

Ou seja, em primeiro lugar deu eu mesmo, com 511 comentários. Em segundo, o próprio blog com seus pingbacks. O maior comentarista mesmo foi o comentarista que se identifica como Kct.

Os 10 posts mais comentados: É necessário fazer uma junção entre a tabela dos comentários (wp_comments) e a tabela dos posts (wp_posts) usando o ID do post.

SELECT wp_posts.post_title, COUNT(*) AS quantidade
   FROM wp_comments JOIN wp_posts
   ON wp_comments.comment_post_ID = wp_posts.ID
   GROUP BY wp_posts.ID
   ORDER BY quantidade DESC
   LIMIT 10
;

A saída que eu tive:

+-----------------------------------------+------------+
| post_title                              | quantidade |
+-----------------------------------------+------------+
| Sobre o vôo 3054                        |        104 |
| Chegou o boneco do Capitão Nascimento!  |         80 |
| Vamos trocar links?                     |         74 |
| O celular Linux já está a venda         |         64 |
| O Que o Emo disse pra Ema?              |         57 |
| Bichos grandes. Falsificações?          |         46 |
| Esse ainda tem muito pra upar           |         45 |
| Entenda Heroes                          |         42 |
| Aqui pro iPhone!                        |         40 |
| Ganhe créditos de graça no celular      |         39 |
+-----------------------------------------+------------+
10 rows in set (0.11 sec)

Qual o post você mais comentou: Basta colocar um WHERE e pegar o autor que você quer, no caso, Silveira (eu). Eu coloquei um limite de 10, para pegar só os 10 posts que eu mais comentei.

SELECT wp_posts.post_title, COUNT(*) AS quantidade
    FROM wp_comments JOIN wp_posts
    ON wp_comments.comment_post_ID = wp_posts.ID
    WHERE wp_comments.comment_author = 'Silveira'
    GROUP BY wp_posts.ID
    ORDER BY quantidade DESC
    LIMIT 10
;

O resultado no meu blog foi:

+---------------------------------------------+------------+
| post_title                                  | quantidade |
+---------------------------------------------+------------+
| Vamos trocar links?                         |         20 |
| Regnum, RPG online gratúito                 |         11 |
| Promoção: Estamos Dando 97 dólares!         |          7 |
| Aqui pro iPhone!                            |          6 |
| Vamos escrever um livro?                    |          6 |
| Democracy TV Player                         |          5 |
| Formatura, novidades                        |          5 |
| Como eu consegui cancelar minha conta na Oi |          5 |
| Chico Buarque em Fortaleza                  |          4 |
| Livro Python Guia de Bolso                  |          4 |
+---------------------------------------------+------------+
10 rows in set (0.02 sec)

Se você quiser ir mais fundo nas consultas eu recomendo dar uma olhada na sintaxe do select do Mysql.

SSH sem senha

Em poucas palavras, dê o comando ssh-keygen no seu Linux. Você vai dar enter três vezes, a primeira para não mudar onde vai ser gravada a chave, a segunda para não escolher nenhuma senha e a terceira para confirmar que não vai usar senha:

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/silveira/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/silveira/.ssh/id_rsa.
Your public key has been saved in /home/silveira/.ssh/id_rsa.pub.
The key fingerprint is:
f4:b3:87:32:63:3d:4a:fa:83:4c:4c:52:22:31:v7:1c

Agora copiamos a chave pública RSA para a máquina onde você quer logar sem senha. Por exemplo, eu vou cópiar para uma certa máquina certamaquina.com para o usuário também chamado silveira:

scp /home/silveira/.ssh/id_rsa.pub silveira@certamaquina.com:/home/silveira/.ssh/authorized_keys

Para usar esse scp você ainda vai ter que colocar a senha. Depois que você copiou sua chave pública para o diretório .ssh do seu usuário, com o nome authorized_keys, você pode se conectar normalmente àquela máquina. Só que agora sem usar nenhuma senha.

ssh silveira@algumamaquina.com

Há um artigo mais detalhado do procedimento pode ser visto no dicas-l.