Хускара во враги. Чем больнее ему, тем больнее и Фениксу. Хускар за секунду яйцо сломает, если у него огромная скорость атаки будет.
Птички. Манту он не собирает. Да и как писал автор — некогда керри-убиваторам феникса фокусить в замесе (кстати, хускара уровня с 15ого в пабах не видел)
эт ты зря часто его вижу (103лвл)
Отличный гайд! Дано таких не видел! Один из лучших на Dota 2.ru
Неплохо бы добавить урсу во врагов, так как там то же самое, что и с тролем. Даже под дебафом от «птичек» урса убьёт яйцо за пару секунд. А в друзей можно добавить котла, так как АОЕ блайнд отлично сочетается с нашей ультой.
Поставил лойс за название комбо
второй скил просто имбовый, максить полюбому, просто зверское наказание для керри автоатакеров. можно юзать сразу вместе с лучом, но нужна не хилая практика, кидать птичек, целить лучем еще и двигать вперед если нужно. на заметку, скил двигающий во время каста луча позволяет преодолевать препятствия,горы, лес не по чем. грамотный феникс будет просто занозой в заднице для чуваков без бкб в замесах, посылая щедрые подарки с другого конца света)))играю за него как за сапорта, меку иногда беру, если во вражеской тиме магдамагеры пайп просто ваще без базара, куча регена хп и защита от магдамага. ооочень важный арт считаю для него шива. тут нас уже начинают проклинать)))) сначала вносим в замес птичек(желательно не судорожно тыкать, а растягивать, т.к. они не стакаются а обновляют время действия эффекта) и луч, активируем шиву и залетаем на дайве с кольцом холода. что мы имеем?))))))сначала дебафы на скорость -140 + жосткий урон, залетаем на шиве и дайве, вместе -65% скорости передвижения, +аура снижения скорости атаки -40, которая действует даже пока вы находитесь в яйце. не так много конечно, но шансы переродится слегка увеличит. и тараска если богач, будет сидеть как влитая)))
Спасибо! Отличный гайд. Всё толково и по делу. Хорошо освещены все аспекты. Да и стиль написания очень приятный. Пожалуй, лучший гайд, который я когда-либо вообще читал.
Спасибо за отзыв! Рад, что понравилось
Имхо, все-таки максить луч вначале не стоит в любом случае — слишком уж мало урона, да и хп у нас маловато, что бы эффективно им пользоваться + луч ограничивает мобильность. Зачастую раскидать пару лишних птичек значительно полезнее, чем начинать жечь лучом.
От себя скажу, что согласен, но против врагов-танков, а также если у тебя в тиме есть что-то вроде Клокверка и Туска – луч заезжает на ура.
Автор молодец.
Однозначно лойс :С
Четкий гайд,встал.Лови +.Пиши по больше,братишка.
Мне кажется, что ты забыл про отступление через Супернову) т.к. она прерывает Драйв, то можно спокойно улетать на лоу хп в лес, не тратя при этом драгоценные секунды на отмену Драйва, легче просто в крайней точке включить ульт и соперники, побежавшие следом, врядли успеют снести яйцо.
Гайд хороший. До прочтения гайда юзал «боевого феникса», но только потом узнал что такой скилл билд так называется. Но правда я совсем не качал луч — и без него получалось тащить. К слову, феникс такой герой, который может одновременно убивать и сапортить. В замесах от него куча пользы, если раскастоваться, прожать ульту, выжить и заново раскастоваться.
П.С. Подсел на феникса. Просто не вижу ни одной игры без фена. Заметил, что скилл на других персах стал падать. Во время пика, думаю кого взять и когда время подходит к концу — все равно беру феникса, если нету жестких антипиков(вроде сало, мипо, хускара и прочих). Ввели бы его на цм — была бы сказка.
Введут на ЦМ обязательно, думаю, к следующему ТИ4.
Цм перевернётся просто и будет сидеть феня по кд в бане
Ну значит другую «имбу» пикать будут. На всех противных героев банов не хватит
под феню нужно пик подстраивать. Все его недостатки компенсируются ультой, её нужно применять с максимальной пользой. А значит нужно чтоЪы замесы Ъыли долгими (это случается как правило в пиках Ъез сильных кастеров) и в вашем пике присутствовали герои спосоЪные удержать врагов на месте или отвлекать внимание. С люЪыми ДоТами заедет просто на ура (осоЪенно акса стоит выделить, веномансер, джакиро) и неплох в пике с керри-героем который может затарить радик (спектра, дум, алхим самые идеальные, только последнему ИМХО теперь нужно пикать омника, а в паЪах первой дотки оракула с ультой, чтоЪы не мешали нерфленной колЪой кидаться).
Как видно, Феникса пикают, но далеко не в каждой игре
Плюсанул. Отличный гайд. Разобраны все скиллбилды(сам, правда, по-своему собираюсь и играю)
Добавил бы во враги гулю с врожденным бкб, которое, к тому же, увеличивает в разы СА. На линии очень сложно стоять, да и яйцо разнесет в считанные секунды. Плюсом туда же и алхима бы с увеличенной СА от ульты.
В друзья добавил бы бревно. Великолепно заезжает его ульт, когда начинают фокусить яйцо, да и на лайне с ним всегда стоять просто сказка для агрессивного феникса.
Да и инвокера добавил бы, как в друзья(в прочем, этот универсальный господин всем и друг и враг), так и во враги. Почему в друзья, в принципе, понятно, а во враги, потому как способен, во-первых с легкостью сбить икарус, а во-вторых выжечь ману до того, как феня войдет в супернову.
Спасибо за гайд. Побольше бы таких.
P.s. И да. Никогда не спамлю дайвом на лайне, ибо велика вероятность того, что этот спам закончится очень печально. Его стоит юзать с толком(либо для быстрого ухода из замеса, либо для врыва со 100%-ным оформлением врага)
Те кто говорит что нужно максить луч-дауны. Птички оверповер и в харде триплу разрывают эти птицы в соло. С получением 6ого лвла можно дабл-трипл килл сделать и помочь команде на любом лайне,а икарус дайв мне не разу помогал добить уходящего парня.
В минусах икарус драйва не написано, что тебя могут застанить во время полёта. Закрыл гайд.
Кстати да. В тексте об этом не раз упоминается, но отдельно в минусы действительно стоит занести.
Ну и с технической точки зрения полет считается простым перемещением, то есть и ты можешь бить с руки, использовать способности и предметы, так и по тебе
Всегда качался через птичек ибо не умею нормально юзать луч xD а так птичками легко попадать, почти как сетками на мипо
Верно подмечено, на сетки очень похоже.
Чувак, спасибо тебе за гайд! С выходом феникса сразу прочитал его(ты чуть ли не на следующий день его написал), и теперь имею 75% винрейт на нем)
Круто, что ты запомнил!
Я счастлив, что гайд помог и у тебя все получилось! Спасибо за отзыв :3
Молодец, все хорошо расписал, когда будут работать цвета — гайд явно будет красивее. В общем, держи стрелку, но!
Правильно писать «Каолина», а не «Каолиня»
Спасибо всем за хорошие отзывы!
Да, гайд цветаст
Спасибо, исправим.
В скиллбилде » феникс-поддержки » у тебя ульт на 10 лвл исправь
а в целом хороший гайд! так держать
«Как таковых врагов у Феникса нет» Тоесть сайленсер и некролит вообще никак не мешают жить фениксу?
На счет Сайленсера — забыл дописать его к Траксе и Кробе.
Некролит… неприятная для силача аура и ульта, из-за которой не успеешь включить Супернову. Допишем. Я просто за свои игры ни разу особо с ним проблем не испытывал.
Учитывая что ты сам себе хп расходуешь, некролиту даже рядом стоять не надо, просто накрыть косой, самый неприятный героя для фени.
Я бы добавил бы во врагов Врку так как она ультует в яйцо и за 2-3 секунды тебя нет(
На яйцо не действует магия. А родной скорости атаки у неё не хватит, да и сгорит она быстро
ульт действует на яйцо не раз проверено
Это пофиксят, инфа сотка.
Когда я играл за ВРку, против феникса, ультой нельзя было выбрать яйцо
Гайд отличный, рад что люди приняли феникса, и увидели в нём хорошего героя. Но почему анти-мага нет во врагах? Понимаю, мана нам не особо нужна, но ведь он может её сжечь до нуля и мы не ультанём. А если не попадём птичками (даже если попадём, есть манта стайл) он со своей бешеной скоростью атаки быстро убьёт яйцо. Дикий магический резист поможет не особенно боятся огня от солнца, а от стана улетит на блинке.
Теоретически все верно, добавлю Антимага. Но из практики скажу, что ему некогда фокусить нас в замесе, а птичек хватит, чтобы замедлить его и после включения манты. Он не чувствуется как враг по игре
Ну а скорость атаки и резист магии неприятны, конечно.
Кстати, Тролля бы еще во враги, он всегда рашит БКБ (в 50% сразу же после тапка не грейженного и аквилы) так что спокойно может разнести яйцо.
Тролля обязательно надо, будет добавлен, забыл про него Не пикаю против него Феникса.
в скиллбилде 5 иконок птичек и 3 иконки луча в разделе боевой феникс
А фенис может ультовать в куполе войда?
Если прожмет ульту до купола (а в куполе он ее уже и не прожмет), то будет. И сразу после купола стан выдаст, кстати, если все по таймингу сделать.
Господа опытные, постоянно нехватает маны на фене. Что лучше собрать если саппорт и если керри?
Ты птиц по кд кидаешь что ли?
Арканы для саппорта, ПТ для керри, ясно что.
Тут все пишут мол «птичек пофиксили», «феня уже не то». Да вы что, родные? Новая версия fire spirits просто божественна! Замедление атаки 140; я больше не боюсь залететь в нескольких противников, они просто не смогут убить нас в супернове.
Тут автор раскачивается через первую (как во всех гайдах, да вы что?!). Я лично не вижу в этом никакого практического смысла — замедление не увеличивается, кд не уменьшается. Да и харас сомнительный; урона мало, а откат как у ульта (кстати, кто не обратил внимания, она не требует ничего — ни мн, ни хп).
Поэтому я беру ее на первом на один и дальше луч/птицы.
!!Еще ни в одном гайде не увидел упоминания о том, что на пике луча урон удваивается.
Все так возмущаются, как будто я вместо птиц плюсики качаю. Они качаются параллельно с первым скилом, спамьте на здоровье чем больше нравится, лишь бы хп/маны хватило.
Ульта требует 200 маны, привет.
Урон луча удваивается? Откуда инфа?
Подожди-ка, ложная тревога, луч так не работает. Дезинформатор моуд оф.
Он увеличивается со временем, если луч постоянно жжет и в идеале удваивается
чувак, ты в скилл билде боевого феникса 5 раз качаешь птичек, на 10 лвл луч поставь
Уже знаю, спасибо, пофиксил, на модерации обнова.
Я собираюсь обычно таким образом: кольцо на бронь +2, 2 ветки, танго. На лайне докупаю щиток.
В процессе боевых действий набираю на транквилы, после чего делаю вангард. Далее тараска и если игра не заканчивается, то шиву.
Вопрос про Вангвард. Собираю его часто, особо не задумываясь. Стоит он своих денег на фениксе?
Если рано собрать, то Вангард стоит на любом персонаже своих денег. На Фениксе — да, позже продаешь и покупаешь Тараску. Просто предмет на любителя, многие вообще его считают бесполезным. Добавлю в гайд о нем, сам кажется не собирал ни разу.
обязательно нужно собирать как и иметь щиток в начале. 75% винрейта на фениксе
Полётом не похарасишь, со станом сразу фб делают на птице. на мой взгляд испортили птицу. Всегда было здорово вешать дизарм полётом, лечить птицами себя на линии и союзников, да и ультимейт не разносил деревья в таком большом радиусе(теперь вообще засаду в 2 соснах не устроить).
Но играть всё равно приятно.
Рики должен быть во врагах, вся дистанция нырка-эскейпа с кд 36 перекрывается прыжком-нюком рики с кд 6 секунд, птичек он переждет в инвизе, а с яшей разнесет яйцо. Это если 1х1.
Не согласен, играл против Рики достаточно. Во-первых, ни один Феникс не будет сражаться с Рики 1 на 1 (если только не керри сборка офк).
Фениксу хватит плотности выйти из дымки живым и улететь первым скиллом, дальность которого больше, чем прыжок Рики. Пока будет пережидать птичек и бежать за Фениксом, Феникс уже прилетит к ближайшей вышке/союзникам.
Если у Рики дифуза/башер, то из тучки выйти очень сложно, а иногда невозможно.
Лол =) Грамотный феникс 1 на 1 просто унизит рики =) Впрочем, как и многих райткликеров =)
А как такой вариант через 1 и 3, все почему то забывают про интересный арт rod of atos который дает замедление на дистансе, основная фишка луча в том что чем дольше вы жжете противника, тем выше урон, пока он не достигнет определенного процента ( по ур. 1%, 2% и тд) и фишка в том что можно проюзать род и врубить луч(на ласт лвле), тем самым можно выжеч у любого противника пол хп не в зависимости от его количества, а это очень забавно когда с тобой есть кто то еще на лайне, а еще забавней когда у противника меньше половины хп, и недавно опробывал такую связку, брюмастер+феникс, он помогает замедлять врагов вначале благодаря 1 скиллу.
1-3 прокачка есть в гайде
Ну на линии Род оф Атоса у тебя еще не будет, а в целом неплохая идея, попробую.
На счет Брюмастера — все верно, не только он. Я допишу в гайд еще союзников на линии.
Род обычно собираю сразу после транквил, польза в том что дает нам больше интелекта, то есть нам уже не так важен запас нашей маны
-общий магический урон, который наносит Супернова равен 6000!
Не 6к, а 600
Досадная ошибка, исправим.
хускар еще против очень хорош
ты кастуешь нову, она сносит ему [g — он бьет в миллион раз быстрее, + у него резист к магии
В целом согласен на счет Хускара, тут писали уже, просто его редко пикают сейчас, не наиграл с ним. Добавлю во враги.
кстати по поводу троллинга врагов. можно купить фене дагон. юзать 1 скилл и как ИЛ-2 заходить из за леса
Я хотел дописать про дагон, но Этириал+Дагон можно собрать любому герою доты. По фану заедет на ура, конечно)
С 6 уровня у вас уже должны быть какие-то сапожки и бутылка минимум. Покидаем мид и двигаемся по линиям, доставляя неприятности соперникам, попутно контроллируя руны и добивая крипочков на нужны нам артефакты, затем играем замесы, выигрываем Доту.
Перечитай, исправь
Переписал этот абзац вообще, обнова на модерации, спасибо.
врунишка, ульт наносит 600 урона =) 100 урона в секунду и длится 6 сек
Да понятно, приписал лишний ноль) Обнова гайда на модерации
Огромное спасибо автору гайда. Правда 2 скил по приоритету после дайва для меня — это сан рэй. Но все же спасибо за хорошие сборки героя. Жалко скрины скинуть не могу. Пока ни одного раунда не слил за феню и всегда 1 по килам и ассистанцам.
Я честно рад, что гайд понравился и помог выигрывать игры
Кому птички, кому луч – на любителя, я ж для этого и расписал несколько билдов.
Я тебе скажу даже больше, ульта врки на варды кастуется.
Не баг же.
Странно, что человек, который написал гайд, не знал, что во время перемещения со включенным сан рэйем, феникс летает как бэтрайдер, т.е. может залетать на хг.
З.Ы.В лобби это работало…
Все верно, в игре тоже работает Допишем в гайд об этом.
Врка враг, ее ульта все таки работает на яицо, за 2 секунды снесет)
Врки, которые играли против меня, не ультовали в яйцо видимо
Ну я надеюсь это пофиксят, так как не должно быть НИКАКОЙ возможности использовать скилы на яйцо.
Гайд в целом хорош, но это каким же нужно быть талантливым математиком, чтобы при умножении СТА на ШЕСТЬ получить ШЕСТЬ ТЫСЯЧ?
Спасибо за отзывы.
Про Хускара и 6000 исправлено еще вчера, обнова гайда на модерации.
Найкс с Rage + Армлет и нету яйца.
И всё. Так тогда половина героев доты могут быстро вынести яйцо.
И наконец приятная информация для сомневающихся – на последнем уровне общий магический урон, который наносит Супернова равен 6000 Как это обьясните?
Отвечу за автора: это уже исправлено, а гайд еще в модерации.
Все достаточно хорошо расписано, новичкам будет чему научится!)
гайд норм!
феникс один из любимых героев стал с момента выхода (в первой доте не застал его, поэтому сравнивать не с чем)
обычно в начале макшу птичек и первый скил, луч беру только ближе к лейту.
а по предметам обычно собираю ему транквилы, урну и меку(или пайп)… а в лейте либо тараску либо радик если все хорошо и наша команда доминирует
добавь во врагов рексара — рексар с пт и барабанами в соло мою ульту 2 лвла забил за 2 секунды. так же он дает ск атаки союзникам и любые два героя уже забьют ульту если нет птичек
Оч хороший гайд, самое главное — вариативный, несколько сборок, сбалансированый иб, не скучно читать… плюс однозначно!)
радианс не работает в ульте.Так писали помоему на вики.Проверьте.Я вот подумал что максить первый не селосообразительно.За ап ты получаешь только урон.Кд остается не изменным.И урон вроде не чистый и не убер большой.270 маг дамага.А У птичек повышаеться урон и снижение скорости атаки.И кд падает.Максить следует птичек.Когда ты уже 6-7лвл то урон от икарус дайва нам не нужен.Максим вторым луч.Но герой не очень.(Тиммейты видят что ты дал ульт и враг бьет яйцо но никто не помогает.
Значит не вовремя ультанул.
Максить надо птичек офк, но для новичка — дайв. А потом уже игрок научится попадать птицами и будет максить их.
Мом во враги надо. Таск вот только что собрал мом против меня, прямо так и сказал «Чтобы тебя унижать»
ахах автор гайда точно подметил мол фен для любителей персов потипа земляного, у меня гайд на него лежит))
кстати отмечу вполне резонно не вкликивать сразу же все скиллы а приберечь спиритов и раскидать их во всех у кого есть скорость атаки непосредственно перед ультой. замедление на 140ед атаки тут и никакому туску мом не поможет как кто то выше жаловался.
да и алебарду резон сразу после меки затарить, дизармить кого либо перед ультой, ибо в ней фен уязвимее всего
Хороший, грамотно написанный гайд.
Я указал, что максить птичек предпочтительней, когда ты разобрался с Фениксом. Но для новичков дайвом харасить на линии легче, пока они научатся попадать птицами.
И кстати против опытных игроков на линии птичками не поспамишь – они быстро заканчиваются, если их не выбросить, от них можно увернуться, маны не хватит.
Автор все хорошо расписал,теперь пикаю феникса и изи побеждаю
Ты считаешь минусом озвучку героя?
Т.е если плохая озвучка, то ты должен проигрывать все игры на нем? А если хорошая то наоборот?
Ясно.
Плюс и минусы это не только «выиграть» или «проиграть».
Дота это ИГРА прежде всего, а персонажей выбирают и получают удовольствие не только по имбовости или роли. Я вот не стал бы играть за Феникса, будь он черным жуком, выпускающий черных мух и жгущий лучом зелени.
Отличный гайд! Приятно читать.
Фене-саппорту можно добавить в ИБ Rod of Atos (жгем лучем почти стоячего соперника)
Еще можно добавить в друзья Террорблейда. На линии прекрасно получается комбо: дайв для начального замедления, ТБ подбегает и тоже замедляет, жжем лучом. Profit!
Из-за замедления также стоит добавить Аппарата.
+ Стоит проверить связку (сам еще не пробовал): Феникс + Найкс. Залетаем дайвом, ставим Нову, к ней подбегают враги и получают инфест от найкса. Тоже должен быть профит.
Потестю Род оф Атос, добавлю позже
Добавить можно любого с замедлением и станом, я написал, что дабла с Фениксом – обычно доминирование. Вот Апарата еще можно отдельно выделить, так как маг. резист понижает.
Ну связка так себе, имба-комбо нет
На Фениксе отлично сидит Blade Mail дает необходимую броню и активка неплохая. Влетаешь в замес и кроме урона скиллами наносишь еще и с нее урончику.
У меня вот синдром «феникса»,сыграл 5 игр,по началу мы играем 0:20,в итоге мы делаем камбек аки феникс из пепла
И я основном использую тактику камикадзе,ибо когда ты влетаешь парни в 90% теряться начинают,тут прибегают тиммейты,у врагов пригорает в обоих смыслах
Приятно видеть, как кто-то тащит пабы на Фениксе
Удивлен, что не увидел ФЛа во врагах, с 9+ лвл феникс никогда нормально не проюзает ульт в замесах, когда он бегает с десятком копий, не трудно половину из них послать прервать супернову не выходя из замеса, да и иллюзиям наш луч как-то по барабану.
Иллюзии не дамажат яйцо.
ПЛ распадается без тараски и БКБ от Феникса во всех смыслах.
Урсу почему не добавил во врагов? Ужасно просто контрит эту птичку, под 2 скилом быстро яичко сломает!
а увороты с алебарды работают пока феникс в яйце?
Тактика «Огненная крыса».
Являемся «тузом в рукаве нашей команды».
1) Подобно всяким там Пуджам при замесе прячемся в кустах.
2) И тут два расклада. Если наша команда справляется и враги начинают убегать Dave у них на пути и нова. Не дадим врагам уйти. Ну а если наши убегают то можем их спасти отвлечением внимания на себя.
Господи, тактика 10 из 10
Феникс может и замес начать, и посредине его убивать и добивать уходящих, нет смысла прятаться.
Не навязываю мнения, но я качаюсь через 3й и 1й скил, а духи вначале не актуальны. Они нужны чтобы замедлять атак спид вражеских кери, а не для хараса ( вначале у феня маловато как хр так и маны, а скил жрет немало )
Для этого и покупаются транквилы.
В лейте у кери будет БКБ. Птицы дамажат очень много и замедляют атаку настолько, что враги не смогут убить яйцо и добивать крипов. Луч же дамажит больше в процентах, а значит в лейте он актуальнее (и урон чистый).
Но все на любителя
В друзья можно магнуса добавить)
Ну я написал, что все масс-ультовики)
гайд хорош, но часто возникает вопрос:»что собрать в мид гейме? рашить в тараску/шиву/радик?». Думаю, что было бы не плохо расписать варианты итем билдов получше. В доту я играю после TI1, и умение закупаться ситуативно еще не доконца осовоенно, надеюсь, что для таких как я, это будет по лучше расписано. всего наилучшего
Cпасибо за отзыв, учту при следущем обновлении.
Как задрот феникса с первой доты отвечу на некоторые коментарии:1) Луч бьет больше не на кончике луча, а по центру. То есть даже края луча бьют, но значительно слабее, так что лучше стараться держать цель в середине луча. 2) Как саппортом им очень опасно идти на лайн- нужно вдвойне больше скил чем на миде. Брони нету, урона с руки мало, все скилы вас калечат- по сравнению с тем же дазлом у которого все наоборот поймете о чем я. Но скажем на лайне с тем же вайпером и через луч с птицами= ггвп изи, главное что бы у врага не было времени развернуться и выкинут весь раскаст иначе скорее всего будет размен. Забыли про очень полезные арты- Eul, гост. Тараска конечно же хорошо- но хороший феникс закончивает игру до появления топора в инвентаре- даже не сравнивайте это пернатое убожество с фантом ленсером и прочими в лейте. Единственная ситуация когда он в лейте еще тащит- когда у ваших врагов по 3-15 счет и из артов по пт на 40 минуте. И тут вы дали им нафармить по 2 арту, а сами взяли радик с тараской. Придете и порвете пукан само собой
анекдоты рассказывают в другом месте. Только вчера это не спасло моих вргов, шива + птицы замедляют слишком много а нова+дайв+птицы с радиком (не у меня, у другого тиммейта) вносят достаточно много урона даже в лейте. Им БКБ не очень помогало тк все их тычки хоть и Ъолючие, но переживали (+алеЪарда не раз спасала, она не снимается ничем, а значит Ъудет неплохой удачей провесить до вражеских БКБ)
И НИ В КОЕМ СЛУЧАЕ НЕ ТРАТЬТЕ DRIVE. Любой +1 на миде с дизейблом=мертвая птица если он проебал полет. Нада спамить- птицы и луч вам в помощь а этот скил только что бы добить убегающего и подажженного противника, или спасаться
Где вр во врагах? Фокусфайр прожимается на яйцо; правда не знаю будет ли работать если уйти в нову уже после прожатия вркой ульты, но энивей расстреливает очень быстро. Как и урса и частично боник, кстати, но там хоть частично проблема решается птицошивой.
Семи-кери-хардлайнер-норм тема. На тебя напали-улетел -15%хп. Напали-улетел-15%хп. Фармить видимо фаер спиритами собираешься- еще по 10%хп за включение. А еще с руки сап нарезает по кд. И где высрать столько регена? Хотя это же дота 2- тут никто не знает даже как играть против этого фена. Он настолько же силен, насколько и уязвим. В кривых ручках 2 15 обеспечено. А вообще его либо в мид- фаст лвл и ганги, либо на лайн с героями типо Вайпера. Он стреляет, ты в спину каждые 4 сек даешь духа и лучом в этоже время выжигаешь. Потом полет добиваете первого и цепляете второго. Против такой связки только определенные героя выстоят( как и против кентавр+туск, бейн+потм)
забей, чувак, у мя уже винрейт 72%)
http://dotabuff.com/players/50898393
У феникса есть ещё 2 врага урса и LIFESTEALER я за них феникса за 2 секунды мотал.
Ну гуле бесполезно птички давать, а у урсы неконтрящися ас(а алебардой решается?)
С клокверком можно легко тащить лайн против кого то, у кого нет возможности убежать из ког (потма, квопа, магина, войд, морф) ибо шрапнель+4 птицы+сан рей убьёт кого угодно. Даже рики или бх за время ког в инвизе изжарятся
А кстати то ли баг, то ли еще что-то, но в общем хук пуджа можно эвейдить дайвом
Каким образом? Пудж тебя выцепить из дайва может.
Он, возможно, имел ввиду, что можно икарусом с легкостью уйти как от хука, так и после того, как тебя захукали, так как задержка на дисмэмбер дольше задержки на икарус
Главный противник пуджа в эрли-гейме, сколько не играю на фене ни один пудж ничего не может противопоставить в миду, когда вижу что скилла совсем нет у жирдяя, то залет под вышку птичку кинуть и в ядро спрятаться, если не убежит, сгорает, если замешкался из-за дайва, догоняю после ультимейта.
Лучший мидер против пуджа, качаемся через 2-1 (в приоритете, на 1-м лвле конечно дайв) не даем покоя, даже немного наглеем под вышкой, после 6-го поджигаем, кидаем птицу и ультуем, шансов на выживание очень и очень мало (пудж сверхскоростной даже с ботинком, плюс -25% от дайва)
Не только Пудж. Сф, Шторм до 6, какой-нибудь снайпер, Эмбер (который без щитка качается), Командер, Инвокер без векса (в инвиз не уйдет). Всех их можно убить Фениксом.
Можно не вкачать ультимейт на 6 уровне (!) по желанию, если не планируете уходить с линии, но я все равно не рекомендую этого делать. Супернова будет бесполезна, пока вы будете одни, да, но если вас поймали за хвост и последняя тычка летит в вас уже под вышкой, ультимейт может вас спасти.
Большего бреда не слышал, феникс в харде на 6-7 может в соло сделать трипл килл, т.к. под второй ни 1-на трипла не снесёт яйцо…
Я пофикшу, согласен тут. Когда это писалось я не таким про был еще
Хотя против Тролль Варлорда можно и на 11 вкачать ульту, все равно разобьют.
в свете моих последних игр за феню в други стоит занести зевса и веномансера. Тк противники часто на кропалях уходили. Эти двое поправят дела =) Акса почему нету в другах тоже непонятно — и удерживает и ДоТ есть.
Два дня назад, решил я поиграть за феникса, результат превзошел мои ожидания.
Самый имбалансный герой в прошлом, все еще продолжает карать пабы.
За 19 игр в соло средний урон от 40 до 170 тысяч.
Винрейт 78.95%, кда 7.78
Ну и пруфы:
http://puu.sh/8ezej.png
http://puu.sh/8ez5u.png
Все верно
Пусть на это посмотрят те, кто ноют, что он юзлесс.
Интересный гайд, но не совсем понял как работает первый скилл, он летит по кругу и останавливается когда еще раз нажмешь q, но в момент использования скила феню можно бить и станить? И как воровать аегис через полет? Так же шиву нажимать до начала полета или после? Постоянно в пабе вижу атос на фениксах, учитывая что это герой на силу (только сейчас узнал), то как и сказано в гайде особых плюсов кроме замедления от него нету, но замедление имбовое по сути так его еще используют чтобы расстреливать со второго скила, можно это делать одновременно с лучом или на время луча все способности блокируются? Так же немного удивили арканы на фене сапорте (с этой роли я хочу начать), как я понимаю, он не особо маназависим, но хп улетает от каждого скилла, так лучше бы транквила, но арканы специально для команды в ущерб себе.
Это даже не критика просто вопросы, автор молодец, спасибо
1) Все верно, можно его бить и станить в полете.
2) В полете нажимать на аегис правой кнопкой
3) Шиву чуть раньше начала полета.
4) Можно расстреливать птицами и вообще делать что угодно, когда палишь лучом, ибо луч – это не channeling спелл, а аура. Луч, например, продолжает палить, если тебя закрыли в куполе Войда.
5) Арканы очень ему норм, ибо он МАНОЗАВИСИМ. 310 маны прокаст с птицами, а еще ведь и луч есть.
Фенька скорее шмотозависим, так, например, при покупке шивы проблемы с маной решаются раз и навсегда.
Ну а фармить им очень легко, пушить лайны эффективно, убивает на ура, голда течет ручьем.
Да и после того как у него забрали хил со спиритов, он уже никакой не саппорт.
При покупке трех/четырех слотов птица в соло уничтожает всю команду.
Отличный гайд, я удивлен, давно таких не видел. Простой, информативный, разноплановый и мотивирующий играть за феникса. Ни лишней писанины, ни долдонского единственно правильного билда. Мог бы, +10 поставил)
Единственое пожелание, увеличить шрифт мелких примечаний, я на высоком разрешении чуть экран носом не клюнул))
Спасибо за отзыв, обязательно учту при следующей обнове
Отличный гайд, однозначно лайк и спасибо автору. Попробовал сыграть несколько раз — герой действительно крутой! Единственное пожелание — это убрать расистские замечания насчет руны иллюзий (они вовсе не так бесполезны как многие думают, ими можно блочить спауны, отводить крипов, пуллить, использовать в качестве вардов, а также это одна из самых полезных рун для героя с радиансом и для фени с радиком в том числе).
Спасибо за отзыв, рад что понравилось!
В сравнении с другими рунами иллюзии просто хуже всего, особенно для начала игры. Но так то ты все верно подметил.
Возможно стоит добавить во враги Урсу, ибо птички замедляют АС на 140 а 2-ой скилл урсы добавляет ей +300 АС на 6 ударов, и позволяет довольно быстро убить яйцо.
Гайд шикарный ) Сначало думал про кач через полет+луч….как же я ошибался)
Поиграл немного на феньке — вот до чего допер :
Скиллы — упор на птиц, затем полет с ультой и под конец луч.
Шмотье — сначала транквилы, затем меку. Потом блудстоун, затем радианс. Дальше на тараску и броню, но обычно до «дальше» не доходит )
В пару фене я б еще посоветовал брать жакиро. Комбо «полет-птицы-лед-луч-1 сскил жакиро» в начале многих сливает.
Переосмыслил игру на фене — теперь собираюсь так : транквилы, бладстоун, дальше либо, еесли шел хороший фарм — радианс, либо забиваю на него и покупаю кирасу. Потом по обстоятальствам.
переосмысли еще раз, возьми пт ботл алебарду и вообще попробуй боевого феникса через мид.
бкб надо в любой случае при любой раскачке
Только ради того, чтоьы посмотреть на большую горящую птичку ) Он не нужен, замесы на фене идут в 2 вветки — полет-птички-ульта ( где нам пофиг на дизейблы) и тупо встать за всеми и палить лучем, если ульта в откате. В любом случае бкб не в тему.
тебя могут прервать во время полета каким-нибудь глобал-сайленсом или просто салом и прощай ульта, конечно же не в каждой игре надо бкб, но против массовых сайленсов не отказывайся от него.
Хмм..играю за феникса очень много, считаю, что во врагов можно добавить и лайфстилера (посчитал странным, что его нет). Так со своим 1 скиллом может спокойно избавится от птички и с увеличенной скоростью атаки уничтожить ульту, а с пассивным лайфстилом будет быстро восстанавливать утраченные жизни со скиллов феникса.
Убивал в соло даблу гуля+цмка.
Теоретически он неприятный враг, на практике он не проблема. Конечно, в соло ты его не убешь, но в замесах нормально.
Хочу выразить огромную благодарность, попробовал мидового феникса и по его подобию создал свой собственный внутри-игровой гайд. в начале закупаю танго+фласка+2хклярити+перчатка+2хветка. иду на мид фармлю сапог, затем ботл затем пт или урну и дальше в основном по гайду + куча всевозможных орчид/бкб/рефрешер и т.д.
И да, иллюзии очень полезны, во-первых разведка, во-вторых развод, на любом уровне игры и в любом пабе-капитанах есть люди которые верят что вот эта иллюзия это настоящий герой и спускают что-нибудь в нее, в третьих немного атаки на лайне+харас.
Великолепный гайд. Спасибо.
Может добавить во враги ВД? малядикшн жрет нас если мы юзаем скиллы как бешенный.
После юзания скиллов мы обычно юзаем супернову и гг изи катка.
Я думаю 99% игроков на Фениксе не столкнутся с этой проблемой. Не всегда враг в теории враг на практике
хмм, окей, доля истины есть, тогда как насчет шейкера в друзья, он офигенно заходит, дает стан продолжительный + сам по себе урон хороший, мой Шведский друг много раз спасал меня во многих играх когда ядро уже почти раскололи.
Вот люблю за Феникса играть, недавно решил его конкретно освоить, поэтому за чем-то новым сюда заглянул. По мне так очень важно добавить в друзей Джакиро. Удивился, не увидев его здесь. все наши способности идеально сочетаются, его плевок замедляет атаку врагов, что Фениксу всегда радостно, дыхание+дайв — массовый сатанский слоу и дпс, а прокаст джакиро в который дополняются дпс и замедление от икара и птичек плюс луч, если в приоритете жирного танка срубить иди ульт, если больше надобности застанить всех, срубят всех и вся. Однако это только предложение, ибо опыт игры за феникса у меня крайне мал. А так спасибо за гайд, очень интересно было почитать.
Сам уже не раз писал на него гайды. Избранный герой в принципе, и дифирамбы ему петь можно бесконечно. Один из самых сильных персонажей один на один, мощнейший мидер. Мучилки-птички наносят имбовый дмг, имбовый же урон, и, если руки прямые и противник не семи-про, длится имбовое количество времени.
Прочитал гайд — респект, прочитал комменты — лол просто.
Три замечания: во-первых — это к гайду, — нельзя кидать ульту сразу же. Феникса вообще берут нечасто, но если берут, то ультуют им сразу же. Глупо. Вся суть ульта в том, что ты должен растерять все хп — танкуя и кастуя все скилы — и затем уже ультовать. Ульту, кроме того, тратить на одного героя — растрата. Миниму двое, а лучше и трех-четырех подождать да залететь в кусты или на другой уровень рельефа, то есть так, чтобы никто тебя не атаковал.
Во-вторых, глупо — паб-тру-стори — кидать птиц всех разом, скопом, как делали, когда они хилили. Опять же, только полный нуб так поступит, ибо мучилка не стакается, как, допустим, огонь хускара, она лишь увеличивает длительность.
В-третьих, это уже по комментам: луч актуален только в замесах. Либо же когда необходимо срочно похилить кого-то, хил бешеный. Урона же наносит немного сравнительно, во всяком случае, птички + 1 жестче. Куда жестче. Если накоставал все скилы, тебя никто не бьет, то врубай луч и хиль тимудпс врагов. Однако опыт говорит, что феникса бьют всегда и первым (видимо, те же игроки, что говорят качаться в луч). А сие означает, что ему как раз-таки клево крестить ответку. Хотя это дело вкуса. Заходится ему и армлет, у него суровый прирост силы => суровый прирост атаки + большущая дальность атаки, и все это ведет к тому, что пока враг жарится в огне (а все твои скилы имеют длинный кд), ты должен их бить. Бить, бить, танкануть, и вот только затем, кинув напоследок еще пару птиц, ультануть, когда враги уже деморализованы и дезориентированы, и вовремя не среагируют.
Ну и, напоследок, луч имеет сомнительный потенциал эскейпа. Там как бы движение происходит через любое препятствие, то есть можно залететь на горкуперелететь через край реки. Во всяком случае, я пару раз таким образом уходил от ганга. Но, ясен пень, 1 скилл куда функциональнее в этом плане.
Ну и за дуэль + Sun Ray лойс)
Ах да, еще забыл вот что: сколько раз я не играл фениксом — а я за фена играл в первой доте ровно с того момента, как его ввели в семидесятой карте (и где его, кстати говоря, без конца фиксили, и где в 74 он был совсем другим, с совершенно иными 1 и 2 скилами), за все это время, за эти года два-три у меня ни разу не возникали такие моменты, которые требовали бы мп, которого у меня нет. НИ РАЗУ.
Просто многие считают, что нужно залететь 1 в замес и кинуть ульт. На самом деле 1 скил спецом не требует мп, чтобы ты в ы л е т е л из замеса, попутно нанеся дмг, и ультанул так, чтобы: 1) был аое дмг и 2) тебя не достали враги, которые легко убьют. А их множество (бала, тролль, виндра, никс, боня, воид, антимаг, гонд и т.д.), и в любом случае тебя убьют двое или трое всего за пару секунд.
Я лично играя за феникса в начала сразу закупаю ботинки и ринг оф протекшн для фаст транквилов. Затем взяв 6 лвл активно участвую в замесах постепенно накапливая на тараску, так как она нам дает все что нужно по идее. Затем смотрю по ситуации, собираю блейдмейл — если меня фокусят частенько, либо собираю вторую тараску. Обычно через пяток минут после второй тараски игра уже заканчивается, обычно победой. Две тараски позволят нам танковать таверы без проблем пока тиммейты их разносят плевав на систему бекдора даже.две тараски — и нас сложно убить. купол войда? всегда переживал, а тиммейтам польза, так как купол ушел в феню. Прокаст лины-лиона? да фене насрать, ультуем в случае надобности. А если к двум тараскам успеть БМ собрать, то всякие мягкие прокастеры убьются о вас же. Сыграл феней 65 матчей с винрейтом 63%.
автор, у тебя написано, что аганим не прерывается кастующиеся заклинания, хотя на дота 2 вики обратная информация. Interrupts channeling spells of the ally, but does not end spell effects with duration after cast. Исправь
Походу пофиксили. Мда уж.
Героем очень легко вытаскивать замесы чисто скиллами до лейта. Говорю как отыгравший 50 игр с 80% винрейтом героя.
Заметил какую-то логическую неточность: Мид-гейм новичка феникса стоит 6200 (и кстати не новичка, а боевого феникса) а мид-гейм про-саппорт всего 3300. Поменять бы их местами либо переименовать новичка в боевого феникса. Ведь из-за такой сборки я начал тащить (внизу страницы есть пару игр с мекой где мы не тащили ну никак потому что я не в миду был) http://www.dotabuff.com/players/99583372/matches?date=&faction=&hero=phoenix&lobby_type=&game_mode=®ion=&duration=
Про-сапорту Фене кроме меки ничего не надо, а новичкам чтобы не умирать нужны шмотки, статы и т.д.
Ну я при следующей обнове пересмотрю это.
Просто измени новичок на мидер-феня или кэрри-феня, я закупаюсь именно таким образом (кроме барабанов, хотя можно попробовать как-нить) и отлично тащу, а это уже никак не новичковый закуп когда вражеская тима заовнена
Слушайте,а с аганимом,делая супернову на обоих, стакаются ульты,или же дамаг нанесеться врагу как от 1 ульты,но просто его стан и дамаг будут иметь больший радиус(в зависимости от расположения яиц)?
Автор, как-бы если ты прячешь в ульту допустим цмку то она продолжает ультовать разве нет?
в други фуру добавь,хорошая связка-феня ульт а фура закрывает в деревья и яйцо пропадает из вида
Феникс США, ИНК компания является успешным коммерческим предприятием, возникшим в результате краха другого в результате неплатежеспособности. Их официальный webсайт Phoenix.com.
Каталог руководств пользователя и инструкций для продуктов Phoenix можно найти ниже. Продукция Phoenix запатентована и зарегистрирована под торговой маркой. Феникс США, ИНК.
Контактная информация:
Адрес: Клиентский и технологический центр, Анн-Арбор 500 Avis Drive Анн-Арбор, Мичиган 48108
Местный телефон: (734) 205-5000
Эл. почта: us-technicalservice@phoenixcontact.com
Найти
Инструкции по установке, эксплуатации и обслуживанию портативного обогревателя Phoenix FireBIRD Compact 20 можно найти в этом руководстве пользователя. Этот нагреватель, внесенный в список ETL, имеет выход чистого тепла до 20,000 20 БТЕ, имеет несколько розеток питания и выносной термостат. Это подробное руководство обеспечит безопасную и эффективную работу вашего Firebird Compact XNUMX.
Узнайте все, что вам нужно знать о Phoenix PN 4035000 AirMAX Low Profile Air Mover с этим подробным руководством пользователя. Узнайте о его функциях, спецификациях и важных инструкциях по безопасности для оптимального использования. Идеально подходит для тех, кто ищет высокопроизводительный, удобный и портативный пневматический двигатель.
Узнайте, как эксплуатировать и обслуживать осушитель воздуха Phoenix 250 MAX LGR, из этого подробного руководства пользователя. Это мощный и эффективный осушитель на 145 частей в день (@AHAM) с запатентованной технологией фиксированного байпаса и моторизованным рабочим колесом для более быстрой сушки. Получите максимальную отдачу от вашего осушителя 4030010 250 MAX LGR с помощью этих инструкций по установке и эксплуатации.
Узнайте о системе воздухоочистителя Phoenix 4031350 Guardian R HEPA из руководства пользователя. Этот компактный и портативный скруббер оснащен 2-секционнымtage Конструкция фильтра с задокументированной эффективностью фильтрации HEPA, регулируемым потоком воздуха и максимальным объемом 500 CFM. Обеспечьте безопасность, следуя его инструкциям.
Узнайте, как максимально использовать преимущества осушителя воздуха Phoenix DryMAX BLE LGR с помощью этого подробного руководства пользователя. Откройте для себя передовую графическую панель управления, функциональность Bluetooth и высокопроизводительные функции. Ознакомьтесь с инструкциями по правильной эксплуатации и техническому обслуживанию.
Узнайте, как эксплуатировать и обслуживать портативный адсорбционный осушитель воздуха Phoenix D385 с помощью этих инструкций по эксплуатации. Этот мощный осушитель может удалять до 130 литров воды в день и имеет отдельные потоки технологического и регенерационного воздуха. Идеально подходящий для индустрии реставрации, D385 легко транспортируется и помещается в подполье. В этом подробном руководстве вы найдете все необходимые характеристики и советы по использованию.
Узнайте о портативном электрическом обогревателе Firebird Compact 20 (номер по каталогу 4033450) из этого руководства пользователя. Этот нагреватель производит до 20,000 XNUMX БТЕ чистого, безопасного тепла и имеет дистанционный термостат для контроля температуры. Ознакомьтесь с техническими характеристиками, электрическими требованиями и т. д.
Узнайте все об осушителе Phoenix R250 LGR с помощью этого руководства пользователя. Откройте для себя его впечатляющие характеристики, в том числе производительность до 135 пинт воды, удаляемой в день, при вытягивании всего 8.3 ampс электричества. Благодаря прочной и долговечной конструкции, запатентованной технологии ByPassTM и гофрированному фильтрующему материалу это один из самых компактных и легких LGR категории XL на рынке.
Откройте для себя Phoenix FOCUS II Axial Air Mover, высокопроизводительный и недорогойfile вентилятор для сушки и вентиляции. Благодаря оптимизированному воздушному потоку и компактному дизайну это портативное устройство обеспечивает удобство и безопасность. Прочтите руководство пользователя для ознакомления с техническими характеристиками, инструкциями по использованию и важной информацией по технике безопасности. Доступен в красном и синем цветах.
Получите всю информацию, необходимую для работы с переносным обогревателем Firebird Compact 4033450 20, с помощью этого руководства пользователя. Узнайте о его технических характеристиках, требованиях к питанию, работе и многом другом для безопасного и эффективного обогрева.
МАНУАЛ
ДЛЯ НОВЫХ ФЕНИКСОВ
КОПИРОВАНИЕ И ВЫКЛАДКА НА ДРУГИХ САЙТАХ ЗАПРЕЩЕНА!!!!!!
НАЧАЛО РАБОТЫ
КАЧАЕМ
Phoenix Service Software 2011.46.007.47652 Cracked
Phoenix Service Software 2012.04.003.47798 Cracked
ПРОШИВКУ КАЧАЕМ ТУТ
ПОСЛЕ РАСПАКОВКИ ПРОШИВКА БУДЕТ ЛЕЖАТЬ ПО АДРЕСУ
C:Program FilesNokiaPhoenixProductsRM- — ЭТО ВАЖНО ИНАЧЕ ФЕНИКС ЕЁ НЕ УВИДИТ
ПРОШИВКУ КАЧАЕМ С RM который написан под батарейкой и версию не ниже той что стоит в телефоне.это важно прошивка с другим RM и версией ниже устоновлен ной может убить телефон.Теперь когда у нас всё есть запускаем феникс.Все програмы NOKIA должны быть закрыты антивирус выключен.Ненужные програмы лучше
тоже закрыть
ЕСЛИ ВОВРЕМЯ ПРОШИВКИ ПОЯВИТСЯ ТАКОЕ ОКНО, НЕВКОЕМ СЛУЧАЕ НЕНАЖИМАЙТЕ НА ОК !!!!!!!
ЭТО ВЫЗОВЕТ ЗАКРЫТИЕ ФЕНИКСА И СМЕРТЬ ТЕЛЕФОНА
ДОЖДИТЕСЬ ОКОНЧАНИЯ ПРОШИВКИ !!!!!!!
ПРОШИВКА В НОРМАЛЬНОМ РЕЖИМЕ
Запускаем феникс и нажимаем SETING.когда телефон опредилится закрываем окно настройки.Нажимаем CONNECTIONS и выбираем соединение.В моём случае это RM-431 USB1.После выбора нажимаем FILE затем OPEN PRODUCT
ВАЖНО!!!! если по какой-то причине выходит ошибка при нажатии SETING сразу переходим к окну CONNECTIONS и там выбераем USB соединение
В открывшемся окне выбираем свой телефони свой RM. Нажимаем ОК. И переходим к прошивке.Нажимаем FLASHING.и FIRMWARE UPDATE.В открывшемся окне нажимаем на квадратик и попадаем в окно выбора продукт кода.Выбираем нужный и жмём ОК. Теперь все готово для прошивки.Если надо просто обновить прошивку с другим продукт кодом или на новую версию нажимаем на RESTORE USER PRODUCT при этом вся информация в телефоне сохранится.Если необходимо сделать формат то нажимаем REFURBISH все данные пропадут поэтому надо сделать бэкап с помощью PC SUITE
ТИПИЧНАЯ ОШИБКА
Если при выборе продукт кода Вы увидете такую ошибку значит нет прошивки по адресу C:Program FilesNokiaPhoenixProductsRM—.Откройте этот адрес и проверте наличие прошивки.Название папки должно быть таким RM-431 для 5630 для Вашего номер RM будет другим но главное RM-431 а не RM431 или RM 431 (-) ЭТОТ ПРОЧЕРК ВАЖЕН!!!!
Перед тем как начать прошивку выключаем телефон открываем диспетчер устройств и коротко на 1-2 секунды нажимаем кнопку ВКЛ.При этом в диспетчере устройств на 3-4 секунды появятся 2 устройства PARENTE и GENERIC
Eсли с первого раза драйвера не установятся или установятся с ошибкой как на рисунке нажимаем кнопку вкл еще пару раз пока устройства не будут установлены без ошибки.Когда устройства определят ся можно включить телефон.Еще раз проверяем всё ли правельно сделано верно ли выбрана прошивка
ичто батарейка заряжена полностью.Ложим телефон на стол и нажимаем REFURBISH. После этого с теле фоном нечего не делаем и не трогаем так как потеря контакта компьютера с телефоном во время прошивки приведёт к смерти телефона.Старайтесь во время прошивки не пользоваться компьютером.После про шивки телефон включится сам.Если после прошивки телефон не включится и на экране будет написано LOСAL MODE просто передёргиваем батарейку.Когда телефон запустится полностью нажимаем *#0000#
ипроверяем версию прошивки.
ПРОШИВКА В DEAD MODE
Прошивка в DEAD MODE применяется для востановления телефона который
не включается по разным причинам:сбой ПО, запрос кода который Вы забыли, неудач ная прошивка модфайлом. И в некоторых других случаях.
Если телефон заблокирован (залочен)под оператора прошивка снять лок не поможет
Запускаем феникс открываем диспетчер устройств и коротко на 1-2 секунды нажимаем кнопку ВКЛ.При этом в диспетчере устройств на
3-4 секунды появятся 2 устройства PARENTE и GENERIC Если они появляются на время 2-3 секунды то можно переходить к процесу прошивки.Если эти устройства продолжают оставаться в диспетчере секунд 20-30 то телефон востановить дома уже нельзя и надо нести его в ремонт (неотносится к телефонам с зарядкой по USB ) Качаем прошивку для Вашего телефона, под батарейкой смотрим RM с этим номером
и надо скачивать.Если версия прошивки Вам неизвестна скачивем самую последнею. Прошивка версии ниже чем установлена в телефоне выведет его из строя.В открыв шемся окне феникса выбираем режимNO CONNECTION. Нажимаем FILE потом OPEN PRODUCT в открывшемся окне выбираем свой RM телефона и жмём OK. Нажимаем FLASHING потом FIRMWARE UPDATE.
ВАЖНО!!!! ,N70,N72,N73,N80,N82,N91-8G. N93.N95,N95 8GB,E65.E90.
в DEAD MODE не шьются их можно шить только в нормально режиме, тоесть когда телефон полностью работает.
В открывшемся окне нажимаем квадратик и переходим в окно выбора продукт кода выбераем нужный нам продукт код и нажимаем ОК.Ставим галочку DEAD PHONE USB FLASHING. Теперь всё готово набираемся храбрости и жмем REFURBISH После того как Феникс напишит Press phone’s power button! — коротко на 1-2 секунды нажи маем кнопку ВКЛ. Если всё нормально начнётся прошивка нечего не трогаем и ждём окончания прошивки и включения телефона.В телефонах с зарядкой по USB передёрги ваем батарейку отключаем кабель. Когда появится надпись Press phone’s power button вставляем кабель нечего не нажимая.
В фениксех 2011 после нажатия REFURBISH и появления этого окошка нажимаем корот ко ВКЛ (в телефонах с зарядкой по USB подключаем кабель) и если феникс в логе начнет что то писать,нажимаем ОК
От переводчика: «Elixir и Phoenix — прекрасный пример того, куда движется современная веб-разработка. Уже сейчас эти инструменты предоставляют качественный доступ к технологиям реального времени для веб-приложений. Сайты с повышенной интерактивностью, многопользовательские браузерные игры, микросервисы — те направления, в которых данные технологии сослужат хорошую службу. Далее представлен перевод серии из 11 статей, подробно описывающих аспекты разработки на фреймворке Феникс казалось бы такой тривиальной вещи, как блоговый движок. Но не спешите кукситься, будет действительно интересно, особенно если статьи побудят вас обратить внимание на Эликсир либо стать его последователями».
На данный момент наше приложение основано на:
- Elixir: v1.3.1
- Phoenix: v1.2.0
- Ecto: v2.0.2
- Comeonin: v2.5.2
Установка Phoenix
Лучшая инструкция по установке Phoenix находится на его официальном сайте.
Шаг 1. Добавление постов
Начнём с запуска mix-задачи для создания нового проекта под названием «pxblog». Для этого выполним команду `mix phoenix.new [project] [command]`. Отвечаем утвердительно на все вопросы, так как нам подойдут настройки по умолчанию.
mix phoenix.new pxblog
Вывод:
* creating pxblog/config/config.exs
...
Fetch and install dependencies? [Yn] y
* running mix deps.get
* running npm install && node node_modules/brunch/bin/brunch build
We are all set! Run your Phoenix application:
$ cd pxblog
$ mix phoenix.server
You can also run your app inside IEx (Interactive Elixir) as:
$ iex -S mix phoenix.server
Before moving on, configure your database in config/dev.exs and run:
$ mix ecto.create
Мы должны увидеть кучу информации о том, что создание нашего проекта было завершено, а также команды для подготовительной работы. Выполняем их поочерёдно.
Если у вас не создана база данных Postgres или приложение не настроено на работу с ней, команда `mix ecto.create` выкинет ошибку. Для её исправления откройте файл config/dev.exs и просто измените имя пользователя и пароль для роли, которая имеет права на создание базы данных:
# Configure your database
config :pxblog, Pxblog.Repo,
adapter: Ecto.Adapters.Postgres,
username: "postgres",
password: "postgres",
database: "pxblog_dev",
hostname: "localhost",
pool_size: 10
Когда всё заработает, давайте запустим сервер и убедимся, что всё хорошо.
$ iex -S mix phoenix.server
Для этого перейдём по адресу http://localhost:4000/ и увидим страницу Welcome to Phoenix!. Хорошая основа готова. Давайте добавим к ней главный скаффолд для работы с постами, так как всё же у нас блоговый движок.
Воспользуемся встроенным в Phoenix генератором для создания Ecto-модели, миграции и интерфейса обработки CRUD-операций модуля Post. Так как на данный момент это очень и очень простой движок, то ограничимся заголовком и сообщением. Заголовок будет строкой, а сообщение — текстом. Команда, которая создаст это всё за нас довольно простая:
$ mix phoenix.gen.html Post posts title:string body:text
Вывод:
* creating web/controllers/post_controller.ex
...
Add the resource to your browser scope in web/router.ex:
resources "/posts", PostController
Remember to update your repository by running migrations:
$ mix ecto.migrate
Получаем ошибку! Чтобы исправить её, а заодно сделать интерфейс постов доступным из браузера, давайте откроем файл web/router.ex, и добавим в root-скоуп следующую строчку:
resources "/posts", PostController
Теперь можем ещё раз выполнить команду и убедиться, что наша миграция прошла успешно.
$ mix ecto.migrate
Вывод:
Compiling 9 files (.ex)
Generated pxblog app
15:52:20.004 [info] == Running Pxblog.Repo.Migrations.CreatePost.change/0 forward
15:52:20.004 [info] create table posts
15:52:20.019 [info] == Migrated in 0.0s
И, наконец, перезапускаем наш сервер заходим на страницу http://localhost:4000/posts, где мы должны увидеть заголовок Listing posts, а также список наших постов.
Немного повозившись мы получили возможность добавлять новые посты, редактировать их и удалять. Довольно круто для такой маленькой работы!
Шаг 1Б. Написание тестов для постов
Одной из прелестей работы со скаффолдами является то, что с самого начала мы получаем набор базовых тестов. Нам даже не нужно особо их изменять до тех пор, пока мы не начнём вносить серьёзные изменения в код самого приложения. Сейчас давайте разберём какие тесты были созданы, чтобы лучше понять как писать собственные.
Во-первых, откроем файл test/models/post_test.exs и взглянем на содержимое:
defmodule Pxblog.PostTest do
use Pxblog.ModelCase
alias Pxblog.Post
@valid_attrs %{body: "some content", title: "some content"}
@invalid_attrs %{}
test "changeset with valid attributes" do
changeset = Post.changeset(%Post{}, @valid_attrs)
assert changeset.valid?
end
test "changeset with invalid attributes" do
changeset = Post.changeset(%Post{}, @invalid_attrs)
refute changeset.valid?
end
end
Давайте разбирать этот код по частям, чтобы понять, что же тут происходит.
defmodule Pxblog.PostTest do
Очевидно, что нам нужно определить тестовый модуль в пространстве имён нашего приложения.
use Pxblog.ModelCase
Далее, мы говорим этому модулю использовать функции и DSL, представленные в наборе макросов ModelCase.
alias Pxblog.Post
Теперь убеждаемся, что тест может обращаться к модели напрямую.
@valid_attrs %{body: “some content”, title: “some content”}
Настраиваем основные действительные атрибуты, которые позволят успешно создать ревизию (changeset). Это просто переменная уровня модуля, которую мы можем дёргать каждый раз, когда хотим создать валидную модель.
@invalid_attrs %{}
Как и выше, но создаём набор недействительных атрибутов.
test "changeset with valid attributes" do changeset = Post.changeset(%Post{}, @valid_attrs) assert changeset.valid? end
Теперь, мы непосредственно создаём наш тест функцией test, дав ему строковое имя. Внутри тела нашей функции сначала мы создаём из модели Post ревизию (передавая пустую структуру и список действительных параметров). Затем с помощью функции assert проверяем валидность ревизии. Это как раз то, для чего нам нужна переменная @valid_attrs.
test "changeset with invalid attributes" do changeset = Post.changeset(%Post{}, @invalid_attrs) refute changeset.valid? end
Наконец, мы проверяем создание ревизии с недействительными параметрами, и вместо «утверждения», что ревизия валидная, выполняем обратную операцию refute.
Это очень хороший пример того, как написать тест модели. Теперь давайте посмотрим на тест контроллера. Взглянув на него мы должны увидеть примерно следующее:
defmodule Pxblog.PostControllerTest do
use Pxblog.ConnCase
alias Pxblog.Post
@valid_attrs %{body: "some content", title: "some content"}
@invalid_attrs %{}
...
end
Здесь используется Pxblog.ConnCase для получения специального DSL уровня контроллера. Остальные строки должны быть уже знакомы.
Посмотрим на первый тест:
test "lists all entries on index", %{conn: conn} do
conn = get conn, post_path(conn, :index)
assert html_response(conn, 200) =~ "Listing posts"
end
Здесь мы захватываем переменную conn, которая должна быть отправлена через блок настройки в ConnCase. Я объясню это позже. Следущий шаг — воспользоваться одноименной подходящему HTTP-методу функцией, чтобы совершить запрос по нужному пути (GET-запрос к действию :index в нашем случае). Затем мы проверяем, что ответ данного действия возвращает HTML со статусом 200 («OK») и содержит фразу Listing posts.
test "renders form for new resources", %{conn: conn} do
conn = get conn, post_path(conn, :new)
assert html_response(conn, 200) =~ "New post"
end
Следующий тест по сути такой же, только уже проверяется действие new. Всё просто.
test "creates resource and redirects when data is valid", %{conn: conn} do
conn = post conn, post_path(conn, :create), post: @valid_attrs
assert redirected_to(conn) == post_path(conn, :index)
assert Repo.get_by(Post, @valid_attrs)
end
А здесь мы делаем что-то новенькое. Во-первых, отправляем POST-запрос со списком действительных параметров по адресу post_path. Мы ожидаем получить перенаправление на список постов (действие :index). Функция redirected_to принимает в качестве аргумента объект соединения, так как нам нужно знать, куда произошло перенаправление.
Наконец, мы утверждаем, что объект, представленный этими действительными параметрами был успешно добавлен в базу данных. Эта проверка осуществляется через запрос к репозиторию Ecto Repo на поиск модели Post, соответствующей нашим параметрам @valid_attrs.
test "does not create resource and renders errors when data is invalid", %{conn: conn} do
conn = post conn, post_path(conn, :create), post: @invalid_attrs
assert html_response(conn, 200) =~ "New post"
end
Теперь снова попробуем создать пост, но уже с недействительным списком параметров @invalid_attrs, и проверим, что снова отобразится форма создания поста.
test "shows chosen resource", %{conn: conn} do
post = Repo.insert! %Post{}
conn = get conn, post_path(conn, :show, post)
assert html_response(conn, 200) =~ "Show post"
end
Чтобы протестировать действие show, нам нужно создать модель Post, с которой и будем работать. Затем вызовем функцию get с хелпером post_path, и убедимся, что возвращается соответствующий ресурс.
Также мы можем попытаться запросить путь к ресурсу, которого не существует, следующим образом:
test "renders page not found when id is nonexistent", %{conn: conn} do
assert_error_sent 404, fn ->
get conn, post_path(conn, :show, -1)
end
end
Здесь используется другой шаблон записи теста, который на самом деле довольно прост для понимания. Мы описываем ожидание того, что запрос несуществующего ресурса приведёт к ошибке 404. Туда же передаём анонимную функцию, содержащую код, который при выполнении должен вернуть эту самую ошибку. Всё просто!
Остальные тесты лишь повторяют вышеперечисленное для оставшихся путей. А вот на удалении остановимся подробнее:
test "deletes chosen resource", %{conn: conn} do
post = Repo.insert! %Post{}
conn = delete conn, post_path(conn, :delete, post)
assert redirected_to(conn) == post_path(conn, :index)
refute Repo.get(Post, post.id)
end
В целом, всё похоже, за исключением использования HTTP-метода delete. Мы утверждаем, что должны быть перенаправлены со страницы удаления обратно к списку постов. Ещё мы используем здесь новую фишку — «отвергаем» существование объекта Post с помощью функции refute.
Шаг 2. Добавляем пользователей
Для создания модели User, мы пройдём практически те же шаги, что и при создании модели постов, за исключением добавления других столбцов. Для начала выполним:
$ mix phoenix.gen.html User users username:string email:string password_digest:string
Вывод:
* creating web/controllers/user_controller.ex
...
Add the resource to your browser scope in web/router.ex:
resources "/users", UserController
Remember to update your repository by running migrations:
$ mix ecto.migrate
Далее откроем файл web/router.ex и добавим следующую строчку в тот же скоуп, что и ранее:
resources "/users", UserController
Синтаксис здесь определяет стандартный ресурсовый путь, где первым аргументом идёт URL, а вторым — имя класса контроллера. Затем выполним:
$ mix ecto.migrate
Вывод:
Compiling 11 files (.ex)
Generated pxblog app
16:02:03.987 [info] == Running Pxblog.Repo.Migrations.CreateUser.change/0 forward
16:02:03.987 [info] create table users
16:02:03.996 [info] == Migrated in 0.0s
Наконец, перезагружаем сервер и проверяем http://localhost:4000/users. Теперь, помимо постов, мы имеем возможность добавлять и пользователей!
К сожалению, пока это не очень полезный блог. В конце концов, хоть мы и можем создавать пользователей (к сожалению, сейчас это сможет сделать любой), мы не можем даже войти. Кроме того, дайджест пароля не использует никаких алгоритмов шифрования. Мы тупо храним тот текст, что ввёл пользователь! Совсем не круто!
Давайте приведём этот экран в вид более похожий на регистрацию.
Наши тесты пользователей выглядят точно так же, как и то, что было автоматически сгенерировано для наших постов, так что пока мы оставим их в покое, до тех пор, пока не начнём модифицировать логику (а этим мы займёмся прямо сейчас!).
Шаг 3. Сохранение хеша пароля, вместо самого пароля
Открыв адрес /users/new, мы видим три поля: Username, Email и PasswordDigest. Но ведь когда вы регистрируетесь на других сайтах, вас просят ввести не дайджест пароля, а сам пароль вместе с его подтверждением! Как мы можем это исправить?
В файле web/templates/user/form.html.eex удалите следующие строки:
<div class="form-group">
<%= label f, :password_digest, class: "control-label" %>
<%= text_input f, :password_digest, class: "form-control" %>
<%= error_tag f, :password_digest %>
</div>
И добавьте на их место:
<div class="form-group">
<%= label f, :password, "Password", class: "control-label" %>
<%= password_input f, :password, class: "form-control" %>
<%= error_tag f, :password %>
</div>
<div class="form-group">
<%= label f, :password_confirmation, "Password Confirmation", class: "control-label" %>
<%= password_input f, :password_confirmation, class: "form-control" %>
<%= error_tag f, :password_confirmation %>
</div>
После обновления страницы (должно происходить автоматически) введите данные пользователя и нажмите кнопку Submit.
Упс, ошибка:
Oops, something went wrong! Please check the errors below.
Это происходит потому, что мы используем поля пароль и подтверждение пароля, о которых приложению ничего не известно. Давайте писать код, решающий эту проблему.
Начнём с изменения схемы. В файле web/models/user.ex добавим пару строк:
schema "users" do
field :username, :string
field :email, :string
field :password_digest, :string
timestamps
# Virtual Fields
field :password, :string, virtual: true
field :password_confirmation, :string, virtual: true
end
Обратите внимание на добавление двух полей :password и :password_confirmation. Мы объявили их в качестве виртуальных полей, так как на самом деле их не существует в нашей базе данных, но они должны существовать как свойства в структуре User. Это также позволяет применять преобразования в нашей функции changeset.
Затем мы добавим :password и :password_confirmation в список обязательных полей:
def changeset(struct, params \ %{}) do
struct
|> cast(params, [:username, :email, :password, :password_confirmation])
|> validate_required([:username, :email, :password, :password_confirmation])
end
Если вы сейчас попробуете запустить тесты из файла test/models/user_test.exs, то тест “changeset with valid attributes” упадёт. Это происходит потому, что мы добавили :password и :password_confirmation к обязательным параметрам, но не обновили @valid_attrs. Давайте изменим эту строчку:
@valid_attrs %{email: "[email protected]", password: "test1234", password_confirmation: "test1234", username: "testuser"}
Наши тесты моделей должны снова проходить! Теперь нужно починить тесты контроллеров. Внесём некоторые изменения в файл test/controllers/user_controller_test.exs. Вначале выделим валидные атрибуты для создания объекта в отдельную переменную:
@valid_create_attrs %{email: "[email protected]", password: "test1234", password_confirmation: "test1234", username: "testuser"}
@valid_attrs %{email: "[email protected]", username: "testuser"}
Затем изменим наш тест на создание пользователя:
test "creates resource and redirects when data is valid", %{conn: conn} do
conn = post conn, user_path(conn, :create), user: @valid_create_attrs
assert redirected_to(conn) == user_path(conn, :index)
assert Repo.get_by(User, @valid_attrs)
end
И тест на обновление пользователя:
test "updates chosen resource and redirects when data is valid", %{conn: conn} do
user = Repo.insert! %User{}
conn = put conn, user_path(conn, :update, user), user: @valid_create_attrs
assert redirected_to(conn) == user_path(conn, :show, user)
assert Repo.get_by(User, @valid_attrs)
end
После того, как наши тесты снова стали зелёными, нам нужно добавить в changeset функцию, преобразующую пароль в дайджест:
def changeset(struct, params \ %{}) do
struct
|> cast(params, [:username, :email, :password, :password_confirmation])
|> validate_required([:username, :email, :password, :password_confirmation])
|> hash_password
end
defp hash_password(changeset) do
changeset
|> put_change(:password_digest, "ABCDE")
end
Пока мы просто стабим поведение нашей хеширующей функции. Первым делом давайте убедимся, что изменение ревизии происходит корректно. Вернёмся в браузер на страницу http://localhost:4000/users, кликнем на ссылку New user и создадим нового пользователя с любыми данными. Теперь в списке пользователей нас ожидает новая строка, дайджест пароля в которой равен ABCDE.
Снова запустим тесты этого файла. Они проходят, но не хватает теста на проверку работы функции hash_password. Давайте добавлять:
test "password_digest value gets set to a hash" do
changeset = User.changeset(%User{}, @valid_attrs)
assert get_change(changeset, :password_digest) == "ABCDE"
end
Это большой шаг вперёд для приложения, но не такой большой для безопасности! Нужно скорее исправить хеширование пароля на настоящее с использованием BCrypt, любезно предоставленной библиотекой Comeonin.
Для этого откройте файл mix.exs и добавьте :comeonin в список applications:
def application do
[mod: {Pxblog, []},
applications: [:phoenix, :phoenix_pubsub, :phoenix_html, :cowboy, :logger, :gettext, :phoenix_ecto, :postgrex, :comeonin]]
end
Также нам нужно изменить наши зависимости. Обратите внимание на {:comeonin, “~> 2.3”}:
defp deps do
[{:phoenix, "~> 1.2.0"},
{:phoenix_pubsub, "~> 1.0"},
{:phoenix_ecto, "~> 3.0"},
{:postgrex, ">= 0.0.0"},
{:phoenix_html, "~> 2.6"},
{:phoenix_live_reload, "~> 1.0", only: :dev},
{:gettext, "~> 0.11"},
{:cowboy, "~> 1.0"},
{:comeonin, "~> 2.3"}]
end
Теперь отключим запущенный сервер и выполним команду `mix deps.get`. Если все пройдет хорошо (а оно должно!), то командой `iex -S mix phoenix.server` вы снова сможете запустить сервер.
Наш старый метод hash_password неплох, но вообще-то нам нужно, чтобы пароль хешировался на самом деле. Так как мы добавили библиотеку Comeonin, которая предоставляет нам прекрасный модуль Bcrypt с методом hashpwsalt, который мы импортируем в нашу модель User. В файле web/models/user.ex добавьте приведённую ниже строчку сразу следом за use Pxblog.Web, :model:
import Comeonin.Bcrypt, only: [hashpwsalt: 1]
Что мы сейчас сделали? Мы вытянули модуль Bcrypt из пространства имён Comeonin и импортировали метод hashpwsalt с арностью 1. А следующим кодом мы заставим функцию hash_password работать:
defp hash_password(changeset) do
if password = get_change(changeset, :password) do
changeset
|> put_change(:password_digest, hashpwsalt(password))
else
changeset
end
end
Предлагаю попробовать создать пользователя ещё раз! На этот раз, после регистрации мы должны увидеть шифрованный дайджест в поле password_digest!
Теперь давайте немного доработаем функцию hash_password. Во-первых, чтобы шифрование пароля не тормозило тестирование, необходимо внести изменения в настройки тестового окружения. Для этого откройте файл config/test.exs и добавьте следующую строчку в самый низ:
config :comeonin, bcrypt_log_rounds: 4
Это скажет библиотеке Comeonin не слишком сильно шифровать пароль во время выполнения тестов, поскольку в тестах нам важнее скорость, чем безопасность! А в продакшене (файл config/prod.exs) нам наоборот нужно усилить защиту:
config :comeonin, bcrypt_log_rounds: 14
Давайте напишем тест для вызова Comeonin. Мы сделаем его менее подробным, так как хотим лишь убедиться в работе шифрования. В файле test/models/user_test.exs:
test "password_digest value gets set to a hash" do
changeset = User.changeset(%User{}, @valid_attrs)
assert Comeonin.Bcrypt.checkpw(@valid_attrs.password, Ecto.Changeset.get_change(changeset, :password_digest))
end
Для улучшения покрытия тестами, давайте рассмотрим случай, когда строчка `if the password = get_change() не является истиной:
test "password_digest value does not get set if password is nil" do
changeset = User.changeset(%User{}, %{email: "[email protected]", password: nil, password_confirmation: nil, username: "test"})
refute Ecto.Changeset.get_change(changeset, :password_digest)
end
В данном случае поле password_digest должно оставаться пустым, что и происходит! Мы проделываем хорошую работу, покрывая наш код тестами!
Шаг 4. Давайте войдём!
Добавим новый контроллер SessionController и сопутствующее представление SessionView. Начнём с простого, а со временем придём к более правильной реализации.
Создайте файл web/controllers/session_controller.ex:
defmodule Pxblog.SessionController do
use Pxblog.Web, :controller
def new(conn, _params) do
render conn, "new.html"
end
end
А также web/views/session_view.ex:
defmodule Pxblog.SessionView do
use Pxblog.Web, :view
end
И напоследок web/templates/session/new.html.eex:
<h2>Login</h2>
Следующую строку добавьте в скоуп «/»:
resources "/sessions", SessionController, only: [:new]
Тем самым мы включаем наш новый контроллер в маршрутизатор. Единственный путь, который нам сейчас понадобится, это new, что мы явно и указываем. Опять же, нам нужно получить наиболее устойчивый фундамент наиболее простыми методами.
Перейдя по адресу http://localhost:4000/sessions/new, мы должны увидеть под заголовком Phoenix framework подзаголовок Login.
Добавим сюда настоящую форму. Для этого создадим файл web/templates/session/form.html.eex:
<%= form_for @changeset, @action, fn f -> %>
<%= if f.errors != [] do %>
<div class="alert alert-danger">
<p>Oops, something went wrong! Please check the errors below:</p>
<ul>
<%= for {attr, message} <- f.errors do %>
<li><%= humanize(attr) %> <%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="form-group">
<label>Username</label>
<%= text_input f, :username, class: "form-control" %>
</div>
<div class="form-group">
<label>Password</label>
<%= password_input f, :password, class: "form-control" %>
</div>
<div class="form-group">
<%= submit "Submit", class: "btn btn-primary" %>
</div>
<% end %>
И вызовем только что созданию форму в файле web/templates/session/new.html.eex с помощью всего лишь одной строчки:
<%= render "form.html", changeset: @changeset, action: session_path(@conn, :create) %>
Благодаря автоматической перезагрузке кода, на странице отобразится ошибка, так как мы ещё не определили переменную @changeset, которая как можно догадаться должна быть ревизией. Раз мы работаем с объектом, у которого есть поля :name и :password, давайте их и использовать!
В файле web/controllers/session_controller.ex нам необходимо добавить алиас модели User, чтобы мы спокойно могли к ней обращаться дальше. В верхней части нашего класса, прямо под строкой use Pxblog.Web, :controller добавьте следующее:
alias Pxblog.User
И в функции new измените вызов рендера, как показано ниже:
render conn, "new.html", changeset: User.changeset(%User{})
Мы должны передать сюда объект соединения, шаблон который мы хотим отрендерить (без расширения eex) и список дополнительных переменных, которые будут использоваться внутри шаблона. В данном случае нам нужно указать changeset: и передать ему ревизию Ecto для User с пустой структурой пользователя.
Обновим страничку. Теперь мы должны увидеть другую ошибку, выглядящую следующим образом:
No helper clause for Pxblog.Router.Helpers.session_path/2 defined for action :create.
The following session_path actions are defined under your router:
*:new
В нашей форме мы ссылаемся на путь, которого пока не существует. Мы используем хелпер session_path, передавая ему объект @conn, но затем указываем путь :create, который ещё только предстоит создать.
Половина пути пройдена. Теперь давайте реализуем возможность реального входа с использованием сессии. Для этого изменим наши пути.
В файле web/router.ex включим :create в описание SessionController:
resources "/sessions", SessionController, only: [:new, :create]
В файле web/controllers/session_controller.ex импортируем функцию checkpw из модуля Bcrypt библиотеки Comeonin:
import Comeonin.Bcrypt, only: [checkpw: 2]
В этой строке говорится “Импортируй из модуля Comeonin.Bcrypt только функцию checkpw с арностью 2″.
А затем подключим плаг scrub_params, который будет работать с пользовательскими данными. Добавим перед нашими функциями:
plug :scrub_params, "user" when action in [:create]
scrub_params — это специальная функция, которая очищает пользовательский ввод. В случае, когда, например, какой-либо атрибут передаётся как пустая строка, scrub_params сконвертирует её в значение nil, чтобы избежать создание в базе данных записей с пустыми строками.
Следом добавим функцию для обработки действия create. Расположим её внизу модуля SessionController. Здесь будет много кода, так что давайте разберём его по частям.
В файле web/controllers/session_controller.ex:
def create(conn, %{"user" => user_params}) do
Repo.get_by(User, username: user_params["username"])
|> sign_in(user_params["password"], conn)
end
Первый кусочек кода Repo.get_by(User, username: user_params[“username”]) вытаскивает подходящего пользователя User из нашего репозитория Ecto Repo, если username совпадает либо возвращает nil.
Вот небольшой кусочек вывода, чтобы проверить это поведение:
iex(3)> Repo.get_by(User, username: "flibbity")
[debug] SELECT u0."id", u0."username", u0."email", u0."password_digest", u0."inserted_at", u0."updated_at" FROM "users" AS u0 WHERE (u0."username" = $1) ["flibbity"] OK query=0.7ms
nil
iex(4)> Repo.get_by(User, username: "test")
[debug] SELECT u0."id", u0."username", u0."email", u0."password_digest", u0."inserted_at", u0."updated_at" FROM "users" AS u0 WHERE (u0."username" = $1) ["test"] OK query=0.8ms
%Pxblog.User{__meta__: %Ecto.Schema.Metadata{source: "users", state: :loaded},
email: "test", id: 15,
inserted_at: %Ecto.DateTime{day: 24, hour: 19, min: 6, month: 6, sec: 14,
usec: 0, year: 2015}, password: nil, password_confirmation: nil,
password_digest: "$2b$12$RRkTZiUoPVuIHMCJd7yZUOnAptSFyM9Hw3Aa88ik4erEsXTZQmwu2",
updated_at: %Ecto.DateTime{day: 24, hour: 19, min: 6, month: 6, sec: 14,
usec: 0, year: 2015}, username: "test"}
Затем мы берем пользователя, и передаём его по цепочке в функцию sign_in. Мы до сих пор её не написали, так что давайте этим и займемся!
defp sign_in(user, password, conn) when is_nil(user) do
conn
|> put_flash(:error, "Invalid username/password combination!")
|> redirect(to: page_path(conn, :index))
end
defp sign_in(user, password, conn) do
if checkpw(password, user.password_digest) do
conn
|> put_session(:current_user, %{id: user.id, username: user.username})
|> put_flash(:info, "Sign in successful!")
|> redirect(to: page_path(conn, :index))
else
conn
|> put_session(:current_user, nil)
|> put_flash(:error, "Invalid username/password combination!")
|> redirect(to: page_path(conn, :index))
end
end
Главное, на что нужно обратить внимание — это порядок, в котором определены эти функции. Первая из них имеет охранное условие, следовательно этот метод будет выполняться только в случае истинности этого условия. Так что, если мы не нашли пользователя, то осуществим перенаправление обратно к root_path с соответствующим сообщением.
Вторая функция будет обрабатывать все остальные сценарии (когда охранное условие ложно). Мы проверяем пароль функцией checkpw. Если он правильный, то записываем пользователя в переменную сессии current_user и осуществляем перенаправление с сообщением об успешном входе. В противном случае, мы очищаем текущий сеанс пользователя, устанавливаем сообщение об ошибке, и перенаправляем к корню.
Мы можем зайти на страницу http://localhost:4000/sessions/new и проверить как оно работает. С правильными данными мы войдём внутрь, а с неправильными получим ошибку.
Нам также нужно написать тесты на этот контроллер. Создадим файл test/controllers/session_controller_test.exs и заполним его следующим кодом:
defmodule Pxblog.SessionControllerTest do
use Pxblog.ConnCase
alias Pxblog.User
setup do
User.changeset(%User{}, %{username: "test", password: "test", password_confirmation: "test", email: "[email protected]"})
|> Repo.insert
{:ok, conn: build_conn()}
end
test "shows the login form", %{conn: conn} do
conn = get conn, session_path(conn, :new)
assert html_response(conn, 200) =~ "Login"
end
test "creates a new user session for a valid user", %{conn: conn} do
conn = post conn, session_path(conn, :create), user: %{username: "test", password: "test"}
assert get_session(conn, :current_user)
assert get_flash(conn, :info) == "Sign in successful!"
assert redirected_to(conn) == page_path(conn, :index)
end
test "does not create a session with a bad login", %{conn: conn} do
conn = post conn, session_path(conn, :create), user: %{username: "test", password: "wrong"}
refute get_session(conn, :current_user)
assert get_flash(conn, :error) == "Invalid username/password combination!"
assert redirected_to(conn) == page_path(conn, :index)
end
test "does not create a session if user does not exist", %{conn: conn} do
conn = post conn, session_path(conn, :create), user: %{username: "foo", password: "wrong"}
assert get_flash(conn, :error) == "Invalid username/password combination!"
assert redirected_to(conn) == page_path(conn, :index)
end
end
Начинаем со стандартного блока setup и довольно обычной проверки GET-запроса. Тест на создание выглядит более интересным:
test "creates a new user session for a valid user", %{conn: conn} do
conn = post conn, session_path(conn, :create), user: %{username: "test", password: "test"}
assert get_session(conn, :current_user)
assert get_flash(conn, :info) == "Sign in successful!"
assert redirected_to(conn) == page_path(conn, :index)
end
Первая строчка — это отправка POST-запроса на путь создания сессии. Затем идут проверки, установилась ли переменная сессии current_user, появилось сообщение о входе, и, наконец, осуществилось ли перенаправление. В остальных тестах мы точно так же проверяем другие пути, куда может попасть функция sign_in. Опять же всё очень просто!
Шаг 5. Улучшаем нашего current_user
Давайте изменим основной шаблон так, чтобы он отображал либо имя пользователя, либо ссылку на вход, в зависимости от того, вошёл пользователь или нет.
Для этого в файл web/views/layout_view.ex добавим хелпер, который облегчит получение информации о текущем пользователе:
def current_user(conn) do
Plug.Conn.get_session(conn, :current_user)
end
Теперь откроем файл web/templates/layout/app.html.eex и вместо ссылки Get Started добавим следующее:
<li>
<%= if user = current_user(@conn) do %>
Logged in as
<strong><%= user.username %></strong>
<br>
<%= link "Log out", to: session_path(@conn, :delete, user.id), method: :delete %>
<% else %>
<%= link "Log in", to: session_path(@conn, :new) %>
<% end %>
</li>
Давайте снова разбирать код по шагам. Одной из первых вещей, которую нам нужно сделать — это выяснить кто текущий пользователь, предполагая, что он уже вошёл в систему. Сначала сделаем решение в лоб, а рефакторингом займёмся после. Установим пользователя из сессии прямо в нашем шаблоне. Функция get_session — это часть объекта Conn.
Если пользователь вошёл в систему, нам нужно показывать ему ссылку на выход. Мы будем рассматривать сессию в качестве обычного ресурса, так что для выхода мы просто удалим сессию с помощью ссылки на это действие.
Нам также нужно вывести имя текущего пользователя. Мы храним структуру пользователя в сессионной переменной current_user, так что у нас есть возможность получить username через user.username.
Если мы не смогли найти пользователя, то просто показываем ссылку на вход. Здесь мы снова рассматриваем сессию как ресурс, так что new предоставит правильный путь для создания новой сессии.
Вы наверное заметили, что после обновления страницы мы получаем ещё одно сообщение с ошибкой об отсутствующей функции. Давайте подключим требуемый путь, чтобы Phoenix был счастлив!
В файле web/router.ex добавляем к маршрутам сессии также и :delete:
resources "/sessions", SessionController, only: [:new, :create, :delete]
Ещё нужно изменить контроллер. В файл web/controllers/session_controller.ex добавьте следующее:
def delete(conn, _params) do
conn
|> delete_session(:current_user)
|> put_flash(:info, "Signed out successfully!")
|> redirect(to: page_path(conn, :index))
end
Так как мы только что удалили ключ current_user, нам не важно какие параметры приходят, поэтому помечаем их знаком подчёркивания вначале как неиспользуемые. Также мы установили сообщение об успешном выходе и осуществили перенаправление в список постов.
Теперь мы можем войти, выйти и проверить неудачный вход. Всё идёт к лучшему! Но прежде нам нужно написать несколько тестов. Мы начнём с тестов для нашего LayoutView. Первое, что мы собираемся сделать, это прописать алиасы для модулей LayoutView и User, чтобы сократить код. Далее в блоке настройки мы создаём пользователя и добавляем его в базу данных. А затем возвращаем стандартный кортеж {:ok, conn: build_conn()}.
defmodule Pxblog.LayoutViewTest do
use Pxblog.ConnCase, async: true
alias Pxblog.LayoutView
alias Pxblog.User
setup do
User.changeset(%User{}, %{username: "test", password: "test", password_confirmation: "test", email: "[email protected]"})
|> Repo.insert
{:ok, conn: build_conn()}
end
test "current user returns the user in the session", %{conn: conn} do
conn = post conn, session_path(conn, :create), user: %{username: "test", password: "test"}
assert LayoutView.current_user(conn)
end
test "current user returns nothing if there is no user in the session", %{conn: conn} do
user = Repo.get_by(User, %{username: "test"})
conn = delete conn, session_path(conn, :delete, user)
refute LayoutView.current_user(conn)
end
end
Теперь рассмотрим сами тесты. В первом из них мы создаём сессию и утверждаем, что функция LayoutView.current_user должна вернуть определённые данные. Во втором же рассмотрим обратную ситуацию. Мы явно удаляем сессию и опровергаем, что функция current_user возвращает пользователя.
Также мы добавили действие delete в SessionController, следовательно на это тоже нужно написать тест:
test "deletes the user session", %{conn: conn} do
user = Repo.get_by(User, %{username: "test"})
conn = delete conn, session_path(conn, :delete, user)
refute get_session(conn, :current_user)
assert get_flash(conn, :info) == "Signed out successfully!"
assert redirected_to(conn) == page_path(conn, :index)
end
Здесь мы убеждаемся, что current_user из сессии является пустым, а также проверяем возвращаемое flash-сообщение и перенаправление.
На этом первая часть подошла к концу.
Важное заключение от переводчика
Мною была проделана огромная работа по переводу как этой статьи, так и переводу всей серии. Чем я продолжаю заниматься и сейчас. Поэтому, если вам понравилась сама статья или начинания в популяризации Эликсира в рунете, пожалуйста, поддержите статью плюсами, комментариями и репостами. Это невероятно важно как для меня лично, так и для всего сообщества Эликсира в целом.
Другие статьи серии
- Вступление
- Авторизация
- Добавляем роли
- Обрабатываем роли в контроллерах
- Подключаем ExMachina
- Поддержка Markdown
- Добавляем комментарии
- Заканчиваем с комментариями
- Каналы
- Тестирование каналов
- Заключение
Обо всех неточностях, ошибках, плохом переводе, пожалуйста, пишите личными сообщениями, буду оперативно исправлять. Заранее благодарю всех участвующих.
замечания
В этом разделе представлен обзор того, что такое феникс-инфраструктура, и почему разработчик может захотеть его использовать.
Следует также упомянуть любые крупные темы в рамках феникса и ссылки на связанные темы. Поскольку Documentation for phoenix-framework является новым, вам может потребоваться создать начальные версии этих связанных тем.
Версии
Версия | Дата выхода |
---|---|
0.1.1 | 2014-05-01 |
0.2.0 | 2014-05-01 |
0.2.1 | 2014-05-01 |
0.2.2 | 2014-06-05 |
0.2.3 | 2014-05-05 |
0.2.10 | 2014-05-22 |
0.2.11 | 2014-06-30 |
0.3.0 | 2014-07-01 |
0.3.1 | 2014-07-05 |
0.4.0 | 2014-08-31 |
0.4.1 | 2014-09-09 |
0.5.0 | 2014-10-14 |
0.6.0 | 2014-11-22 |
0.6.1 | 2014-11-30 |
0.6.2 | 2014-12-08 |
0.7.0 | 2014-12-10 |
0.7.1 | 2014-12-10 |
0.7.2 | 2014-12-11 |
0.8.0 | 2015-01-11 |
0.9.0 | 2015-02-12 |
0.10.0 | 2015-03-08 |
0.11.0 | 2015-04-08 |
0.12.0 | 2015-05-01 |
0.13.0 | 2015-11-15 |
0.13.1 | 2015-05-17 |
0.14.0 | 2015-06-30 |
0.15.0 | 2015-07-27 |
0.16.0 | 2015-08-06 |
0.16.1 | 2015-08-06 |
0.17.1 | 2015-08-27 |
1.0.0 | 2015-08-28 |
1.0.1 | 2015-09-03 |
1.0.2 | 2015-09-07 |
1.0.3 | 2015-09-29 |
1.0.4 | 2015-12-15 |
1.1.0 | 2015-09-16 |
1.1.1 | 2015-09-27 |
1.1.2 | 2016-01-09 |
1.1.3 | 2016-01-20 |
v1.2.0-rc.0 | 2016-04-29 |
v1.2.0-RC.1 | 2016-05-25 |
1.2.0 | 2016-06-23 |
1.2.2 | 2017-03-14 |
1.2.3 | 2017-03-15 |
1.2.4 | 2017-05-16 |
1.3.0-RC.1 | 2017-03-15 |
1.3.0-РК-2 | 2017-05-16 |
Монтаж
Основа Phoenix написана в Elixir , а сам Elixir основан на языке Erlang и использует Erlang VM, известную тем, что работает с низкими задержками, распределенными и отказоустойчивыми системами. Оба языка необходимы для использования феникс-фреймворка. Следуя следующему шагу, чтобы установить феникс-фреймворк:
1. Установите Elixir на свой компьютер. См. Установка Elixir и как установить руководство Elixir .
2. Установите диспетчер пакетов Hex . Hex — это необходимый инструмент для запуска приложения Phoenix и для установки любых дополнительных зависимостей, которые могут понадобиться нам на этом пути. В окне управления терминалом или командами введите:
$ mix local.hex
Эта команда установит или обновит Hex, если у вас уже есть.
3. Установите Erlang на свой компьютер. Без Erlang код Elixir не будет компилироваться, потому что Elixir использует VM Erlang для компиляции кода. Когда вы установите Elixir, вы, вероятно, тоже установили Erlang, но если это не так, следуйте этой инструкции в руководстве Elixir для установки Erlang. Однако, если у вас есть система на базе Debian, вам может потребоваться явно установить Erlang.
$ wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb
$ sudo apt-get update
$ sudo apt-get install esl-erlang
4. Установите феникс-фрейм на свой компьютер. Как только у нас есть Elixir и Erlang, мы готовы установить архив Phoenix Mix. Архив Mix — это Zip-файл, который содержит приложение, а также его скомпилированные файлы BEAM. Он привязан к конкретной версии приложения. Архив — это то, что мы будем использовать для создания нового базового приложения Phoenix, из которого мы можем построить. Вот команда установки архива Phoenix:
$ mix archive.install https://github.com/phoenixframework/archives/raw/master/phoenix_new.ez
Вы можете загружать пакеты вручную, если вышеуказанная команда не работает должным образом. Загрузите пакеты в файловую систему архивов Phoenix и выполните следующую команду
mix archive.install /path/to/local/phoenix_new.ez
5 Plug, Cowboy и Ecto являются компонентами феникс-фреймворка, они будут установлены автоматически с помощью mix, если вы позволите mix устанавливать свои зависимости, когда вы сначала создадите проекты Phoenix. Кроме того, если вы не разрешаете микшированию загружать эти компоненты, то mix расскажет вам, как это сделать позже.
6. Установите Node.js (не менее v5.0.0) на ваш компьютер. Это необязательная зависимость. Node.js требуется установить brunch.io зависимости. Brunch.io используется Phoenix для компиляции статических активов (javascript, css и т. Д.) По умолчанию.
Мы можем получить node.js со страницы загрузки . При выборе пакета для загрузки важно отметить, что Phoenix требуется версия 5.0.0 или выше.
Пользователи Mac OS X также могут установить node.js через homebrew .
Примечание. Io.js, которая является совместимой с npm платформой, основанной на Node.js, не работает с Phoenix.
Пользователи Debian / Ubuntu могут видеть ошибку, которая выглядит так:
sh: 1: node: not found
npm WARN This failure might be due to the use of legacy binary "node"
Это связано с тем, что Debian имеет конфликтующие двоичные файлы для узла: см. Обсуждение по следующему запросу SO
Не удается установить пакеты с помощью диспетчера пакетов узлов в Ubuntu
Есть две возможности решить эту проблему:
install nodejs-legacy:
$ apt-get install nodejs-legacy
или создать символическую ссылку
$ ln -s /usr/bin/nodejs /usr/bin/node
7 Установите базу данных ( PostgreSQL ) на свой компьютер. Phoenix настраивает приложения для использования по умолчанию, но мы можем переключиться на MySQL , передав флаг --database mysql
при создании нового приложения. В вики PostgreSQL есть руководства по установке для нескольких различных систем.
Postgrex является прямой зависимостью от Phoenix, и он будет использоваться для создания моделей. Postgrex будет автоматически установлен вместе с остальными зависимостями, когда вы создадите и запустите проект Phoenix.
8 inotify-tools (для пользователей linux) Это наблюдаемый файловой системой Linux, который Phoenix использует для перезагрузки в реальном времени. (Пользователи Mac OS X или Windows могут спокойно игнорировать его.)
Пользователям Linux необходимо установить эту зависимость. Пожалуйста, ознакомьтесь с вики-программой inotify-tools для инструкций по установке для конкретного дистрибутива.
Установка скелета
Иногда вам нужна установка без каких-либо изменений, кроме минимальной установки phoenix. Эта команда даст вам это.
mix phoenix.new web --no-brunch --no-ecto
Примечание. Вы должны были установить Elixir, Erlang, Hex, Mix и архив Phoenix для установки скелета
Для создания вашего первого проекта в феникс-каркасе на данный момент у вас должны быть установлены Elixir, Erlang, Hex и Phoenix. У вас также должны быть установлены PostgreSQL и node.js для создания приложения по умолчанию.
Откройте терминал или командную строку и перейдите в папку в вашей файловой системе, где вы хотите создать приложение . phoenix.new
— это команда mix, которая создаст для вас новый проект. Предполагая, что именем нашего приложения является hello_phoenix_world
, тогда введите
$ mix phoenix.new hello_phoenix_world
В качестве альтернативы , мы можем запустить mix phoenix.new из любого каталога, чтобы загрузить приложение Phoenix. Phoenix примет абсолютный или относительный путь для каталога нашего нового проекта
$ mix phoenix.new /Users/username/work/elixir-projects/hello_phoenix_world
Выход
mix phoenix.new hello_phoenix_world
* creating hello_phoenix_world/config/config.exs
* creating hello_phoenix_world/config/dev.exs
* creating hello_phoenix_world/config/prod.exs
...
* creating hello_phoenix_world/web/views/layout_view.ex
* creating hello_phoenix_world/web/views/page_view.ex
Fetch and install dependencies? [Yn]
Phoenix создаст структуру каталогов для вашего проекта и создаст все файлы, необходимые для приложения. Mix спросит вас, хотите ли вы установить другие необходимые зависимости . Скажем так.
Fetch and install dependencies? [Yn] Y
* running mix deps.get
* running npm install && node node_modules/brunch/bin/brunch build
После установки зависимостей задача предложит вам перейти в наш каталог проекта и запустить приложение.
Move into your new project folder:
$cd hello_phoenix_world
Теперь вам нужно настроить имя пользователя и пароль postgres, если он уже не настроен с использованием по умолчанию postgres useranme и пароля postgres. Измените файл config/dev.exs
и config/dev.exs
имя пользователя и пароль:
# config/dev.exs
config :hello_phoenix_world, HelloPhoenixWorld.Repo,
adapter: Ecto.Adapters.Postgres,
username: "postgres",
password: "postgres",
database: "hello_phoenix_world_dev",
hostname: "localhost",
pool_size: 10
Now, create the database with the ecto mix task:
$ mix ecto.create
We have a working application! Run your Phoenix application:
$ mix phoenix.server
You can also run your app inside IEx (Interactive Elixir) as:
$ iex -S mix phoenix.server
Load `http://localhost:4000` into your browser and you will see the default landing page of your application.
Теперь давайте добавим мир привет в приложение Phoenix. Откройте файл web/templates/page/index.html.eex
и замените содержимое следующим и сохраните файл:
<h2>Hello World</h2>
Если вы не покинули сервер, новый код будет автоматически скомпилирован, и ваш браузер должен теперь отобразить ваше сообщение «Hello World».
Теперь вы можете создать ресурс CRUD .
Наконец, чтобы выйти из сервера, введите ctrl-c
crtl-c
(нажмите клавишу control key
и c
ключ вместе) два раза подряд.
Запуск Elixir / Phoenix на OSX
Эликсир / Феникс
Сначала установите Homebrew :
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Затем, запустив brew install elixir
установит как Elixir, так и его зависимость — Erlang.
Установите смесь со mix local.hex
.
Установите Phoenix в соответствии с инструкциями:
mix archive.install https://github.com/phoenixframework/archives/raw/master/phoenix_new.ez
Node.js
Вы можете устанавливать и управлять версиями Node.js с помощью NVM. Установите nvm с помощью:
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.4/install.sh | bash
Если curl
недоступен, вы можете установить его с помощью brew install curl
. Затем выполните:
nvm install node
для загрузки и компиляции и последней версии Node.js.
База данных
Скачайте Postgres.app и запустите его. Когда вы создаете проект Phoenix, в вашем файле config/dev.exs
вам просто нужно указать имя для своей базы данных — адаптер будет использовать значения по умолчанию для остальных:
config :myphoenixapp, MyPhoenixApp.Repo,
adapter: Ecto.Adapters.Postgres,
database: "myphoenixapp_dev",
hostname: "localhost",
pool_size: 10
Создание ресурсов для модели
Для создания схемы, представления, контроллера, файла миграции для репозитория, шаблонов CRUD по умолчанию и тестовых файлов для модели (например, леса в Rails) можно использовать задачу phoenix.gen.html
mix:
mix phoenix.gen.html Book books title note:text pages:integer author_id:references:authors
Где Book
— это имя модуля, books
— это множественная форма, используемая для схемы, за которой следуют поля ресурсов: title
(строка по умолчанию), note
(текстовое поле), pages
(целое), author_id
которое создает ассоциацию belongs_to
с моделью Author.