LINUX.ORG.RU

Сообщения memnek

 

Интеграция JAX-RS Token Auth и JavaEE Security

Форум — Development

У меня есть JavaEE-приложение, в котором есть несколько JAX-RS ресурсов и несколько EJB-бинов со всякой бизнес-логикой.

Для JAX-RS части есть самодельная система аутентификации:

  • public class User implements java.security.Principal - сущность для юзера
  • public class AppSecurityContext implements javax.ws.rs.core.SecurityContext - контекст для jax-rs
  • @NameBinding public @interface Authenticated - аннотация для отметки, что метод или класс требует входа в систему
  • public class SecurityFilter implements javax.ws.rs.container.ContainerRequestFilter - фильтр, проверяющий HTTP-заголовок на наличие токена и устанавливающий запросу соответствующий SecurityContext (или вызывающий abortWith, если аутентификация не удалась)
  • Всякие сервисы для проверки токенов, логина/логаута, регистрации нового юзера и т.д.

Всё это работает хорошо, но в пределах самих JAX-RS ресурсов. Мне же нужно, чтобы информация о пользователе была доступна и в некоторых EJB-бинах через javax.ejb.SessionContext.

На SO пишут, что установка SecurityContext - это локальная штука в пределах JAX-RS слоя. Чтобы информация о текущем пользователе была в SessionContext всего приложения, нужно глобально подключить security-механизм на сервере (например, настроить через web.xml). Ещё говорят, что JavaEE Security - это «всё или ничего», т.е. тогда всю аутентификацию надо настраивать через неё.

В общем, вопросы такие:

1) Можно ли программным путём в самом приложении (а не через админку сервера) управлять пользователями: логинить их, регистрировать новых, изменять инфу, самому сохранять в БД и т.д? Например, в JAX-RS-фильтре получили токен из HTTP-заголовка, по токену нашли юзера. Есть-ли какой-нибудь метод в security api, чтобы залогинить этого пользователя во всей системе?

2) Есть ли способ добавить информацию о пользователе в SessionContext всего приложения? Я знаю, что JAX-RS фильтры и interceptor'ы могут добавлять что-то в контексты самих запросов/ответов. Ещё есть EJB-интерцепторы, которые могут добавлять в EJB-контекст свою инфу. Как их можно скрестить, чтобы достать юзера в контексте запроса (который устанавливается фильтром), и добавить в контекст сессии EJB?

3) Может есть вариант с использованием HTTP-сессий? Все JAX-RS ресурсы сделать SessionScoped. При логине юзера записываем данные в сессию, при логауте чистим сессию. На необходимые методы в бине вешаем перехватчик, в нём получаем данные из сессии, а по ним получаем пользователя.

Как проще/лучше/быстрее?

 

memnek ()

Архитектура javaee-приложения

Форум — Development

Имеется javaee-приложение. В качестве БД используется монго. Для доступа к монго есть singleton-бин. В приложении нужно оперировать некими сущности. Допустим, есть сущности User и Bid (заявка). Все типы сущностей имеют схему (хранится в БД) и ещё некоторые общие поля. Конкретные типы имеют также свои уникальные поля. В самой программе эти сущности не представлены в виде DTO или чего-то подобного, т.е. не имеют отображения на конкретный класс (ввиду непостоянства их полей) информация хранится в обычных экземплярах org.bson.Document (Это новый класс, появился в 3-й версии драйвера для явы. На деле он имплементит Map<String, Object> и ещё что-то. Короче, с точки зрения доступа к инфе можно считать, что это обычная Map).

Как правильнее, с точки зрения концепции javaee организовать архитектуру?

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

public void editUser(Document doc) {
    user.init(doc);
    user.save();
}
По-идее, надо сделать 2 интерфейса (User, Bid) и их реализацию в виде бинов (UserBean, BidBean). Например:
public interface AbstractDoc {
    public Document getSchema();
    public void updateSchema(Document schema);
    public void init(Document data);
    public <T> T getField(String name, Class<T> fieldType);
}
public interface User {
    public void register();
    public List<Bid> getBids();
}
public interface Bid {
    public User getUser();
}
Вот тут и встаёт вопрос. У юзера и у заявки есть поля со взаимными отношениями. По идее, реализация этих интерфейсов - Stateless бины, чтобы иметь возможность инжектить (тот же монго-сервис, чтобы сохранять в БД) и инжектиться самим (в JAX-RS ресурс, к примеру). С другой стороны, заявка не бывает без пользователя, и можно её сделать обычным классом, а все действия производить через User-бин. Но как тогда, к примеру, получить список всех заявок или пользователей? Статические методы не приемлемы в интерфейсах. Заводить вспомогательный класс-бин, инжектить его в User и сделать геттер на него? Или всё реализовать это как репозиторий, по типу EntityManager? Тогда как отслеживать связи? Брать ОРМ типа Morphia тоже не хочется как-то. Как вообще принято в javaee делать такое?

 ,

memnek ()

Как создать DI-аннотацию, использующую строковые параметры?

Форум — Development

Да, код на груви, но суть, я думаю, ясна.

У меня есть такой бин для доступа к монго:

@javax.ejb.Singleton
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
class MongoResource {
    GMongo mongo = null
    DB db = null

    @Lock(LockType.READ)
    def getMongo() {
        return mongo
    }

    @Lock(LockType.READ)
    def getDb() {
        return db
    }

    @PostConstruct
    public void init() {
        mongo = new GMongo()
        db = mongo.getDB("dbname")
    }
}

Пока что всё это я использую так:

@Path("foo")
class FooRestService {
    DBCollection collection
    
    @Inject
    def setCollection(MongoResource resource) {
        this.collection = resource?.db?.getCollection("foo")
    }

    @GET
    def list() {
        def result = collection.find()
        // ...
    }
}
Но писать для каждого сервиса однотипные сеттеры такой утомляет.

Я хочу создать аннотацию, чтобы можно было делать так:

@Path("foo")
class FooRestService {
    @Mongo(collection = "foo") // Указываем имя коллекции, имя БД по желанию
    DBCollection collection

    @GET
    def list() {
        def result = collection.find()
        // ...
    }
}

Т.е. в аннотацию передаём имя коллекции (имя БД будет одним для приложения, хотя и его можно будет задать), и в поле collection инъектится нужная коллекция.

Есть ли простой способ сделать такую штуку? Смотрел примеры с @Inject и @Produces, но вроде для этого случая это не подходит.

 ,

memnek ()

Как mock'ать?

Форум — Development

У меня есть класс-наследник com.rabbitmq.client.DefaultConsumer из библиотеки RabbitMQ. Надо протестировать этот класс. Я использую spock для тестов. Создаю mock класса com.rabbitmq.client.Channel, хочу заменить вызов Channel.basicPublish на заглушку (чтобы вызывался метод Consumer.handleDelivery, который я перегрузил):

class MessagesSpec extends Specification {

    def "Sending messages"() {
        given:
        def consumeTag = "consumer"
        def exchange = "foo.bar"
        def routingKey = "baz"
        def message = "message"
        def basicProperties = new BasicProperties()
        def envelope = new Envelope(1, false, exchange, routingKey)

        def channel = Mock(Channel)
        AMQMessageConsumer<Message<String>> consumer = new AMQMessageConsumer<Message<String>>(String.class, channel) // Это тестируемый объект
        channel.basicPublish(_ as String, _ as String, _ as BasicProperties, _ as byte[]) >> {
            String e, String rk, BasicProperties bp, byte[] m ->
                consumer.handleDelivery(consumeTag, envelope, bp, m)
        } // Тут заглушка для basicPublish, должен вызываться реальный метод тестируемого класса

        when:
        channel.basicPublish(exchange, routingKey, basicProperties, message.getBytes()) // Вызываю заглушку

        then:
        1 * consumer.handleDelivery(*_)
    }
}

Однако в результате запуск consumer.handleDelivery не происходит:

Too few invocations for:

1 * consumer.handleDelivery(*_)   (0 invocations)

Unmatched invocations (ordered by similarity):

None

Как правильно mock'нуть всё это дело, а то я что-то туплю и не могу сообразить

 , ,

memnek ()

Как в python передавать и получать значения сопрограммы (корутины) с asyncio?

Форум — Development

Если взять обычные генераторы, то реализовать подобное просто:

def g():
    yield 1
    # какие-то действия
    yield 2
    # какие-то действия
    yield 3

for result in g():
    print(result)

Плюс, можно через send() отправлять в такой генератор значения, например так:

def g():
    v = 0
    while True:
        v = yield v * 2
        if v > 100:
            break

gen = g()
next(gen)
r = 1
l = []
while True:
    try:
        r = gen.send(r)
        l.append(r)
    except StopIteration:
        break
# l -> [2, 4, 8, 16, 32, 64, 128]

Есть ли возможность так же делать для корутин из нового модуля asyncio?

 ,

memnek ()

setup.py и мусор в PROJECT_ROOT

Форум — Development

Как заставить setup.py сохранять *.egg и *.egg-info не в корне проекта (где собственно и лежит setup.py), а в какой-нибудь другой директории? Такая фигня возникает в 2-х случаях:

  • Если запускать setup.py test, когда не все зависимости (ну их яйца) лежат в site-packages виртуального окружения. Тогда запускается build с inplace и все неустановленные зависимости пакетов начинают появляться в корневой папке проекта. Не очень приятно, хочется их отправлять либо в PROJECT_ROOT/eggs/, либо отправлять в site-packages. Такая же фигня возникает, если прописать зависимости в setup_requires. Возможно ли добиться настройками в setup.cfg ,или ещё как-нибудь, сохранения яиц в подкаталоге проекта, а не в его корне?
  • Если запустить setup.py develop, то в корне проекта начинают появляться *.egg-info. Их тоже хочется куда-нибудь скинуть в одну папку (PROJECT_ROOT/eggs-info/ например). Можно прописать в setup.cfg такую вещь:
    [egg_info]
    egg_base = eggs-info
    
    Тогда .egg-info сохраняется куда надо, и даже pip видит, что пакет установлен. Но sys.path тогда будет содержать папку PROJECT_ROOT/eggs-info/ с метаинфой пакета, но не будет содержать PROJECT_ROOT, и импортёр не найдёт собственно сами исходники пакета.

Отсюда у меня вытекают такие вопросы:

  • Есть ли способ установить через setup.py всякие допзависимости из extras_require? Или это только через easy_install/pip? Либо, может есть возможность настройки запуска setup.py такая, чтобы отправлять яйца в подпапку корня проекта, но опять же, чтобы они были доступны для импорта.
  • Как перемещать при запуске команды develop папки с метаинфой в подпапку корня проекта, но так, чтобы сам корень попадал в easy-install.pth, и, собственно, нормально импортировался.

 ,

memnek ()

Вызов метода классового поля в Python

Форум — Development

У меня есть 2 класса:

class A(object):
    def __init__(self, klass):
        self.klass = klass
    def foo(self, *args, **kwargs):
        pass
    def bar(self, *args, **kwargs):
        pass

class B(object):
    pass

a = A(B)
B.a = a
b = B()
Есть ли какой-нибудь способ отличить эти 2 вызова методов экземпляра класса A:
B.a.foo()
b.a.bar()
Хочется, чтобы foo мог работать только в случае, если он вызывается из самого класса B, а метод bar - только в случае, если он вызывается из экземпляра класса B. При этом, класс B не должен ничего знать о классе A (на самом деле, поле a устанавливается в другом месте через setattr). Возможно ли такое?

 , ,

memnek ()

Flask, MongoDb, Rest API

Форум — Development

Есть ли в мире питона какой-нибудь хороший REST API фреймворк. Требования:

  • Либо интеграция с flask , либо что-то независимое от выбранного веб-фреймворка (чтобы интегрировать во фласк руками).
  • Поддержка mongoengine
  • JSON, XML опционально
  • Работа со схемами: либо генерация класса-документа mongoengine по схеме, либо генерация JSON(XML) схемы по документу
  • Желательно, автогенерация ресурсов со схемами и списком ресурсов, как в eve

Я смотрел Eve, но это сам по себе фреймворк, построенный поверх фласка. Там отличная генерация json/xml, но мне хочется, чтобы иметь ещё и монго-модели с ОРМ. Есть привязка (eve-mongoengine), однако она не очень-то гибкая. В принципе, я хочу либо генерацию класса-модели по схеме, т.е. декларативное описание в виде словаря (как это делается в eve), либо создание схемы их моей модели (как это делается в eve-mongoengine).

Рельно, или придётся писать велосипед?

 , , ,

memnek ()

Lua, os.execute и баш

Форум — Development

Привет, лор. Есть ли способ запустить из программы на луа башевскую команду source? Допустим, что у меня есть файл foo.sh:

#!/bin/bash

foo() {
    echo "bar"
}
Если прописать в консоли source foo.sh, то функция foo станет доступна в текущем сеансе и я смогу её выполнить.

Мне надо запустить луа-скрипт, чтобы он запустил мой foo.sh так, чтобы в текущем сеансе появилась функция foo. Есть ли способ это сделать? Если написать в foo.lua просто

-- foo.lua
os.execute('source ./foo.sh')
, а потом в чистой консоли я сделаю lua foo.lua, то ничего не произойдет, функция foo не появится.

PS так же интересует аналогичная ситуация, только для переменных

 ,

memnek ()

SQLAlchemy и вычисление дат

Форум — Development

У меня есть модель (я использую SQLAlchemy-расширение для Flask). В ней есть поле даты начала и поле продолжительности. Я хочу выбрать те записи, которые удовлетворяют такому условию: время_начала > сегодня > время_начала+продолжительность. Я хотел сделать hybrid_property у модели:

class MyModel(db.Model):
    id = ...
    start_date = ...
    duration = ...

    @hybrid_property
    def end_date(self):
        return start_date + datetime.timedelta(days=self.duration)
но self.duration имеет тип InstrumentedAttribute. Как мне получить дату конца, если известна дата начала и продолжительность?

 , , ,

memnek ()

JSF, ActionListener и JS API

Форум — Development

Я делаю составной компонент на JSF. В нём я подключаю вот эту js-либу и div. Либа строит диаграмму с элементами (на основе xml или json). В ней предусмотрено API, в том числе, обработка событий: выбор задачи, её передвижение и тд. Есть ли возможность связать некоторые события из js-либы со слушателями jsf?

Т.е. я хочу, чтобы пользователь либы мог вставить компонент на страничку и смог указать свои обработчики событий:

<foo:mycomponent tasks="#{taskBean.tasksXML}"
chooseTaskListener="#{someBean.chooseTaskCustomListener}"
changeTaskListener="#{someBean.changeTaskCustomListener}"/>

Ну а в слушателях пользователь может, например, записать задачу в БД или файл, или выполнить какое-нибудь другое действие. Возможно ли это?

У меня есть идея, но не знаю, как правильно её реализовать.

gantt.attachEvent("onTaskSelected", function(id,item){
    // тут хотелось бы сделать ajax-запрос(?), 
    // который вызвал бы #{someBean.chooseTaskCustomListener}, т.е. то, что передал пользователь в мой компонент
    // но как? использовать jsf-тег в js-коде?
    // или сделать что-то типа 'emit' какого-нибудь события из jsf.js?
});

 , ,

