19 февраля 2007

Выбор имени ребёнка

15 февраля у меня родилась дочка, и все мои планы вырастить парня, не знающего Windows, накрылись медным тазом, но не в этом дело. Дочке нужно имя. Родители советуют назвать Еленой, но судя по какому-то найденному графику, это самое распространённое имя. Жена предлагает Анну или Марию. Мои варианты -- Татьяна и Светлана.

Дабы сделать выбор абсолютно1 честным, и был написан нижеследующий сервлет, при каждом запуске выдащий произвольное сочетание одного из пяти вышеобозначенных имён с моим именем, превращённым в отчество.

package ru.unchqua.namechooser;

import java.io.IOException;
import java.io.Writer;
import java.util.Date;
import java.util.Random;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class NameChooserServlet extends HttpServlet {

private static final long serialVersionUID = 3558553303047697031L;

private static final int SECONDS = 3;

private static final String[] NAMES = {"Татьяна", "Светлана", "Елена", "Анна", "Мария"};

@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// Сессия.
HttpSession sess = req.getSession();

// Номер имени в массиве имён.
int nameidx = -1;

// Момент данного запуска.
long thisrun = new Date().getTime();

// Момент предыдущего запуска.
long lastrun = -1;
try {
lastrun = ((Long) sess.getAttribute("lastrun")).longValue();
} catch (Exception e) {
lastrun = new Date().getTime();
}

// Если запуск был более заданного числа секунд назад.
if ((thisrun - lastrun) > (SECONDS * 1000)) {
nameidx = 0;
log("Special case");
}
else {
Random rnd = new Random(sess.hashCode() ^ thisrun);
nameidx = rnd.nextInt(NAMES.length);
log("Random case");
}

// Вывод результата.
StringBuffer htmlbuf = new StringBuffer(1000)
.append("<?xml version=\"1.0\" encoding=\"KOI8-R\"?>");
.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">");
.append("<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ru\" lang=\"ru\">");
.append("<head><title>Выбор имени</title></head>")
.append("<body>");
.append("<p style=\"text-align: center; margin-top: 5em; font-size: larger\">")
.append("<span style=\"font-weight: bold;\">")
.append(NAMES[nameidx])
.append("</span>")
.append("<br/>Евгеньевна</p>")
.append("</body></html>");
String html = htmlbuf.toString();
resp.setContentLength(html.getBytes("UTF-8").length);
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
Writer out = resp.getWriter();
out.write(html);
out.flush();
out.close();

// Сохранить время последнего запуска в сессии.
sess.setAttribute("lastrun", new Long(thisrun));
}

}


1 Если присмотритесь к коду внимательнее, то поймёте, какой страшный подвох я приготовил ничего не подозревающим родственникам.

Комментариев нет: