Генерация идентификатора пользователя посредством PL/PGSQL

Возможности реляционных баз данных PostgreSQL можно существенно расширить за счет процедур на специальном языке — PL/PSQL. Он очень прост, существует давно и поэтому весьма стабилен. Дополнительным удобством является то, что вызов процедуры — это транзакция, поэтому если при ее выполнении происходит какой-нибудь сбой, данные не теряются. Просто происходит откат к прежнему состоянию.

На 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 лет назад могущественная китайская промышленность начиналась с таких же самопалов.

Ах, да, кстати: может кто-то еще не видел:

( Читать дальше )

Node.js: раздача бинарных файлов

Очень часто с веб-сервера требуется отправить браузеру картинку с динамически заданными характеристиками. Пример — аватарка пользователя, в случае отсутствия которой выдается картинка с серым силуэтом. Вот как это можно сделать:


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() — абстрактная функция, возвращающая путь до файла-картинки. Ее можно конкретизировать в зависимости от ситуации.

Slax: снова в строю

После трех лет молчания Томаш Матейчек допилил-таки до современного состояния свой портативный дистрибутив Slax.

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



Про сам дистрибутив сказать пока не могу ничего, кроме того, что прочитал в новостях, но на нетбук его обязательно установлю, после чего поделюсь впечатлениями. Нисколько не сомневаюсь, что их будет много.

Выгрузка файлов с помощью Node.js

Выгрузка файлов через веб-форму на всех языках программирования является задачей несколько более сложной, чем просто извлечение параметров, переданных с помощью методов GET или POST. Несколько раз реализовывал такое на Java и могу сказать, что без привлечения специальных библиотек за это лучше не браться. До недавних пор написание программы выгрузки на node.js тоже требовало довольно большого количества строк, но несколько месяцев назад в проекте express появились средства, сводящие задачу к сущим пустякам.


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 там настроен через прокси, так что может показаться, что нет соединения с Интернетом.

У каждой эпохи свой Перельман

Более-менее образованной публике известен «чудоковатый» математик Григорий Перельман, доказавший гипотезу Пуанкаре и отказавшийся от причитающейся за это крупной денежной награды. В советское же время талантливая молодежь с техническим складом ума зачитывалась книгами другого Перельмана — Якова Иссидоровича. Его книги «Занимательная матеманика», «Занимательная физика» «проглатывались» с не меньшим увлечением, чем романы Майна Рида.

Оказывается, в этом году исполняется 130 лет со дня рождения этого замечательного просветителя и популяризатора науки.



Поскольку об этих чудесных книгах сейчас вспоминают гораздо реже, чем хотелось бы, с удовольствием делаю перепост новости. А чтобы перепост не выглядел уж совсем как копипаст, прилагаю ссылки на указанные книги:

Занимательная физика (вот еще и в pdf)

Занимательная математика.

Это на вскидку, ссылок много. Книги Я.И. Перельмана найти в Сети еще можно достаточно свободно, копирасты на них свою лапу еще не наложили.

RPC на JavaScript

Года три назад я написал материал об удаленных процедурах, выполняемых с помощью фреймворка GWT. В то время эта технология действительно выглядела прорывом. Еще бы: клиентский и серверный код пишутся на одном и том же языке! Но за прошедшее время произошло много событий, которые побуждают меня всё чаще писать на чистом JavaScript, особенно там, где не требуется задействовать мощные библиотеки и API.

На стороне сервера использую 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. Событие по нынешним временам вполне ординарное, но я делал впервые и кому-то, думаю, этот материал будет полезен.




( Читать дальше )

"Пиратов Силиконовой долины" таки закрыли

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

И вот сегодня пришло «письмо счастья», точнее серия писем.



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

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