• Как получить ответ в виде массива из базы данных?

    @PapaStifflera
    Родился, вырос...
    С драйвером "из коробки" не сможете.
    Для постгри есть альтернатива - go-pg (https://github.com/go-pg/pg). Он позволяет делать то, что вам нужно. И еще кучу всего.
    Ответ написан
    Комментировать
  • Как правильно самому себе накидать ТЗ и план работ?

    titov_andrei
    @titov_andrei
    All my life I learn - and die a fool!
    Если есть стопор, то видимо нет цели. Либо она не явно выражена.

    Можно просто начать что то делать и смотреть что выходит и потом думать, что с этим шедевром делать и куда применить.

    А так не понятно, зачем себе придумывать задачи. Проще ведь помогать кому то, пусть и с дурацкими, но реальными проблемами.

    Ищите их - ибо всё равно надо будет прийти к тому, что нужно искать заказы.
    Ответ написан
    Комментировать
  • Тема для диплома (специалист) Компьютерные науки?

    AlexXYZ
    @AlexXYZ
    O Keep Clear O
    Быть придатком своей программы на много лет вперёд - не завидная участь. Лучше выберите проект, который можно сделать за небольшое количество времени, хоть за неделю, но тщательно его обдумайте, пока не получите четкое видение результата. (У математиков такое есть - перед решением интеграла "увидеть" ответ, а потом его проверить).
    Хорошая программа - это и хороший интерфейс, и хороший хелп, и хороший установщик, и хороший саппорт. Вряд ли от диплома требуется все это. Спрашивать у бизнеса - идея так себе, т.к. бизнесу нужны решения, а не ваш диплом и далеко не все задачи бизнеса тянут на диплом. Я на работе, например, две недели писал синхронизатор каталогов файлового сервера (несколько десятков тыщ документов и это только для одного проекта) между файловым сервером и Sharepoint. Для моей фирмы очень актуальная задача, но как дипломная работа - не очень. Утилита и только.
    Но вот на выходных попалась интересная задачка - снимать значения с бумажных графиков, номограмм (эмпирические графики). Надо снимать с них значения по заданным параметрам. Оцифровка не катит, Надо было написать графический редактор, чтобы можно было масштабировать рисунок (взял leaflet), добавил к нему редактор полилиний (leaflet.editor), чтобы обводить линии номограммы и написал небольшой матаппарат, чтобы достроить графики по промежуточным значениям (применил morphing). Получилась неплохая утилита для старых расчетных методичек, чтобы не пользоваться линейкой, когда снимаешь как и показания с заданных линий, так и с промежуточных. И снимает достаточно точно. Ну, вот такой способ втащить научные legacy данные в сегодняшний день. Ну вот такая задача вполне могла пойти за диплом или как минимум за заготовку.
    Если интересно, то могу дать список некоторых проектов на моей работе, вдруг вам ещё какая-то мысль придёт в голову, для вашего диплома.
    Ответ написан
    2 комментария
  • Способы реализации p2p обмена сообщениями. Каким образом blockchain может быть использован в создании мессенджера?

    jamakasi666
    @jamakasi666
    Просто IT'шник.
    Совсем отказаться от серверов или чего то что будет говорить где какой клиент крайне сложно. Мы живем в мире где куча НАТов и серых ip адресов с динамикой.
    По факту Вам надо решить следующие проблемы:
    1) Реализовать "пробивалку" NATов. Способов много и нужно учитывать максимальное их количество. Это и UPnP, и возможность пробития порта через соседа который это может сделать и соединение с другим клиентом и уже через него выходить в общую сеть обмена.
    2) Нужен некий механизм доверия между клиентами т.к. никакого центрального сервера авторизации не будет. Тут способов тоже много и чаще всего применяется шифрование по некоторому ключу который генерируется у каждого клиента к каждому клиенту, после чего хранится локально. Даже если некий клиент прикинется другим клиентом с его ключем то ничего не выйдет. Сообщения дойдут но прочитать их он уже не сможет без индивидуальных ключей к каждому клиенту которые злоумышленник узнать уже не сможет никак.
    3) Понадобится некая реализация системы для сообщения IP адреса и порта клиентов друг другу. Тут уже варианты абсолютно разные со своими плюсами и минусами. Самый простой это некоторый сервер который только знает ip:port:идентификатор_клиента, с ним все и работают(естественно ничего более этот сервер не делает и сообщения и данные ходят между клиентами напрямую).
    Другой вариант это все тот же сервер который дает и знает ip:port:идентификатор_клиента но отличительно то что он динамический и создается у лучшего клиента(лучший выбирается по неким критериям типа хороший инет, выделенный ip, отсутсвие ната и т.д.). Т.е. сервер все также остался но переехал к самим клиентам и мало того их стало много. Этот способ и есть DHT и из него вырастает следующая проблема.
    4) Т.к. теперь у тебя полностью децентрализованная сеть на основе DHT или своего велосипеда который тоже повторяет DHT выросла проблема в том что клиенты могут оказаться в разных сетях с этими DHT и вообще не знать друг о друге. Тут понадобится реализация некоего механизма что бы DHT сервера искали и знали друг о друге. Как это будет реализованно тоже огромный геморойный вопрос, можно сделать еще один слой в виде DHT над DHT, можно сделать некоторые центральные сервера, можно пойти путем жесткого бродкаста между DHT узлами и т.д.

    Полноценно настоящая децентрализованная сеть возможно только в мире где у каждой железки в сети свой уникальный статичный IP и полностью отсутсвуют фаирволы а сама сеть построена без шлюзов и без деления на подсети. Но как понятно такого никогда не было и не будет но возможно внутри маленькой локальной сети.
    Чуть не забыл, такой p2p чат уже существует в виде Tox. Отдельно существуют подобные чаты в виде плагинов в битторрент клиенте Vuze-.
    Ответ написан
    3 комментария
  • Генерация простого числа заданного размера?

    @MikhailEdoshin
    Вот сниппет непосредственно из реализации RSA:

    def rmspp(number, attempts=28):
        """
        rmspp(n, attempts=28) -> True if n appears to be primary, else False
        rmspp: Rabin-Miller Strong Pseudoprime Test
        http://mathworld.wolfram.com/Rabin-MillerStrongPseudoprimeTest.html
        """
        if number < 2:
            return False
        if number == 2:
            return True
        if number % 2 == 0:
            return False
        # Given an odd integer n, let n = 2**r*s+1, with s odd... 
        s = number - 1
        r = 0
        while s % 2 == 0:
            r += 1
            s /= 2
        while attempts:
            # ... choose a random integer a with 1 ≤ a ≤ n-1
            a = randint(1, number-1)
            # Unless a**s % n ≠ 1 ...
            if mod_exp(a, s, number) != 1:
                # ... and a**((2**j)*s) % n ≠ -1 for some 0 ≤ j ≤ r-1 
                for j in range(0, r):
                    if mod_exp(a, (2**j)*s, number) == number-1:
                        break
                else:
                    return False
            attempts -= 1
            continue
        # A prime will pass the test for all a.
        return True
    
    def mod_exp(base, exponent, modulus):
        """
        mod_exp(b, e, m) -> value of b**e % m
        Calculate modular exponentation using right-to-left binary method.
        http://en.wikipedia.org/wiki/Modular_exponentiation#Right-to-left_binary_method
        """
        result = 1L
        while exponent > 0:
            if (exponent & 1) == 1:
                result = (result * base) % modulus
            exponent >>= 1
            base = (base * base) % modulus
        return result

    Вызывается он внутри генерации ключей (с дополнительными оптимизациями) примерно так:

    def keys(bits):
        """
        keys(bits) -> (public, private)
        Generate public and private RSA keys of the given size.
        """
        # Pragma: use a fixed e, the fourth Fermat prime (0b10000000000000001)
        e = 2**16+1
        while True:
            # Generate two large prime numbers p and q, n = pq and φ = (p-1)(q-1)
            s = bits / 2
            mask = 0b11 << (s - 2) | 0b1 # two highest and the lowest bit
            while True:
                p = getrandbits(s) | mask
                # Pragma: check p % e here to guarantee that φ and e are coprimes
                if p % e != 1 and rmspp(p): 
                    break
            s = bits - s
            mask = 0b11 << (s - 2) | 0b1 # same as above, but maybe different s
            while True:
                q = getrandbits(s) | mask
                if q != p and q % e != 1 and rmspp(q): 
                    break
            n = p * q
            phi = (p - 1) * (q - 1)
            # Pragma: e is chosen already and is relative prime to φ
            # Compute d, a modular multiplicative inverse to e (i.e. e*d % φ = 1)
            d = mmi(e, phi)
            if d: # if not, the process will repeat
                break
        return (n, e), (n, d)
    
    ef mmi(a, m):
        """
        mmi(a, m) -> x, such as ax % m = 1
        mmi is a Modular Multiplicative Inverse
        See http://en.wikipedia.org/wiki/Modular_multiplicative_inverse
        """
        gcd, x, q = egcd(a, m)
        if gcd != 1:
            # The a and m are not coprimes, so the inverse doesn't exist
            return None
        else:
            return (x + m) % m
    
    def egcd(a, b):
        """
        egcd(a, b) -> d, x, y, such as d == gcd(a, b) == ax + by
        egcd is an Extended Greatest Common Divisor
        http://en.wikipedia.org/wiki/Extended_Euclidean_algorithm
        """
        if b == 0:
            return (a, 1, 0)
        else:
            d, x, y = egcd(b, a % b)
            return d, y, x - y * (a / b)

    Насчет «доли вероятности» — насколько я помню, в алгоритме Миллера-Рабина при увеличении числа попыток вероятность ложного срабатывания легко сделать сколь угодно малой (например, меньше чем верояность отказа железа :), и, кроме того, насколько я помню, конкретно в случае с RSA полученные числа будут еще раз проверены при расчете modular multiplicative inverse, а его невозможно будет получить, если число не простое (приведенная функция keys() в таком случае продолжает цикл генерации).
    Ответ написан
    2 комментария
  • Как собрать установочный пакет на Linux для Linux?

    leahch
    @leahch Куратор тега Linux
    3D специалист. Dолго, Dорого, Dерьмово.
    0) Желательно все упаковать в virtuelenv, если используете pip. Или использовать стандартные пакеты системы.
    1) Создаете каталог для своего пакета, например myservice-0.001
    2) Кидаете все свои исходники в этот каталог, пути ставите, как они у вас будут в целевой системе
    Например:
    etc/systemd/system/myservice.service
    opt/myservice/...
    opt/.myservice-venv/...
    usr/bin/myservice

    И т.д.
    3) Создаете там же каталог DEBIAN, в него кладете файл control - https://www.debian.org/doc/debian-policy/ch-contro...
    , и файл postinst (опционально) - https://www.debian.org/doc/debian-policy/ch-mainta...

    В control описываете свои зависимости и название пакета, какие пакеты замещает
    postinst - исполняемый, запускается после установки пакета, пользхователей там создать, сервис запустить и т.д.
    root@xxx:~/xxx-2.40# cat DEBIAN/control
    Package: xxx
    Version: 2.40
    Section: custom
    Priority: optional
    Architecture: all
    Essential: no
    Installed-Size: 171700
    Maintainer: xxx.ru
    Description: XXX DS system
    Depends: samba, isc-dhcp-server, python-twisted, libdate-manip-perl, libio-socket-multicast-perl
    Replaces: isc-dhcp-server, samba
    Recommends: sudo, vim, nano

    и
    root@xxx:~/xxx-2.40# cat DEBIAN/postinst
    #!/bin/sh
    # postinst script for webpy-example
    #
    # see: dh_installdeb(1)
    
    set -e
    
    # summary of how this script can be called:
    #        * <postinst> `configure' <most-recently-configured-version>
    #        * <old-postinst> `abort-upgrade' <new version>
    #        * <conflictor's-postinst> `abort-remove' `in-favour' <package>
    #          <new-version>
    #        * <postinst> `abort-remove'
    #        * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
    #          <failed-install-package> <version> `removing'
    #          <conflicting-package> <version>
    # for details, see http://www.debian.org/doc/debian-policy/ or
    # the debian-policy package
    
    # source debconf library
    . /usr/share/debconf/confmodule
    
    case "$1" in
    
      configure)
        adduser --quiet --system --home /inbox  xxx || echo "User xxx existed!"
        usermod -p yyyy xxx
        (echo new123; echo new123) | smbpasswd -as xxx
        smbpasswd -e xxx
        systemctl enable xxx
        systemctl start xxx
      ;;
    
      abort-upgrade|abort-remove|abort-deconfigure)
        exit 0
      ;;
    
      *)
        echo "postinst called with unknown argument \`$1'" >&2
        exit 1
      ;;
    
    esac
    
    # dh_installdeb will replace this with shell code automatically
    # generated by other debhelper scripts.
    
    #DEBHELPER#
    
    db_stop
    exit 0

    4) идете на каталог ниже и выполняете
    dpkg-deb --build myservice-0.001
    Рядом получаете файло myservice-0.001.deb

    Доне.

    PS.Про иконки и прочее отдельно читайте, этого я вам не скажу.
    Ответ написан
    Комментировать
  • Разделение монитора на "рабочие" области?

    lashtal
    @lashtal
    в вин7 же как раз можно утащить окно вправо или влево — оно и займет пол-экрана. Или с клавы — win+влево и win+вправо. Утилитка windowspace от ntwind делает то же, где-то может даже лучше.
    Ответ написан
    1 комментарий