RG-soft.com

всякое разное об этих ваших интернетах

Все записи с меткой "веб-программирование"

JsRender — JavaScript шаблонизатор
Многие слышали про jQuery Templates, некоторые пользовались. Штука крайне удобная, позволяет переложить отрисовку части отображения на сторону клиента, то бишь генерировать html прямиком в браузере, что позволяет во-первых делать крайне быстрые веб-интерфейсы, а во-вторых снижает нагрузку на backend. Но недавно команда jQuery заморозила разработку jQuery Templates на неопределённый срок, чем вызвала немало вопросов в свой адрес.

Слава яйцам, что человек, занимавшийся разработкой jQuery Templates, форкнул проект и назвал его JsRender. И хоть это даже пока и не бета, но работает всё довольно стабильно. Краткий пример как этим пользоваться (у людей, знающих JavaScript проблем с пониманием возникнуть не должно):

<script id="entry" type="text/x-jquery-tmpl">
<div id="entry-{{* result += $view.itemNumber; }}">
{{=author}}
<div class="text">{{=text!}}</div>
{{#each comments}}
<div class="comment">
{{=author}} написал:
<br>
{{=comment!}}
</div>
{{/each}}
</div>
</script>

<div id="wrap"></div>

<script>
var entries = [
{ author: "user11", text: "Привет 1", comments: [
{ author: "user1", comment: "Привет 2" },
{ author: "user2", comment: "Привет 3" },
{ author: "user3", comment: "Привет 4" }
] },
{ author: "user22", text: "Пока 1", comments: [
{ author: "user4", comment: "Пока 2" },
{ author: "user5", comment: "Пока 3" },
{ author: "user6", comment: "Пока 4" }
] },
{ author: "user33", text: "Проверка", comments: [] }
];

$("#wrap").html( $("#entry").render(entries) );
</script>


Теперь по пунктам о том, что это было:
Всё, что находится в теге <script id="entry" type="text/x-jquery-tmpl"> — это шаблон. Синтаксис довольно прост для понимания: {{=author}} выводит поле author из вводных данных, {{=text!}} — поле text. Но обратите внимание на восклицательный знак после имени поля — он означает, что спецсимволы в данных не будут эскейпится, а выведутся «как есть». Полезно, если хотите вставлять куски html в шаблон. Далее код между {{#each comments}} и {{/each}} выполняется для каждого объекта, внутри множества comments, все названия полей ссылаются на эти поля. {{* result += $view.itemNumber; }} — этот тег выполняет javascript код напрямую, конкретно в этом случае к выводимому результату (result) добавляется текущий номер итерации ($view.itemNumber).

Переменная entries содержит данные, которые парсятся в шаблон. Переменная задана локально, но никто не мешает её, например стянуть AJAX запросом с backend-a.

И самая главная строчка: $("#wrap").html( $("#entry").render(entries) );,
$("#entry").render(entries) — парсит шаблон, находящийся в $("#entry"), с данными, находящимися в переменной entries. Возвращается готовый html.

Вот такая вот библиотека. Категорически рекомендую всем её пощупать. Через некоторое время, если это кого-то заинтересует, я продолжу знакомить вас с JsRender.

 
веб-программирование javascript jquery
0 коммент.
Релиз NetBeans IDE 7.0
На днях увидела свет новая версия, пожалуй, лучшей бесплатной IDE. Нового в этой версии:
поддержка HTML5
Поддержка Git 1.7.х
PHP Rename Refactoring
Line wrapping
и различные другие плюшки

Скачиваем здесь

 
netbeans ide php python java c++ веб-программирование базы данных
0 коммент.
Роли в PostgreSQL
Мигрируя с MySQL на PostgreSQL у многих возникает проблема с пониманиями ролей (roles) в PostgreSQL. Роли - это не прямой аналог пользователей (users) в MySQL, хотя они и могут использоваться в том числе и для авторизации пользователей.

В целом роли можно разделить на 2 категории:
групповые роли
роли, используемые для входа

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

SUPERUSER | NOSUPERUSER - Указывает, что данная роль имеет статус «суперпользователя», который позволяет осуществлять операции администрирования без каких-либо ограничений. К этим операциям относится доступ, создание/удаление, модификация(изменение) ролей и объектов баз данных. Соответственно, опция SUPERUSER — разрешает, а NOSUPERUSER — запрещает. По умолчанию установлена NOSUPERUSER.

CREATEDB | NOCREATEDB - Разрешает или запрещает роли создавать БД. По умолчанию: NOCREATEDB.

CREATEROLE | NOCREATEROLE - Разрешает или запрещает создавать/удалять роли. По умолчанию: NOCREATEROLE.

INHERIT | NOINHERIT - Определяет, что роль может наследовать привилегии другой роли, членом которой она является. Роль с атрибутом INHERIT будет иметь те же привилегией доступа к объектам БД, что и та роль, которая является её владельцем, потому что первая является членом последней. По умолчанию: INHERIT.

LOGIN | NOLOGIN - Позволяет роли открывать соединения. Один из ключевых моментов, который следует понять в ролях: если роль не может авторизовываться (т.е. открывать соединения от своего имени), то единственная её функция - это настройка прав доступа к бд для других ролей, и такая роль называется групповой. По умолчанию: NOLOGIN.

CONNECTION LIMIT connlimit - устанавливает лимит открытых соединений на роль, -1 - значение по умолчанию и в данном случае соответствует бесконечности.

[ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password' - этот параметр, как несложно догадаться, отвечает за пароль. Есть 2 ньюанса: во-первых пароль имеет смысл указывать только для ролей, используемых для входа, а во-вторых обратите внимание на параметр ENCRYPTED | UNENCRYPTED. Смысл его в том, чтобы указать в каком виде хранить пароль в базе данных: в зашифрованном или нет, по-умолчанию, естественно, пароль шифруется в md5.

IN ROLE rolename - позволяет включить создаваемую роль в существующую роль.

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

#создаём групповую роль
CREATE ROLE group NOSUPERUSER NOINHERIT NOCREATEDB NOCREATEROLE;
# создаём роль для входа (пользователь) и включаем её в групповую роль
CREATE ROLE user LOGIN ENCRYPTED PASSWORD 'userpassword' INHERIT IN ROLE group;
# даём групповой роли права на таблицу
# права автоматически получит и пользователь
GRANT ALL ON table TO group
# закрываем всем остальным доступ к таблице
REVOKE ALL ON TABLE table FROM PUBLIC


Надеюсь этот небольшой материал поможет пользователям, мигрирующим с MySQL на PostgreSQL, получше понять систему ролей в PostgreSQL.

 
postgresql pgsql базы данных веб-программирование
0 коммент.
Нестандартная сотировка выборки из MySQL
Ещё одна небольшая проблемка, которую удалось решить, а решением поделиться со всеми. Представьте себе ситуацию: игра в покер, есть стол, и таблица игроков. За столом, допустим, 8 мест, а играют 5 игроков, притом позиции у всех разные, допустим 1, 3, 4, 6, 8. В каждом новом хенде выбирается дилер, предположим, что сейчас это игрок на 4 позиции, соответственно мне надо выбрать всех игроков за текущим столом, но по порядку, начиная с дилера, т.е. чтобы в выборке было 4, 6, 8, 1, 3.

Сначала я хотел сделать это через usort, но проблема в том, что функцию сравнения передаётся только 2 параметра, а нужен был 3й - дилер. Можно, конечно, было написать класс в котором и была бы прописана функция сравнения, а дилер устанавливался как свойство при создании объекта, но как оказалось есть куда более элегантное решение:

SELECT * FROM `players` WHERE `table`='id стола' ORDER BY `position`<4, `position`


Вот такой вот незамысловатый запрос сразу вернёт строки в нужном расположении, а всё благодаря тому, что MySQL поддерживает логические выражения в ORDER BY.

 
mysql базы данных php веб-программирование
0 коммент.
Сортировать varchar как int в MySQL
Возникла недавно достаточно неожиданная проблема. Была таблица с номерами офисов, и в этих номерах помимо самого номера бывали ещё и литеры (101а, 205б и т.д.), поэтому поле в базе данных пришлось делать varchar.

Вместе с тем стояла задача сортировать эти записи по номеру офиса, и вот здесь возникла проблема: сортировка, как и следовало ожидать, шла как строки, т.е. по каждому следующему символу. Поэтому запрос: SELECT `onum` FROM `offices` ORDER BY `onum` ASC выдавал 1, 109, 12, 146, когда я, конечно же, хотел бы видеть 1, 12, 109, 146.

Немножко погуглив решение таки было найдено: функция CAST. И вот уже запрос SELECT `onum` FROM `offices` ORDER BY CAST(`onum` AS UNSIGNED) возвращал всё как надо. Другие возможные конвертации для CAST:

BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL[(M[,D])]
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]

 
mysql базы данных php веб-программирование
0 коммент.