Генерация идентификатора пользователя посредством PL/PGSQL
Возможности реляционных баз данных PostgreSQL можно существенно расширить за счет процедур на специальном языке — PL/PSQL. Он очень прост, существует давно и поэтому весьма стабилен. Дополнительным удобством является то, что вызов процедуры — это транзакция, поэтому если при ее выполнении происходит какой-нибудь сбой, данные не теряются. Просто происходит откат к прежнему состоянию.
На PL/SQL можно не только производить действия с таблицами, но и писать программы, возвращающие те или иные значения. Вот как, например, можно генерировать идентификатор пользователя, построенный по принципу «3 буквы 6 цифр» (при этом, правда, должен поддерживаться тип данных uuid, но о нем в другой раз):
На PL/SQL можно не только производить действия с таблицами, но и писать программы, возвращающие те или иные значения. Вот как, например, можно генерировать идентификатор пользователя, построенный по принципу «3 буквы 6 цифр» (при этом, правда, должен поддерживаться тип данных uuid, но о нем в другой раз):
create or replace function new_uid() returns varchar(9) as $$
declare
new_uuid text := uuid_generate_v4();
letters text := regexp_replace(upper(new_uuid), '[0-9]|-', '', 'g');
digits text := regexp_replace(upper(new_uuid), '[A-Z]|-', '', 'g');
uid_to_return varchar(9) := substring(letters from 1 for 3)||substring(digits from 1 for 6);
rw users%rowtype;
begin
if uid_to_return !~ '[A-Z]{3}[0-9]{6}' then
raise exception 'Какой-то херовенький идентификатор получился - %. Такое бывает редко, попробуйте еше раз.', uid_to_return;
end if;
select * from users where id = new_uuid into rw;
if found then
raise exception 'Пользователь с таким идентификатором уже есть в базе.';
end if;
return uid_to_return;
end
$$ language plpgsql;
Повстанцы-самоделкины
Сирийские повстанцы самостоятельно изготавливают вот такие танки:

Смешно, конечно, но каких-то 20-30 лет назад могущественная китайская промышленность начиналась с таких же самопалов.
Ах, да, кстати: может кто-то еще не видел:
( Читать дальше )

Смешно, конечно, но каких-то 20-30 лет назад могущественная китайская промышленность начиналась с таких же самопалов.
Ах, да, кстати: может кто-то еще не видел:
( Читать дальше )
Node.js: раздача бинарных файлов
Очень часто с веб-сервера требуется отправить браузеру картинку с динамически заданными характеристиками. Пример — аватарка пользователя, в случае отсутствия которой выдается картинка с серым силуэтом. Вот как это можно сделать:
Здесь getPath() — абстрактная функция, возвращающая путь до файла-картинки. Ее можно конкретизировать в зависимости от ситуации.
app.get('/getAvatar', function (req, res) {
var uid = req.query.uid;
['jpeg', 'png', 'gif'].forEach(function(item){
var fn = getPath(uid, item);
if(fs.existsSync(fn)){
var img = fs.readFileSync(fn);
res.writeHead('200', {'Content-Type': 'image/' + item});
res.end(img, 'binary');
return;
}
});
res.writeHead('200', {'Content-Type': 'image/png'});
var img = fs.readFileSync('/path/to/nobody.png');
res.end(img, 'binary');
});
function getPath(uid, ext){
// TODO ...
return hz;
}
Здесь getPath() — абстрактная функция, возвращающая путь до файла-картинки. Ее можно конкретизировать в зависимости от ситуации.
- —
- 12 декабря 2012, 22:47
- комментировать
Slax: снова в строю
После трех лет молчания Томаш Матейчек допилил-таки до современного состояния свой портативный дистрибутив Slax.
Появление нового дистрибутива воспринимается нынче как явление обыденное, с ними как с полетами в космос: сначала каждому радовались, а потом и со счету сбились. Но Slax — случай особый. За ним кроется не только подбор ПО и подгонка ОС под определенные нужды, но и оригинальная методология создания живых дистрибутивов, т.е. работающих без установки. На ее основе развилось немало вполне зрелых пректов (Salix, Porteus, тот же Superb Mini Server, например). Только вот сам Slax в какой-то момент пропал с радаров… Ан нет, оказывается, не пропал!

