Общее·количество·просмотров·страницы

Java Dev Notes - разработка на Java (а также на JavaScript/Python/Flex и др), факты, события из АйТи

суббота, 31 июля 2010 г.

Настройка trac для отсылки email

Используем trac - нужно настроить отсылку сообщений по электронной почте при появлении изменений в каком-либо тикете. Подробные настройки даны на странице Email Notification of Ticket Changes в вики trac, здесь же я ограничусь описанием того, что нужно было сделать у нас в проекте.

1) Открываем файл /home/trac/project/conf/trac.ini
2) Вносим изменения:

[notification]
smtp_enabled = true
smtp_server = localhost
smtp_from = trac@example.com
smtp_replyto = project@projects.example.com
smtp_always_cc = ticketmaster@example.com, theboss+myproj@example.com


Остальные настройки закомментируем.

На этом все.

понедельник, 26 июля 2010 г.

Шпаргалка по MySQL

Небольшая шпаргалка по MySQL:

1) Просмотр имеющихся баз:

show databases;

2) Просмотр таблиц в БД:

show tables in dbname;

3) Просмотр информации о столбцах в таблице:

show [full] columns in tablename;

4) Просмотр информации о кодировках:

show character set;

5) Создание БД с кодировкой UTF-8:

create database mydb DEFAULT CHARACTER SET utf8 default COLLATE utf8_general_ci ;

воскресенье, 25 июля 2010 г.

Итерация по Enumeration

Что делать, если нужно пробежаться по java.util.Enumeration? Мне это понадобилось, когда я писал отладочный метод, выводящий все заголовки HTTP-запроса. Метод getHeaderNames() из класса javax.servlet.http.HttpServletRequest возвращает Enumeration.

Можно конечно сделать по старинке, используя hasMoreElements()/nextElement():

Enumeration headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = (String)headerNames.nextElement();
// do smth...
}


но так делать не очень-то и хотелось. Вместо этого превратим Enumeration в java.util.ArrayList и уже
по нему будем совершать итерации:

List<String> headerNames = Collections.list((Enumeration<String>)request.getHeaderNames());
for (String headerName : headerNames) {
String headerValue = request.getHeader(headerName);
// do smth....
}


Ну, и напоследок, код метода, который выводит в строку все заголовки HTTP-запроса:

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Collections;
import java.util.Enumeraion;
 
public static String httpHeadersToString(HttpServletRequest request) {
List<String> headerNames = Collections.list((Enumeration<String>)request.getHeaderNames());
StringBuilder sb = new StringBuilder();
for (String headerName : headerNames) {
String headerValue = request.getHeader(headerName);
sb.append(headerName).append("='").append(headerValue).append("'\n");
}
return sb.toString();
}

пятница, 9 июля 2010 г.

Подключение SSL к Томкату

Допустим, что нам в веб-приложении нужно иметь несколько URL, которые доступны только по HTTPS. Это может быть работа с любыми чувствительными данными: платежи, почта, и т. п. В основном, это, конечно, финансовые данные. Вот об этом и будет рассказано в этом посте.

По мотивам Setting Up SSL on Tomcat In 3 Easy Steps

Нужно сделать следующее:

  1. Сгенерировать ключ

  2. Настроить Tomcat для использования этого ключа

  3. Настроить веб-приложение на работу по HTTPS

Генерация ключа



Используем утилиту keytool:

keytool -genkey -alias jdevnotes -keypass jdevpasswd -keystore jdevnotes.keystore.bin -storepass jdevpasswd

Эта команда генерирует ключ с алиасом jdevnotes, который сохраняется в файл (keystore, хранилище ключей) jdevnotes.keystore.bin. Также задается пароль на ключ и на хранилище в целом (пароли одинаковые - jdevpasswd).

Немножко подробнее о ключах: Все ключи хранятся в хранилище ключей (файл jdevnotes.keystore.bin). Каждое хранилище может содержать множество ключей. Доступ к ключу осуществляется по алиасу. Алиасы - регистро-независимые, т.е. алиас john и JoHn - один и тот же алиас с точки зрения хранилища ключей.

