Ответы пользователя по тегу Программирование
  • Реально ли имплементировать ospfv2 на linux?

    @throughtheether
    human after all
    Так вот вопрос - насколько это реально сделать?
    Думаю, вполне реально. Особенно учитывая, что есть такие проекты, как Zebra или Quagga.
    Ответ написан
    Комментировать
  • Как изучать сети?

    @throughtheether
    human after all
    Можете подсказать, как вообще эффективнее всего изучить сети?

    Уже отвечал на подобный вопрос. Но могу кое-что дополнить.

    Арендуйте VPS за долларов 5-10, или бесплатно (amazon). Установите на нем любой TCP-сервис, веб-сервер, например, или echo. Подсоединитесь к сервису при помощи netcat. Попробуйте взаимодействовать с свервисом (слать символы через nc). Запишите трафик взаимодействия на сервере и на клиенте, изучите различия, а они будут, в случае использования NAT. Изучите вывод traceroute 'ip-адрес вашего сервера'. Каждому хопу соотнесите номер AS. Для каждой AS проверьте маршруты до вашего сервера и до вашего домашнего провайдера через looking glass. Постройте граф связей AS (bgp.he.net в помощь).

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

    @throughtheether
    human after all
    С php не имел удовольствия работать, но поводу парсинга могу пояснить.
    Что вам, по большому счету, надо, так это:

    1) скачать страничку сайта или сделать вызов HTTP API. В этом вам помогут библиотеки вроде curl.

    2) разобрать полученные в п.1) данные. В случае API, как правило,это JSON. В случае HTML вам пригодится знание XPATH-выражений (которые также помогут, если в результате выполнения п. 1) вы имеете XML) и css-селекторов. Исполнять эти запросы будет XML- или DOM-парсер.

    3) полученные в п.2) данные сохранить в конечном или промежуточном виде: CSV, записи в RDBMS (sqlite, mysql, postgresql) или NoSql (Mongo, например)

    В дальнейшей работе помогут Selenium (или другой HTTP клиент с исполнением javascript), очереди заданий, кэширование (redis).

    Думаю, направление для поиска я вам задал.
    Ответ написан
    2 комментария
  • В чем заключается работа человека в web и с сетями?

    @throughtheether
    human after all
    Спасибо, что "призвали" в тред, и извините за задержку с ответом.

    Отвечаю на вопрос, вынесенный в заголовок,
    В чем заключается работа человека в web и с сетями?

    Web и сети (интернет) - две большие разницы, как говорят в Одессе.
    В любом случае стоит знать, как между двумя хостами в сети передаются данные. Как инкапсулируются пакеты, мультиплексируются каналы, разделяются ресурсы и так далее. То есть знать азы Ethernet, IP, TCP, UDP и вспомогательных протоколов вроде ARP, ICMP, DNS. Как пользоваться сокетами, какие есть подходы к реализации сетевых приложений. Как и зачем использовать криптографию (криптографические примитивы, для чего нужны, как их сочетать). Как и для чего использовать модели TCP/IP и OSI. Начальная диагностика сети.

    Далее, в случае изучения сетей стоит обратить внимание на маршрутизацию (какая бывает и зачем нужна, откуда столько протоколов маршрутизации и чем различаются, протокол маршрутизации как распределенная система), коммутацию (Ethernet - каким и для чего был создан, каким стал, отличие коммутации Ethernet и маршрутизации IP, есть ли компромиссный вариант), фаерволлы (почему так называются, какую задачу решают, какие бывают), побочные вещи вроде NAT и тоннелей. Какие и где есть потенциальные слабые места.

    Если вас привлечет прикладной бэкэнд, то стоит изучить работу веб-сервера, прослойки между ним и вашим приложением, базы данных, кэширования. Здесь вообще можно попробовать написать самому весь стек, хотя бы на Python.

    Математическая и алгоритмическая подготовка пригодится везде. Касательно языков - Python хорош универсальностью (под практически любые цели из вашего списка годится), C интересен вкупе с архитектурой компьютера и ОС.

    Касательно безопасности - мне представляется само собой разумеющимся, что перед тем, как изучать возможные атаки (т.е. попытки заставить систему работать в нестандартном режиме), необходимо уяснить в деталях, каков обычный "рабочий" режим.
    Ответ написан
    Комментировать
  • Есть ли ресурс на подобии www.checkio.org но для c#?

    @throughtheether
    human after all
    Ответ написан
    Комментировать
  • Можно ли "нормально" заработать на разработке парсеров?

    @throughtheether
    human after all
    Насколько мне известно, для сервисов типа auto.ru, drom.ru и прочая продают десктопные парсеры и их даже кто-то покупает (но там аудитория довольно специфическая).
    Ответ написан
    Комментировать
  • Какую можно взять интересную и необычную тему для диплома?

    @throughtheether
    human after all
    Реализация Tor-релея на модном языке (статья на тему).
    Ответ написан
    Комментировать
  • Какая информация отправляется в TCP посылке?

    @throughtheether
    human after all
    Есть ли в отправляемом пакете информация о количестве отправленных байт?
    Если есть TCP-сегмент, инкапсулированный в IP-пакет, то длину полезной нагрузки (payload) TCP можно узнать так - из длины полезной нагрузки IP (вычисляется как разница полной длины IP пакета, Total Length, и длины заголовка, Internet Header Length) вычитаем длину заголовка TCP (поле Data Offset).

    Если задача другая - узнать, сколько байт получилось отправить, то эту информацию (количество переданных байт), насколько помню, возвращает вызов send/write.
    Ответ написан
  • Как расширить протокол "покер по телефону" на троих?

    @throughtheether
    human after all
    Эта задача иногда именуется "mental poker". Я такую статью нашел, может быть, вам поможет. Сам протокол описан на 5й по счету странице (стр. 88), начиная со слов Proof of Theorem 1.
    Ответ написан
    Комментировать
  • Как улучшить скорость функции?

    @throughtheether
    human after all
    Что можете посоветовать?

    sum(range(n+1)) - константа (в дальнейшем, C) для заданного n, можно вынести ее вычисление за цикл.
    Далее, ваше уравнение можно переписать: b = (C-a)/(a+1). Можно перейти от квадратичного времени к линейному, итерируя по a и проверяя делимость (C-a) на (а+1)

    Навскидку:
    def get_ab(n):
    	C=sum(xrange(1,n+1))
    	return [(a, (C-a)/(a+1)) for a in xrange(1,n+1) if (C-a)%(a+1)==0 and (C-a)/(a+1)<n]


    In [10]: % timeit removNb(10)
    1000 loops, best of 3: 185 us per loop
    In [11]: %timeit get_ab(10)
    100000 loops, best of 3: 6.74 us per loop
    Ответ написан
    3 комментария
  • Как решить задача связанную с такой арифметической прогрессией?

    @throughtheether
    human after all
    Значение на i-том месте (начиная счет с единицы) равно 2i(i-1). Если надо найти индекс значения, то необходимо решить квадратное уравнение вида 2i(i-1)=A, где i-переменная.
    Ответ написан
    1 комментарий
  • Реализация long2ip(). Как конвертировать ip с long в string?

    @throughtheether
    human after all
    Если хотите изобретать велосипед, по при помощи модуля struct запакуйте 32-битное значение в строку и распакуйте результат как 4 байта.

    Если хотите решить задачу без излишних усилий, можете воспользоваться модулем netaddr:
    >>> import netaddr
    >>> int(netaddr.IPAddress('77.88.21.8'))
    1297618184
    >>> str(netaddr.IPAddress(1297618184))
    '77.88.21.8'


    UPD:
    у меня была задача именно самому выполнить эти преобразования,
    Держите тогда два модных однострочника:
    def long_to_dotted_decimal(val):
        return '.'.join(map(str,[val%256**idx/256**(idx-1) for idx in xrange(4,0,-1)]))
    
    def dotted_decimal_to_long(strval):
        return sum(map(lambda (power,octet):256**power*int(octet),enumerate(reversed(strval.split('.')))))

    Пример использования:
    >>> long_to_dotted_decimal(dotted_decimal_to_long('127.0.0.1'))
    '127.0.0.1'
    >>> long_to_dotted_decimal(dotted_decimal_to_long('255.255.255.255'))
    '255.255.255.255'
    >>> long_to_dotted_decimal(1297618184)
    '77.88.21.8'
    >>> dotted_decimal_to_long('77.88.21.8')
    1297618184
    Ответ написан
    3 комментария
  • Как определить публичная ли сеть?

    @throughtheether
    human after all
    Все IPv4 и IPv6 префиксы, кроме некоторых зарезервированных (список здесь), а именно тех, у которых параметр global задан как false, являются глобально маршрутизируемыми. Вероятно, именно их вы называете публичными.
    Ответ написан
    Комментировать
  • Какую выбрать тему для научной работы по физике с элементами программирования?

    @throughtheether
    human after all
    Не знаю, подойдет ли, но идея такая: генератор "истинно" случайных чисел (TRNG) на основе какого-либо физического эффекта.
    Также поддерживаю идею Андрей про TEMPEST и лазерный микрофон, в каждом случае можно еще и меры защиты обдумать (специфичный шум в первом случае и ультразвуковые излучатели на стекле во втором как вариант).
    "Радар" из спичек и желудей (примеры) как демонстрация эффекта Допплера (или другого физического эффекта, зависит от схемы радара).
    Здесь много интересных проектов, но в основном упор на инженерию, а не на вечное сияние чистой науки.
    Ответ написан
    Комментировать
  • Как расчитать произвольный дешифратор?

    @throughtheether
    human after all
    пните пожалуйста в какую сторону читать
    На мой взгляд, тут хватит знания таблиц истинности элементарных функций и умения их комбинировать.
    Мой вариант:
    x1 = b
    x2 = a И НЕ b
    x3 = a ИЛИ b
    x4 = НЕ x3 = НЕ a И НЕ b
    В вентилях можно реализовать по-разному (например, x4 выводить от x3 или от входов).
    Ответ написан
    Комментировать
  • Как найти вдохновение в своей специальности?

    @throughtheether
    human after all
    Написал пятнашки, крестики нолики в консоли с применением мега мелькающей дефолтной графики по средствам раскрашивания askii.
    Может подскажите что можно написать ради себя, ради души и практики,
    Напишите игру/демку, кторая рендерится в ascii-символы, вот пример.
    Ответ написан
    Комментировать
  • Почему задача решается неправильно?

    @throughtheether
    human after all
    Это условие:
    if coord1 + o > 7 or coord2 + o > 7 or coord1 + d > 7 or coord2 + d > 7 or coord1 + o < -1 or coord2 + o < -1 or coord1 + d < -1 or coord2 + d < -1:
                continue
    else:
        ...

    ,на мой взгляд, некорректно, оно отсекает правильные ответы и разрешает неправильные (H8 в примере с исходной клеткой B7). Я бы на вашем месте переписал тело цикла так:
    if 0<=coord1 + o<=7 and 0<=coord2 + d<=7:
            print(doska[coord1 + o][coord2 + d])
    if 0<=coord1 + d<=7 and 0<=coord2 + o<=7:
            print(doska[coord1 + d][coord2 + o])
    Ответ написан
  • Что неправильно в коде?

    @throughtheether
    human after all
    Что этот код, по-вашему, должен делать? А что он по факту делает (т.е. что не нравится)?
    UPD:
    Ошибки кода:
    g.go('...') имя переменной g не объявлено, добавьте перед этой строкой g=grab.Grab()
    u = urllib.urlopen(src) имя переменной src не объявлено.
    Другие ошибки: xpath, скорее всего, неверный. То, что вы скопировали его из firebug/firepath, не гарантирует, что grab сможет его обработать. Скорее всего, браузер и grab видят немного разную страницу, это связано с обработкой javascript. Кроме того, мне (grab 0.4.13, pyton 2.7, windows 7) grab ругался, что метод xpath() более не поддерживается (deprecated).
    UPD2:
    рабочий код с использованием grab:
    import urllib
    import grab
    import json
    
    g=grab.Grab()
    url='https://vk.com/kostya__wolf?z=photo107790602_343297825%2Falbum107790602_00'
    search_string=url[url.find('photo'):url.find('%2F')]
    xpath='//a[contains(@href, "%s")]' % search_string
    g.go(url)
    src=g.doc.select(xpath).attr('onclick')
    d = json.loads(src[src.find('{'):src.find('}}')+len('}}')])
    src=d['temp']['base']+d['temp']['z_'][0]+'.jpg'
    urllib.urlretrieve(src,'bibit.jpg')
    Ответ написан
  • Как парсить html страницы и его обрабатывать?

    @throughtheether
    human after all
    Держите отвратительный, кривой, но работающий код на python:
    from selenium import webdriver
    import time
    browser = webdriver.Firefox()
    url='http://vk.com/go_in_zp?z=photo-50824015_344878304%2Falbum-50824015_00%2Frev'
    browser.get(url)
    time.sleep(5) # this is bad
    img=browser.find_element_by_xpath('//a[@id="pv_photo"]/img')
    print img.get_attribute('src')
    browser.quit()

    вывод:
    http://cs624016.vk.me/v624016533/a226/owG51bJm59o.jpg

    Как этот код можно изменить:
    1) строку time.sleep(5) заменить на проверку нахождения элемента (ждем секунду, проверяем наличие элемента, если его нет, увеличиваем счетчик и продолжаем; при достижении счетчиком максимального значения - таймаут)
    2) заменить selenium на phantom.js (чтобы окно фаерфокса не появлялось)
    3) понять, что происходит при загрузке страницы браузером и имитировать это поведение при помощи requests.
    Третий путь, на мой взгляд, самый трудозатратный и самый многообещающий (в смысле скорости решения).

    UPD:
    решение при помощи requests:
    import requests
    from lxml.html import fromstring
    url='http://vk.com/go_in_zp?z=photo-50824015_344878304%2Falbum-50824015_00%2Frev'
    search_string=url[url.find('photo-')+len('photo-'):url.find('%2F')]
    r=requests.get(url)
    doc=fromstring(r.text)
    xpath='//a[contains(@onclick, "%s")]/img' % search_string
    print doc.xpath(xpath)[0].attrib['src']
    Ответ написан
    2 комментария