Про сам дистрибутив сказать пока не могу ничего, кроме того, что прочитал в новостях, но на нетбук его обязательно установлю, после чего поделюсь впечатлениями. Нисколько не сомневаюсь, что их будет много.
Появление нового дистрибутива воспринимается нынче как явление обыденное, с ними как с полетами в космос: сначала каждому радовались, а потом и со счету сбились. Но Slax — случай особый. За ним кроется не только подбор ПО и подгонка ОС под определенные нужды, но и оригинальная методология создания живых дистрибутивов, т.е. работающих без установки. На ее основе развилось немало вполне зрелых пректов (Salix, Porteus, тот же Superb Mini Server, например). Только вот сам Slax в какой-то момент пропал с радаров… Ан нет, оказывается, не пропал!

Про сам дистрибутив сказать пока не могу ничего, кроме того, что прочитал в новостях, но на нетбук его обязательно установлю, после чего поделюсь впечатлениями. Нисколько не сомневаюсь, что их будет много.
Выгрузка файлов с помощью Node.js
Выгрузка файлов через веб-форму на всех языках программирования является задачей несколько более сложной, чем просто извлечение параметров, переданных с помощью методов GET или POST. Несколько раз реализовывал такое на Java и могу сказать, что без привлечения специальных библиотек за это лучше не браться. До недавних пор написание программы выгрузки на node.js тоже требовало довольно большого количества строк, но несколько месяцев назад в проекте express появились средства, сводящие задачу к сущим пустякам.
Это полноценная программа, готовая к запуску! Естественно, нужно добавить проверки на ошибки и т.п., но лаконичность средств node.js воистину потрясает.
var express = require('express');
var fs = require('fs');
var app = express();
app.use(express.bodyParser()); // без этой строчки не работает!
app.use(express.limit('1mb')); // лимит на размер выгружаемого файла
app.post('/avatarUpload', function (req, res) {
var targetPath = '/tmp/avatar.jpg';
var tmpPath = req.files.avatar.path;
fs.rename(tmpPath, targetPath, function(err){
res.send(err ? 'Ничего не получилось.' : 'Выгрузка завершена успешно.');
});
});
Это полноценная программа, готовая к запуску! Естественно, нужно добавить проверки на ошибки и т.п., но лаконичность средств node.js воистину потрясает.
Готовая среда для Java-разработчика от Oracle
В организации, где я сейчас работаю, на Java пишется почти всё, причем разработка ведется в консольном режиме. Чтобы каждый раз заново не настраивать среду разработки, имеется готовая виртуальная машина в формате VirtualBox. Она содержит уже установленные инструменты (ant, git, vim) и используется как для обучения, так и для работы. Однако нередко можно слышать ропот: люди хотят пользоваться графическими средами. К тому же наша виртуальная машина, выложенная на Яндекс.Диск, плохо загружается у обладателей не очень надежных Интернет-каналов. Все-таки там более 4 Гб.
Ну что-ж, тогда встречайте: настроенная виртуальная машина для Java-разработки от самого Oracle! В состав входят NetBeans для любителей гуёвых IDE, а также сервер приложений GlassFish. Всё это установлено на фирменный оракловский Linux (гы-гы-гы… уши CentOS торчат с первых минут загрузки).

При установке вас ожидает небольшой квест. Во-первых, нужно зарегистрироваться на сайте Oracle. Без авторизации скачивать не дают. Во-вторых, образ виртуального диска выложен 4-мя кусочками (3 по 700 и еще 200+ Мб). Для их склеивания прилагается нехитрый батничек (assemble.cmd). В-третьих, виртуальную машину лучше не создавать с нуля (хотя и так можно), а импортировать их прилагающегося xml-файла. В-четвертых, не очевидны имя пользователя и пароль (подсказываю: glassfish / glassfish).
А в остальном всё очень мило, можно включить поддержку русского языка, хотя NetBeans, конечно, придется поднастроить. Предупреждаю также о том, что Firefox там настроен через прокси, так что может показаться, что нет соединения с Интернетом.
Ну что-ж, тогда встречайте: настроенная виртуальная машина для Java-разработки от самого Oracle! В состав входят NetBeans для любителей гуёвых IDE, а также сервер приложений GlassFish. Всё это установлено на фирменный оракловский Linux (гы-гы-гы… уши CentOS торчат с первых минут загрузки).