memnek ()

JSF и Hibernate

Форум — Development

У меня есть некая сущность (модель):

@Entity
@Table(name ="task")
public class Task {
    Integer id;
    String name;
    Date start;
    Date end;
    // и тд.
    // ну и соответствующие сеттеры и геттеры тоже присутствуют
}
Есть DAO, интерфейс выглядит так:
public interface TaskDAO {
    public void addTask(Task Task) throws SQLException;
    public void updateTask(Task Task) throws SQLException;
    public Task getTaskById(Long id) throws SQLException;
    public List getAllTasks() throws SQLException;
    public void deleteTask(Task Task) throws SQLException;
}
Ну и его реализация:
public class TaskDAOImpl implements TaskDAO {

    public void addTask(Task task) throws SQLException {
        Session session = null;
        try {
            session = HibernateUtil.getSession();
            session.beginTransaction();
            session.save(task);
            session.getTransaction().commit();
        } catch (Exception e) {
            System.out.print("Error");
        } finally {
            if (session != null && session.isOpen()) {
                session.close();
            }
        }
    }
    // и тд
}

Теперь я хочу сделать возможность добавления в БД, данные будут браться из формы. Представление надо реализовать на JSF. Я сделал бин следующего вида:

@ManagedBean(name = "addTaskBean", eager=true)
@RequestScoped
public class AddTaskBean {

    Task task;

    public Task getTask() {
        return task;
    }

    //@PostConstruct
    //public void init() { 
    //    task = new Task();
    //}

    public String add() throws SQLException {
        //task = new Task();
        Factory.getInstance().getTaskDAO().addTask(task);
        return "index";
    }
}
Ну и jsf-файл
<h:form>
    <h:panelGrid columns="2">
        <h:outputLabel value="Имя" for="id_name"/>
        <h:inputText id="id_name" value="#{addTaskBean.task.name}"/>
        <!-- и тд -->
    </h:panelGrid>    
    <h:commandLink action="#{addTaskBean.add}" value="Добавить"/>
</h:form>
Вот тут и начинается проблема: если раскомментить эти строчки
@PostConstruct
public void init() { 
    task = new Task();
}
То при нажатии на кнопку происходит нифига. Есть раскомментить эту строчку:
task = new Task();
То возникает ошибка:
javax.el.PropertyNotFoundException: /resources/components/gantt/addTask.xhtml @18,73 value="#{addTaskBean.task.name}": Target Unreachable, 'null' returned null

Что делать? Есть ли примеры использования JSF с Hibernate. При этом, мне надо отделить бин от сущности. Т.е. в одном классе будет описываться модель, а в другом классе будет контроллер, который будет добавлять экземпляр в БД и связываться с кнопкой.

 , ,

memnek ()

KDE, ATI и несколько экранов

Форум — Desktop

У меня есть ноут, на котором стоит видео и процессор от AMD (AMD Radeon 6600M and 6700M Series). Если конкретнее, 2 видеокарты, одна встроенная в проц (6620G), вторая дискретная (6630M). Работать могут как вместе, так и по отдельности. Как конкретно они работают в линуксе, я не могу сказать, но внешняя видюха работает точно (работает ли встроенная при этом - хз). Драйвер стоит закрытый, бета версия с офсайта.