При создании ключа задается также следующая информация:

What is your first and last name?
What is the name of your organizational unit?
What is the name of your organization?
What is the name of your City or Locality?
What is the name of your State or Province?
What is the two-letter country code for this unit?


Здесь вводится информация о том, кто ты такой и где находишься.

Настройка Tomcat для использования ключа



Перемещаем файлик с ключом в каталог $CATALINA_HOME/webapps. После этого редактируем файлик $CATALINA_HOME/conf/server.xml. В этом файле раскомментируем коннектор на 8443 порту, добавим ссылку на файл с ключами и пароль для хранилища, получим:

<Connector port=”8443″
maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″
enableLookups=”true” disableUploadTimeout=”true”
acceptCount=”100″ debug=”0″ scheme=”https” secure=”true”
clientAuth=”false” sslProtocol=”TLS”
keystoreFile=”/webapps/jdevnotes.keystore.bin”
keystorePass=”jdevpasswd” />


Теперь зайдите по адресу

https://localhost:8443

мы зашли на менеджер Томката по HTTPS. Теперь, любое приложение, которое развернуто на Томкате, может быть доступно как по HTTP, так и по HTTPS. Теперь рассмотрим, как сделать так, чтобы некоторые урлы были доступны только через HTTPS.

Настройка веб-приложения на работу только по HTTPS



Откроем файлик web.xml нашего приложения и добавим туда следующий код (код нужно помещать в самом конце контейнера web-app):

<security-constraint>
<web-resource-collection>
<web-resource-name>securedapp</web-resource-name>
<url-pattern>/billing/fullBalanceHistory</url-pattern>
<url-pattern>/mail/inbox</url-pattern>
<url-pattern>/somethingelse/*</url-pattern>
</web-resource-collection>
 
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>


Следующие ссылки будут доступны только по HTTPS:
/billing/fullBalanceHistory
/mail/inbox
/somethingelse/*

Если мы хотим, чтобы все приложение было доступно по HTTPS, то просто ставим паттерн /*. Если хотим вдруг выключить SSL, то для этого можно просто записать NONE в тег
<transport-guarantee>

воскресенье, 4 июля 2010 г.

Генератор паролей на Питоне

Нужно было написать генератор паролей, который бы генерировал случайные пароли заданной длины. Приведенный ниже код решает эту задачу:

import random
 
passwordSymbols = ";*()_+=-,.[]{}1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
 
def genRandomSymbols(len):
"""
:param len: length of random symbols sequence
:raise BadValueError: If len < 0
:return: The random sequence of len length.
"""

if len < 0:
raise ValueError("len should be greater or equal than 0")
elif len == 0:
return ""
else:
result = ""
for i in range(len):
result = result + random.choice(passwordSymbols)
return result
 
def main():
print genRandomSymbols(12)
 
if __name__ == "__main__":
main()

четверг, 1 июля 2010 г.

Вышел релиз Google App Engine SDK 1.3.5

Вышел релиз Google App Engine SDK 1.3.5. Release notes: http://code.google.com/p/googleappengine/wiki/SdkReleaseNotes

Новое:

  • Можно включить прекомпиляцию Питона

  • Конфигурирование лимита хранения Task Queue

  • Task Queues теперь могут иметь до 50 задач на очередь (раньше - 50 задач на приложение)

  • Программный доступ к блобам используя BlobReader - файлоподобный интерфейс для чтения блобов

  • Улучшения в BulkLoader

  • Команды remote_api_shell могут посылаться через HTTPS или HTTP.

  • Admin Console логгирует теперь время задержки запросов (request time latency).

  • Db.delete теперь принимает коллекции

  • Хранилище поддерживает концевые курсоры (end cursors)

  • Исправлено несколько багов

10 Excellent Feedback Tools for Web Designers

Как создателю сайта получить фидбек от пользователей.
10 Excellent Feedback Tools for Web Designers

Постоянные читатели