SuperTuxKart: аркадные гонки для Linux
Linux — это мир, где многое делается «на слабо». Энтузиасты годами развивают проекты по принципу «у нас это тоже есть». Вот и в нише игр, где эта ОС традиционно считается отстающей, есть вполне адекватные проекты, развивающиеся много лет. К ним относится SuperTuxKart, существующая с 2004 г. Сегодня вышла свежая версия, которую я скачал и запустил.

Видео с оффсайта:
Игра поставляется в виде бинарника, который просто нужно запустить из любй директории. Радует, помимо всего прочего, озвучка, которая воспроизводится не абы как, а в 3D-формате (для этого используется библиотека OpenAl, ее пришлось доустанавливать вручную).

Видео с оффсайта:
Игра поставляется в виде бинарника, который просто нужно запустить из любй директории. Радует, помимо всего прочего, озвучка, которая воспроизводится не абы как, а в 3D-формате (для этого используется библиотека OpenAl, ее пришлось доустанавливать вручную).
Генерация идентификатора пользователя посредством 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;
Л.И. Балашевич, Е.В. Даниленко Особенности расчета оптической силы интраокулярной линзы, имплантируемой при факоэмульсификации
- —
- 15 декабря 2012, 17:29
- комментировать
Повстанцы-самоделкины
Сирийские повстанцы самостоятельно изготавливают вот такие танки:

Смешно, конечно, но каких-то 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
- комментировать
Графический интерфейс в bash скриптах
Сегодня приведу небольшой пример того, как можно сделать графический интерфейс выбора из списка с помощью bash и т.н. zenity (gtk).
Окно выбора представляет собой список из 2х организаций, например (названия замазаны квадратиками)

Если нажать «Отмена» скрипт просто прекратит работу, если нажать «ОК» выбрав филиал, или просто 2 раза щелкнуть на названии филиала — сработает та или иная часть скрипта.
Сам скрипт:
( Читать дальше )
Окно выбора представляет собой список из 2х организаций, например (названия замазаны квадратиками)

Если нажать «Отмена» скрипт просто прекратит работу, если нажать «ОК» выбрав филиал, или просто 2 раза щелкнуть на названии филиала — сработает та или иная часть скрипта.
Сам скрипт:
( Читать дальше )
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)
Занимательная математика.
Это на вскидку, ссылок много. Книги Я.И. Перельмана найти в Сети еще можно достаточно свободно, копирасты на них свою лапу еще не наложили.