В Caatalyst Control Center можно выбрать настройки для нескольких дисплеев. Есть следующие варианты настроек:

  1. Клонирование вывода. Мне не нужен.
  2. Называется «Рабочий стол на несколько дисплеев с дисплеями 2», суть которого в том, что каждый виртуальный рабочий стол становится шире, расширяя рабочую область вправо за счёт подключенного дисплея. При этом, можно перетаскивать окна за правый край, и они появляются на втором мониторе. Но если переключиться на другой виртуальный рабочий стол, второй монитор тоже переключится, и на нём уже не будет нужного окна. А это меня не устраивает. Мне надо, чтобы вне зависимости от виртуального рабочего стола на встроенном мониторе, на внешнем был один и тот же рабочий стол. Можно, конечно, на внешнем мониторе у окна поставить «Отображать на всех рабочих столах», но при этом есть ряд минусов. Например, если включить просмотр всех рабочих столов (пример), то на втором мониторе это тоже сказывается.
  3. Рабочий стол на одиночный дисплей. То, что мне надо. Мониторы независимы, на встроенном мониторе я могу переключаться между рабочими столами, на внешнем мониторе это никак не отразится. Но в этом режиме я не могу переместить окно на внешний монитор. В меню kwin'а есть пункт «Переместить на экран», но при выборе второго монитора ничего не происходит.
  4. Xinerama. Эту функцию можно включить, только при включенном предыдущем режиме. При этом, можно будет перемещать окна мышкой, перебрасывая их на другой экран. Вроде то, что надо, но работает всё это глючно, вырубаются эффекты квина, и, вместе с ними, половина нужных функций. В общем, пользоваться этим невозможно.

Собственно вопрос в том, есть ли истории успеха нормальной настройки двух мониторов?

 , , ,

memnek ()

Real-time оповещения на сайте

Форум — Web-development

Есть страничка с формой и кнопкой отправки некой заявки.

Нужно сделать веб-приложение, которое, во-первых, будет обрабатывать приходящие данные с этой странички и записывать их в БД (скорее всего MySQL), а во-вторых, должно выводить данные из этой БД для операторов. При этом, надо сделать оповещение о поступлении новых заявок в режиме реального времени (например, как сообщения вконтакте).

Я раньше подобным не занимался, но примерно знаю, как это можно реализовать. Например, через вебсокеты. Проблема в том, что я точно не знаю, какое ПО стоит у операторов. Если там старый браузер или заблочены порты, то вебсокетами воспользоваться будет проблематично. Можно на стороне клиента запускать js-скрипт, который будет опрашивать сервер каждые n секунд, но тогда возрастет нагрузка на сервер.

В общем, к ЛОРу у меня вот такие вопросы:

  • Какие технологии лучше использовать на клиенте, при условии, что там может быть старый осел, который не поддерживает модные фишки типа вебсокетов? Т.е. расчет на старое ПО.
  • На серверной части хочется использовать питон, а в качестве фреймворка (и сервера), видимо, торнадо, т.к. сможет держать много открытых соединений. Какие подводные камни?

Ну и хотелось бы ссылок всяких, что почитать на эту тему (доки торнадо читал, стандартные примеры видел).

Перемещено true_admin из development

 ,

memnek ()

Projectivity и type erasure

Форум — Development

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

private static MetaDataDTO buildMetaDataDTO(Collection<String> row) throws DAOException
//и
private static Collection<MetaDataDTO> buildMetaDataDTO(Collection<Collection<String>> bulkdata) throws DAOException
На эти строчки и ругается компилятор. Я в java не силен, но из нескольких источников узнал, что для обратной совместимости используется такая фигня, как type erasure. И что после удаления типов, эти методы будут выглядеть так:
private static MetaDataDTO buildMetaDataDTO(Collection row) throws DAOException
//и
private static Collection<MetaDataDTO> buildMetaDataDTO(Collection bulkdata) throws DAOException
т.е. сигнатура у них станет одинаковой. И я совсем не представляю, как решить эту проблему. У авторов-то вроде как компилируется этот код. Что можно изменить, чтобы и у меня всё скомпилилось

 ,

memnek ()

Разработка на js

Форум — Development

Лор, посоветуй годные статьи, или книжки, или поделись своим опытом по организации разработки на js (интересует в основном клиентская часть).

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