При установке вас ожидает небольшой квест. Во-первых, нужно зарегистрироваться на сайте Oracle. Без авторизации скачивать не дают. Во-вторых, образ виртуального диска выложен 4-мя кусочками (3 по 700 и еще 200+ Мб). Для их склеивания прилагается нехитрый батничек (assemble.cmd). В-третьих, виртуальную машину лучше не создавать с нуля (хотя и так можно), а импортировать их прилагающегося xml-файла. В-четвертых, не очевидны имя пользователя и пароль (подсказываю: glassfish / glassfish).
А в остальном всё очень мило, можно включить поддержку русского языка, хотя NetBeans, конечно, придется поднастроить. Предупреждаю также о том, что Firefox там настроен через прокси, так что может показаться, что нет соединения с Интернетом.
У каждой эпохи свой Перельман
Более-менее образованной публике известен «чудоковатый» математик Григорий Перельман, доказавший гипотезу Пуанкаре и отказавшийся от причитающейся за это крупной денежной награды. В советское же время талантливая молодежь с техническим складом ума зачитывалась книгами другого Перельмана — Якова Иссидоровича. Его книги «Занимательная матеманика», «Занимательная физика» «проглатывались» с не меньшим увлечением, чем романы Майна Рида.
Оказывается, в этом году исполняется 130 лет со дня рождения этого замечательного просветителя и популяризатора науки.

Поскольку об этих чудесных книгах сейчас вспоминают гораздо реже, чем хотелось бы, с удовольствием делаю перепост новости. А чтобы перепост не выглядел уж совсем как копипаст, прилагаю ссылки на указанные книги:
Занимательная физика (вот еще и в pdf)
Занимательная математика.
Это на вскидку, ссылок много. Книги Я.И. Перельмана найти в Сети еще можно достаточно свободно, копирасты на них свою лапу еще не наложили.
Оказывается, в этом году исполняется 130 лет со дня рождения этого замечательного просветителя и популяризатора науки.

