Ну насколько я понимаю junior вакансию найти практически не реально. Очень редкая вакансия, большинству нужны уже достаточно опытные люди, обучать не мейнстрим языку не выгодно. Нужно учиться, писать проект какой-нибудь, получать опыт. Тогда больше шансов найти. Сейчас сам ищу. В Украине вообще плохо с этим. Появилась мысль пропагандировать scala в некоторых софтверных компаниях, может кто захочет попробовать.
Хотя после запуска я понял ваше недоумение: программа выполнилась за 1 сек, вместо 0 (у sbt таймер с округлениями). Это никак не 45 сек. До этого я пускал с дампом этих уровней, выполнялось долго, но похоже тут проблема в выводе огромных данных в консоль. Могу лишь предположить, что либо в хаскелле всё плохо со списками, либо автор тоже выводил какой-то дамп.
ЗЫ еще не совсем понятно, что именно делается за 45 секунд. если отключить проверку на то, что следующее состояние уже было ранее, то лодка по кругу будет бесконечно возить одно и то же.
Не совсем так. Это поиск в ширину (как уже написали). Если проверку не делать, то на следующий уровень добавляется больше потенциальных решений, которые на свой следующий уровень добавят ещё больше потенциальных зацикленых решений, и программе придётся тоже их обрабатывать, пока не найдётся решение. С проверкой, очередь вырастает до 4-х элементов максимум (вот тут дамп моего решения), а так вообще держится на 2х-3х элементах. Без проверки, там безумные цифры.
да, и под ddwrt и openwrt есть разные способы не забивать wi-fi, или вообще стримать только на необходимый ethernet порт. Но у меня htpc подключён к сети по wi-fi. Да и вообще мало ли возникает необходимость смотреть IPTV по wi-fi. udpxy прекрасно решает эту проблему, можно спокойно смотреть по буку и htpc одновременно.
Можно с помощью igmp-proxy. Но с таким вариантом есть траблы с вайфай. Как минимум на ddwrt так было, но насколько помню, это связано не с прошивкой, а с устройством multicast
Как-то пытался сделать похожую схему. Только на тот момент у меня все файлы и dlna сервер были на компе. Использовал mediathomb (mt). Решил попробовать завернуть IPTV на телевизор через mt. Начитался, что mt умеет не просто файлы стримать но и пускать процессы и стримать результат (есть куча разных примеров транскодеров с ffmpeg). Решил сделать так же с IPTV — ffmpeg читает поток и транскодит его в понятный телевизору формат. Но так и не добился положительных результатов, телевизор просто отказывался это показывать, хотя сам транскодинг работал на ура. В итоге сейчас у меня неттоп c xbmc(всё таки самсунговская оболочка и рядом не стоит с xbmc), а IPTV транслируется через udpxy на роутере. Сейчас посмариваю в сторону LiveTV билда xbmc и tvheadend, но не уверен получится ли пустить tvheadend на роутере (на ddwrt не вышло, щас стоит openwrt, на нём ещё не пробовал).
P.S. кста, dlna по сути простой http, а udpxy транслирует по http. возможно получится завернуть IPTV с помощью udpxy, такую схему я не пробовал.
Ну началось. Я вам показал ваш пример на twisted/python. Я не хочу начинать холивар node.js vs twisted. Я хочу заставить вас задуматься, а подходит ли javascript для асинхронного программирования, хочу вызвать желание посмотреть на другие инструменты. Может какой-нибудь из них вам покажется удобнее и не придётся изобретать «комфортный стиль кода», а просто брать и писать.
Вот блин, умеете уговаривать. Я на twisted не писал HTTP аппликухи и с mysql не работал, но приблизительно это будет выглядить так:
@defer.inlineCallbacks
def processRequest(request):
dataset = Dataset()
count = yield db.query('SELECT COUNT(id) FROM books')
// заполняем dataset
books = yield db.query('SELECT * FROM books LIMIT ' + dataset.limit + ' OFFSET ' + dataset.offset)
// заполняем dataset
meta = yield db.query('SELECT * FROM bookData WHERE bookId IN (' + dataset.ids.join(', ') + ')');
// ... заполняем dataset
defer.returnValue(Render(dataset));
Насчёт response не уверен, но должно быть так, достаточно просто вернуть объект типа Response. В крайнем случае будет выглядить как у вас: второй аргумет и вызов .write()
Для вас возможно, но мне последовательная запись привычнее «лапши» или объекта с N методов.
Я не говорю что python идеальный претендент для асинхронного языка, там своих костылей хватает, но пока смело могу объявить 1:0 в пользу twisted перед node.js в номинации «асинхронный стиль» (как минимум в моём личном рейтинге).
Асинхронно можно писать на многих языках, но на одних код будет простым, красивым и понятным, а на других придётся изобретать свои стили, чтобы хоть как-то оформить получившуюся кучу. Возможно такого языка ещё нет, возможно мы просто про него не слышали.
Конечно, уже пошёл писать :) Приведу лишь пример с одного блога:
@defer.inlineCallbacks
def someFunction():
a = 1
b = yield deferredReturningFunction(a)
c = yield anotherDeferredReturningFunction(a, b)
defer.returnValue( c )
Отличие от синхронного стиля в двух вещах: @defer.inlineCallbacks аннотация и yield перед вызовом асинхронного метода.
Честно, не знаю. Но когда возникают такие вопросы/проблемы/холивары, на ум приходит только одно — а тот ли инструмент используется?
На сегодня я пользовался только twisted и знаю, что благодаря питоновским генераторам можно писать асинхронный код в привычном последовательном стиле. Ещё есть akka, erlang и уверен, что куча других фреймворков для асинхронного программирования, но их не юзал.
Ничего не имею конкретного против асинхронной модели node.js, но очень похоже, что javascript не лучший кандидат для асинхронного программирования.
В Linux эта проблема решена (как минимум в Ubuntu или Nautilus + FileRoller). Правый клик -> распаковать здесь. Если архив содержит в корне более одного файла, то будет создана папка с именем архива и файлы поместятся туда. Если один файл/папка то просто «распакуется здесь».
Хотя после запуска я понял ваше недоумение: программа выполнилась за 1 сек, вместо 0 (у sbt таймер с округлениями). Это никак не 45 сек. До этого я пускал с дампом этих уровней, выполнялось долго, но похоже тут проблема в выводе огромных данных в консоль. Могу лишь предположить, что либо в хаскелле всё плохо со списками, либо автор тоже выводил какой-то дамп.
Не совсем так. Это поиск в ширину (как уже написали). Если проверку не делать, то на следующий уровень добавляется больше потенциальных решений, которые на свой следующий уровень добавят ещё больше потенциальных зацикленых решений, и программе придётся тоже их обрабатывать, пока не найдётся решение. С проверкой, очередь вырастает до 4-х элементов максимум (вот тут дамп моего решения), а так вообще держится на 2х-3х элементах. Без проверки, там безумные цифры.
P.S. кста, dlna по сути простой http, а udpxy транслирует по http. возможно получится завернуть IPTV с помощью udpxy, такую схему я не пробовал.
Насчёт response не уверен, но должно быть так, достаточно просто вернуть объект типа Response. В крайнем случае будет выглядить как у вас: второй аргумет и вызов .write()
Я не говорю что python идеальный претендент для асинхронного языка, там своих костылей хватает, но пока смело могу объявить 1:0 в пользу twisted перед node.js в номинации «асинхронный стиль» (как минимум в моём личном рейтинге).
Асинхронно можно писать на многих языках, но на одних код будет простым, красивым и понятным, а на других придётся изобретать свои стили, чтобы хоть как-то оформить получившуюся кучу. Возможно такого языка ещё нет, возможно мы просто про него не слышали.
Отличие от синхронного стиля в двух вещах:
@defer.inlineCallbacks
аннотация иyield
перед вызовом асинхронного метода.На сегодня я пользовался только twisted и знаю, что благодаря питоновским генераторам можно писать асинхронный код в привычном последовательном стиле. Ещё есть akka, erlang и уверен, что куча других фреймворков для асинхронного программирования, но их не юзал.
Ничего не имею конкретного против асинхронной модели node.js, но очень похоже, что javascript не лучший кандидат для асинхронного программирования.