Потому что для многих других языков все более-менее понятно. Например, в питонах или плюсах есть команды импорта модулей. А в js такого нет. Я хочу разработать какую-то программу (в свою очередь состоящую из модулей), использующую стороннюю библиотеку. Можно, например, в браузере все модули и библиотеки подключить в тегах script. Но тогда при разработке моего модуля в отдельном файле IDE не будут видеть функции из библиотеки и других модулей. В nodejs есть require, но в браузерном js такого нет. Скопипастить весь код библиотеки в один файл при разработке, а потом разбить по модулям?

В общем, как все это организовать. При этом не хочется тащить кучу разных библиотек, вроде require.js. Меня сейчас интересует разработка на jQuery и Angular.

 

memnek ()

JSF и javascript

Форум — Development

C jsf я мало знаком и не могу понять один момент. Мне необходимо динамически изменять select-поле. На странице есть один селект, который генерируется из БД. Ещё один селект создаётся вручную. Нужно прикрутить js-функцию, которая будет генерировать селект, исходя из других двух.

Примерный код:

<h:selectOneMenu id="id1" value="#{controller1.selected.name}">
    <f:selectItems value="#{controller2.itemsAvailableSelectOne}"/>
    <f:ajax event="change" onevent="foo"/>
</h:selectOneMenu>
...
<select id="id2" onChange="foo">
    <option>1</option>
    ...
    <option>10</option>
</select>
<select id="target">
</select>
<script>
function foo() {
    var val1 = #{controller2.select.field1};
    var val2 = #{controller2.select.field2};
    var val3 = $('id2').value;
    var html1 = "<option>" + val1 + val3 + "</option>";
    var html2 = "<option>" + val2 + val3 + "</option>";
    $('#target').html(html1 + html2);
}
</script>

Но, так как при загрузке страницы по-умолчанию в первом селекте не выбрано ничего, то первая строчка js-функции будет неправильной, и функция не создастся. Как это решить?

 ,

memnek ()

Django и статика

Форум — Web-development

ЛОР, поясни, какова роль MEDIA_ROOT и STATIC_ROOT. да, я знаю, что статические файлы вроде css и js надо хранить в STATIC_ROOT, который должен быть где-то за пределами проекта и нужно настроить север на выдачу этой статики. в MEDIA_ROOT загружается контент, например, из ImageField. по идее, MEDIA_ROOT нужно тоже держать за пределами проекта. а как быть, если нужно держать стили внутри проекта, чтобы они были в репозитории? да и команда collectstatic собирает всё из MEDIA_ROOT и копирует в STATIC_ROOT. но тогда будет дублирование одного и того же контента, что плохо. как правильно организовать свой проект, если нужно чтобы часть статики была в репозитории (свои стили и js-файлы), но при этом загружаемый контент от клиента не попадал в репу?

Перемещено post-factum из development

 

memnek ()

mmap и указатели

Форум — Development

Имеется реализация двусвязного динамического списка. Структуры, описывающие его примерно такие:

struct node {
    int value;
    int size;
    struct node* next;
    struct node* prev;
};
struct dlist {
    struct node* head;
    struct node* tail;
};
Ну и соответствующие функции создания списка, добавления элемента, удаления элемента и прочего имеются.

Нужно уже созданный список заммапить в файл, а потом его прочитать. Сам я пытался записывать через memcpy и через поэлементное копирование. Но как-то не вышло. Как правильно это сделать?

 ,

memnek ()

pyqt меню

Форум — Development

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

fileMenu = QtGui.QMenu("File")
exitAction = QtGui.QAction(self.tr('&Exit'), self)
self.connect(exitAction, SIGNAL("triggered()"), SLOT("close()"))
fileMenu.addAction(exitAction)
self.menuBar().addMenu(fileMenu)
, то менюбар остаётся пустой.

Так каким образом тогда можно добавить сформированное меню в менюбар (или подменю)?

memnek ()

RSS подписка на новые темы