Pull to refresh
128
0
Сергей @seriyPS

backend

Send message
lambdas = [lambda a: a + i for i in xrange(5)]
[l(1) for l in lambdas]
# [5, 5, 5, 5, 5]
Чем геттекст то не угодил?
Там же всё это давно есть — и множественные формы (одно яблоко, 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
А почему правила описываются каким-то AnyWord<h-reg1, l-quoted>, а не регулярным выражением?
В нагрузку:
Статья на lyse learnyousomeerlang.com/maps
Статья от Joe Armstrong joearms.github.io/2014/02/01/big-changes-to-erlang.html
Насчёт jabber — не всегда. Если Jabber-сервер Ejabberd, то всё ок.
Ааа =) Мне очень помогла Erlang and OTP in Action, но тогда ещё не существовал Learn You Some Erlang for great good! , возможно он лучше. Но «OTP in action» крутая книжка, её должно хватить.
Посоветую что? Не понял вопроса.
Поздравляю с первым проектом, но код конечно оставляет не лучшие впечатления. Книжечку бы вам почитать какую-нибудь.

erl2048_app:start/2 должна возвращать Pid корневого супервизора приложения, у вас же возвращается Pid подключения к БД. Это очень плохо, т.к. будет некорректно работать application:stop и не будет детектиться падение процессов приложения.

Вместо
start() ->
	application:start(ranch),
	application:start(crypto),
	application:start(cowlib),
	application:start(cowboy),
	application:start(inets),
	application:start(mochiweb),
	application:start(erl2048).

лучше написать
start() ->
    % генератор списков
    [application:start(App) || App <- [ranch,crypto, cowlib, cowboy,inets,  mochiweb, erl2048]].

(причем inets, mochiweb вряд ли реально нужно стартовать) но более правильный подход — указать все эти приложения в том самом app.src файле и использовать функцию application:ensure_all_started/1

% file: erl2048.app.src
{applications, [
    kernel,
    stdlib,
    ranch,crypto, cowlib, cowboy
]},
% file: erl2048_app.erl
start() -> application:ensure_all_started(erl2048).


Как уже сказали, start/0 лучше перенести в erl2048_app.
Для запуска обычно так делают:
erl -pa ../erl2048/ebin -pa deps/*/ebin -s erl2048_app start -noshell -detached

(см -s erl2048_app start).
Печалька. Единственный облачный сервис, которым пользовался (и на всех компьютерах и на телефоне).
На что переходить? Кроме Dropbox есть варианты?
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
Причина простая — порт для SMTP это 25. RFC, IANA.

sudo iptables -t nat -A PREROUTING -p tcp -m tcp --dport 25 -j REDIRECT --to-ports 9025
Настройте SPF запись в DNS:

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;
Поверьте, проще написать callback чем порождать треды и процессы и взаимодействовать с ними.

Вы так пишете потому, что не работали с Erlang (ну или Go / gevent etc).
Может чего-то недопонял, но похоже этот SkyDNS можно заменить на dnsmasq (к слову, у меня занимает 880кб памяти, раз уж упомянули).
Забавно. Примерно для таких же целей написал для себя HTTP Echo сервис — это 100 строк на Python, собственный примитивный парсер HTTP. Но он не логгирует куда-то, а просто возвращает запрос как есть в теле ответа (ну, плюс в первой строчке IP и порт запросившего).
Главный минус — написан в блокирующем стиле и однопоточный. Но для личных нужд более чем достаточно.
Ну а что, conn.NewSession() на каждую команду вроде ничего сложного. Но это не так часто нужно. Обычно нужно подключиться и выполнить одну-две команды.
Но в докладе не об этом. Там именно распределённая сеть какая то используется в стиле «клиентский ПК подключается к 50 аггрегаторам, каждый из которых подключается к другим 50 аггрегаторам, каждый из которых подключен к N конечных серверов». И при этом ответы выдаются не как есть а тоже аггрегируются, мерджатся и т.п. Деталей сейчас уже не помню.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Works in
Date of birth
Registered
Activity