Чем геттекст то не угодил?
Там же всё это давно есть — и множественные формы (одно яблоко, 2 яблока, 5 яблок) и контекст (msgctxt) и память переводов (впрочем, зависит от софта для перевода) и утилиты для извлечения фраз из исходников и формат хранилища с O(1) доступом (.mo) и куча опыта.
Разве что многоуровнего фейловера нет, но это мелочь.
tree = etree.HTML(html)
for block in tree.xpath("//div[@class='product']"):
img = block.xpath("//img/@src")[0]
name = block.xpath("//tr[@class='name']")[0].text
id = block.xpath("//tr[@class='id']")[0].text
Поздравляю с первым проектом, но код конечно оставляет не лучшие впечатления. Книжечку бы вам почитать какую-нибудь.
erl2048_app:start/2 должна возвращать Pid корневого супервизора приложения, у вас же возвращается Pid подключения к БД. Это очень плохо, т.к. будет некорректно работать application:stop и не будет детектиться падение процессов приложения.
(причем inets, mochiweb вряд ли реально нужно стартовать) но более правильный подход — указать все эти приложения в том самом app.src файле и использовать функцию application:ensure_all_started/1
trac.pjsip.org/repos/wiki/Python_SIP/Calls Изучал вопрос — на этой библиотеке можно за пару вечеров написать (она поддерживает проигрывание звукового файла в телефонный звонок по SIP). Но до реализации руки не доходят.
Одному другу моей подруги СМС, тьфу тьфу, не приходят, но раза 2 в неделю на каждом этаже в подъезде развешивают наклейки с рекламой суши и компьютерной помощи.
Раньше он им на сайтах на форму заказа бота натравливал на пару суток, но потом это надоело (бота под сайт подстраивать), да и эффекта достаточного не было, плюс капчу стали вешать. Сейчас он всё хочет выкроить времени и на библиотеке trac.pjsip.org/repos/wiki/Python_SIP/Calls написать SIP бота, который через SIP названивал бы им на телефон из рекламки и зачитывал какой-нибудь поучительный текст. Можно пойти дальше и применить к продавцам MIX/Spice, которые любят заборы и асфальт разрисовывать. С учетом посекундной тарификации выйдет не дорого.
Он у вас почему-то не-MIME письма не принимает — молча закрывает сокет и всё. Понимаю, конечно, что plaintext письма почти никто не отправляет сейчас, но можно же хотя-бы по человечески по RFC ответить сообщением об ошибке и только после этого отключаться.
$ python
Python 2.7.3 (default, Feb 27 2014, 20:00:17)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import smtplib
>>> s = smtplib.SMTP('debugmail.io', 9025, 'localhost')
>>> s.login("*********************", "***************")
(235, '2.7.0 Authentication successful')
>>> s.sendmail("wasd@localhost", "to@localhost", "non-mime-plaintext")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/smtplib.py", line 734, in sendmail
(code, resp) = self.data(msg)
File "/usr/lib/python2.7/smtplib.py", line 502, in data
(code, msg) = self.getreply()
File "/usr/lib/python2.7/smtplib.py", line 361, in getreply
raise SMTPServerDisconnected("Connection unexpectedly closed")
smtplib.SMTPServerDisconnected: Connection unexpectedly closed
Received-SPF: softfail (google.com: domain of transitioning nobody@develop.re does not designate 78.47.190.161 as permitted sender) client-ip=78.47.190.161;
Забавно. Примерно для таких же целей написал для себя HTTP Echo сервис — это 100 строк на Python, собственный примитивный парсер HTTP. Но он не логгирует куда-то, а просто возвращает запрос как есть в теле ответа (ну, плюс в первой строчке IP и порт запросившего).
Главный минус — написан в блокирующем стиле и однопоточный. Но для личных нужд более чем достаточно.
Ну а что, conn.NewSession() на каждую команду вроде ничего сложного. Но это не так часто нужно. Обычно нужно подключиться и выполнить одну-две команды.
Но в докладе не об этом. Там именно распределённая сеть какая то используется в стиле «клиентский ПК подключается к 50 аггрегаторам, каждый из которых подключается к другим 50 аггрегаторам, каждый из которых подключен к N конечных серверов». И при этом ответы выдаются не как есть а тоже аггрегируются, мерджатся и т.п. Деталей сейчас уже не помню.
Там же всё это давно есть — и множественные формы (одно яблоко, 2 яблока, 5 яблок) и контекст (msgctxt) и память переводов (впрочем, зависит от софта для перевода) и утилиты для извлечения фраз из исходников и формат хранилища с O(1) доступом (.mo) и куча опыта.
Разве что многоуровнего фейловера нет, но это мелочь.
AnyWord<h-reg1, l-quoted>
, а не регулярным выражением?Статья на lyse learnyousomeerlang.com/maps
Статья от Joe Armstrong joearms.github.io/2014/02/01/big-changes-to-erlang.html
erl2048_app:start/2
должна возвращать Pid корневого супервизора приложения, у вас же возвращается Pid подключения к БД. Это очень плохо, т.к. будет некорректно работать application:stop и не будет детектиться падение процессов приложения.Вместо
лучше написать
(причем inets, mochiweb вряд ли реально нужно стартовать) но более правильный подход — указать все эти приложения в том самом
app.src
файле и использовать функциюapplication:ensure_all_started/1
Как уже сказали,
start/0
лучше перенести вerl2048_app
.Для запуска обычно так делают:
(см
-s erl2048_app start
).На что переходить? Кроме Dropbox есть варианты?
Раньше он им на сайтах на форму заказа бота натравливал на пару суток, но потом это надоело (бота под сайт подстраивать), да и эффекта достаточного не было, плюс капчу стали вешать. Сейчас он всё хочет выкроить времени и на библиотеке trac.pjsip.org/repos/wiki/Python_SIP/Calls написать SIP бота, который через SIP названивал бы им на телефон из рекламки и зачитывал какой-нибудь поучительный текст. Можно пойти дальше и применить к продавцам MIX/Spice, которые любят заборы и асфальт разрисовывать. С учетом посекундной тарификации выйдет не дорого.
по человеческипо RFC ответить сообщением об ошибке и только после этого отключаться.Received-SPF: softfail (google.com: domain of transitioning nobody@develop.re does not designate 78.47.190.161 as permitted sender) client-ip=78.47.190.161;
Вы так пишете потому, что не работали с Erlang (ну или Go / gevent etc).
Главный минус — написан в блокирующем стиле и однопоточный. Но для личных нужд более чем достаточно.
conn.NewSession()
на каждую команду вроде ничего сложного. Но это не так часто нужно. Обычно нужно подключиться и выполнить одну-две команды.Но в докладе не об этом. Там именно распределённая сеть какая то используется в стиле «клиентский ПК подключается к 50 аггрегаторам, каждый из которых подключается к другим 50 аггрегаторам, каждый из которых подключен к N конечных серверов». И при этом ответы выдаются не как есть а тоже аггрегируются, мерджатся и т.п. Деталей сейчас уже не помню.