Поскольку об этих чудесных книгах сейчас вспоминают гораздо реже, чем хотелось бы, с удовольствием делаю перепост новости. А чтобы перепост не выглядел уж совсем как копипаст, прилагаю ссылки на указанные книги:
Занимательная физика (вот еще и в pdf)
Занимательная математика.
Это на вскидку, ссылок много. Книги Я.И. Перельмана найти в Сети еще можно достаточно свободно, копирасты на них свою лапу еще не наложили.
RPC на JavaScript
Года три назад я написал материал об удаленных процедурах, выполняемых с помощью фреймворка GWT. В то время эта технология действительно выглядела прорывом. Еще бы: клиентский и серверный код пишутся на одном и том же языке! Но за прошедшее время произошло много событий, которые побуждают меня всё чаще писать на чистом JavaScript, особенно там, где не требуется задействовать мощные библиотеки и API.
На стороне сервера использую Node.js, развивающийся в последние месяцы просто космическими темпами. На стороне же клиента — не менее интенсивно развивающийся jQuery, который, помимо возможности рисовать красивые интерфейсы, содержит мощные средства выполнения асинхронных запросов. Ну, а посредником между клиентом и сервером может выступать код в формате JSON (я и раньше его иногда использовал, в GWT для этого есть необходимые пакеты).
Вот как можно организовать передачу JSON-объекта на сервер. На стороне клиента:
Как принять на стороне сервера (задействован пакет express):
Вот так, довольно бесхитростно. Учитывая то, что с сервера можно присылать довольно сложные объекты, этот метод вполне может заменить GWT в экспресс-проектах, когда городить огород некогда и незачем.
На стороне сервера использую Node.js, развивающийся в последние месяцы просто космическими темпами. На стороне же клиента — не менее интенсивно развивающийся jQuery, который, помимо возможности рисовать красивые интерфейсы, содержит мощные средства выполнения асинхронных запросов. Ну, а посредником между клиентом и сервером может выступать код в формате JSON (я и раньше его иногда использовал, в GWT для этого есть необходимые пакеты).
Вот как можно организовать передачу JSON-объекта на сервер. На стороне клиента:
var queryParams = {greeting: 'Hello, World!', someBool: true};
$.getJSON('/hello', queryParams, function(data){
// асинхронный разбор прилетевшего с сервера JSON-объекта.
}Как принять на стороне сервера (задействован пакет express):
app.get('/hello', function (req, res) {
res.setHeader('Content-Type', 'application/json; charset=utf-8');
var someObject = {
replay: 'Воистину ' + req.query.greeting,
yesOrNo: req.query.someBool
};
res.send(JSON.stringify(someObject));
}Вот так, довольно бесхитростно. Учитывая то, что с сервера можно присылать довольно сложные объекты, этот метод вполне может заменить GWT в экспресс-проектах, когда городить огород некогда и незачем.
Cyanogenmod 10: кошерный Android
Всем привет, давненько не писал сюда.
Поведать хочу о самостоятельной прошивке гуглофона Samsung GT-I8150. Событие по нынешним временам вполне ординарное, но я делал впервые и кому-то, думаю, этот материал будет полезен.

( Читать дальше )
Поведать хочу о самостоятельной прошивке гуглофона Samsung GT-I8150. Событие по нынешним временам вполне ординарное, но я делал впервые и кому-то, думаю, этот материал будет полезен.

( Читать дальше )
"Пиратов Силиконовой долины" таки закрыли
Пару лет назад выложил на Youtube фрагменты фильма «Пираты Силиконовой долины», с которым меня познакомил камрад ghost, за что ему большое спасибо. Показывал я эти ролики школьникам на уроках, учащимся на лекциях для осваивающих азы компьютерной грамотности, да и у посетителей самого популярного в мире видеохостинга они пользовались немалым успехом.
И вот сегодня пришло «письмо счастья», точнее серия писем.

Ролики заблокировали. Кому это пошло на пользу, интересно? Может, Warner Bros. станут богаче от того, что о их фильмах узнает меньше людей? Или, может быть, покупать лицензионный диск с фильмом «Пираты силиконовой долины» станут чаще? Или меня хотели лишить доходов, которые я «получал» от того, что выложил эти видеофрагменты на Youtube? По-моему, ни один из этих аргументов не убедителен.
Я-то уже и забыл про эти ролики, хотя до сих пор «спасибки» иногда на e-mail приходят. Конечно, спасибо нужно в первую очередь сказать создателям замечательного фильма. Я думаю, что он не столько художественный, сколько исторический, просветительский. Наверно, тысячи людей благодаря этим фрагментикам в наглядной и яркой форме получили представление о ранних годах развития ПК, многое поняли в устройстве компьютера, в операционных системах. А теперь… Теперь количество балбесов на душу населения еще немного увеличится.
И вот сегодня пришло «письмо счастья», точнее серия писем.

Ролики заблокировали. Кому это пошло на пользу, интересно? Может, Warner Bros. станут богаче от того, что о их фильмах узнает меньше людей? Или, может быть, покупать лицензионный диск с фильмом «Пираты силиконовой долины» станут чаще? Или меня хотели лишить доходов, которые я «получал» от того, что выложил эти видеофрагменты на Youtube? По-моему, ни один из этих аргументов не убедителен.
Я-то уже и забыл про эти ролики, хотя до сих пор «спасибки» иногда на e-mail приходят. Конечно, спасибо нужно в первую очередь сказать создателям замечательного фильма. Я думаю, что он не столько художественный, сколько исторический, просветительский. Наверно, тысячи людей благодаря этим фрагментикам в наглядной и яркой форме получили представление о ранних годах развития ПК, многое поняли в устройстве компьютера, в операционных системах. А теперь… Теперь количество балбесов на душу населения еще немного увеличится.
