-Поиск по дневнику

Поиск сообщений в rss_rss_hh_new

 -Подписка по e-mail

 

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 17.03.2011
Записей:
Комментариев:
Написано: 51

Habrahabr/New








Добавить любой RSS - источник (включая журнал LiveJournal) в свою ленту друзей вы можете на странице синдикации.

Исходная информация - http://habrahabr.ru/rss/new/.
Данный дневник сформирован из открытого RSS-источника по адресу http://feeds.feedburner.com/xtmb/hh-new-full, и дополняется в соответствии с дополнением данного источника. Он может не соответствовать содержимому оригинальной страницы. Трансляция создана автоматически по запросу читателей этой RSS ленты.
По всем вопросам о работе данного сервиса обращаться со страницы контактной информации.

[Обновить трансляцию]

[Перевод] Steam Greenlight и Steam Direct: что нужно знать инди-разработчикам

Среда, 12 Июля 2017 г. 08:57 + в цитатник
image

После перехода к Steam Direct предстоит ответить на множество вопросов, поэтому среди потребителей и разработчиков возникают слухи и домыслы. Как разработчик, очень близко знакомый с процессом Greenlight с 2015 года и дважды успешно его прошедший с Spooky's Jump Scare Mansion и HD Renovation (в сумме у этих игр больше миллиона пользователей), я хотела бы поговорить о Direct и о первых впечатлениях о нём. Стоит рассказать о многом, в том числе об изменениях для защиты от злоупотреблений коллекционными карточками Steam, о ценах и о том, что новая система будет значить для разработчиков и потребителей.

Старый способ: Steam Greenlight


Давайте начнём разговор со Steam Greenlight. Это будет просто справочная информация, постараюсь изложить её покороче. Steam Greenlight — это функция Steam, реализованная компанией Valve для помощи инди-разработчикам в продаже их игр в Steam. Как работал этот процесс: разработчик платил Valve за участие в Greenlight 100 долларов. Разработчик должен был заплатить этот взнос только один раз, а потом мог загрузить в Steam Greenlight любое количество игр. Деньги назад не возвращались.

После оплаты разработчику предоставляли доступ к порталу Steam Greenlight, в котором он мог создать страницу Greenlight с информацией об игре (название и описание), загрузить на неё видеоролики, трейлеры и скриншоты, полезные ссылки (например на демо игры) и ссылки на страницы в соцсетях. Кроме того, нужно было добавить на страницу всех причастных к созданию (если был ещё кто-то, кроме вас), после чего всё готово к публикации страницы в Greenlight.

Теперь о том, как работал процесс одобрения — после публикации страницы ваша игра оказывалась в Steam Greenlight, где пользователи голосовали «Да», «Нет» или «Возможно», чтобы выразить свой интерес. Кроме того, они могли подписываться на страницу и делиться ссылками на неё, оставлять комментарии, читать посты в блоге и объявления создателя страницы. Все игры в Greenlight ранжировались по количеству голосов «Да», и если ваша игра попадала в сотню лучших Steam Greenlight, то вы могли рассчитывать на возможный успех. Если игра добиралась на самую верхушку в конкурсе популярности (одно из пяти верхних мест), ваша игра одобрялась сообществом и ей давался «зелёный свет». Поздравляем! То, что было после, не очень важно для этой статьи, так что остановимся на этом.

Новый способ: Steam Direct


Теперь поговорим о Steam Direct и о том, что мы знаем об этом процессе. Помните о взносе в 100 долларов на Steam Greenlight? Заплатив его, вы могли публиковать любое количество игр. Ну что ж, теперь вам придётся платить по 100 долларов за игру. Взнос больше не однократный. Светлая сторона, если так можно выразится, заключается в том, что если ваша игра сама заработает в Steam больше 1000 долларов, то эти 100 долларов вам вернут.

После оплаты вам нужно заполнить информацию о себе: имя, номер социального страхования и т.д., чтобы можно убедиться, что вы действительно тот, за кого себя выдаёте. Valve также требует заполнения налоговой формы и банковской информации. В процессе заполнения вы должны будете подписать несколько соглашений о неразглашении (NDA). После завершения всей этой бюрократической работы и когда компания удостоверится, что вы — реальный человек, вам разрешат ввести коммерческую информацию — название игры, описание, стоимость и т.д. В процессе Greenlight этого не требовалось делать, пока вашей странице не дадут «зелёный свет».

Когда вы со всем этим разберётесь, вас пригласят в портал разработчиков Steam. Здесь можно будет загрузить свою игру: файлы, достижения, коллекционные карточки Steam и тому подобное. Необходимо передать на тестирование почти готовую версию игры Valve, чтобы компания убедилась, что вы не пытаетесь опубликовать на платформе зловредное ПО или что-то подобное. Обычно это занимает несколько дней. То же самое относится и к коллекционным карточкам Steam и другим дополнительным файлам к игре. Valve рекомендует делать всё это не позже, чем за 30 дней до запланированного выпуска игры, чтобы все файлы были одобрены за разумное время, и никому не пришлось паниковать. У термина «игра» нет строгих определений, но Valve потратит несколько дней на проверку того, соответствует ли ваша игра описанию на странице. После одобрения Valve вы можете выпускать игру в Steam. Поздравляю!

Цена известности


Да, с этим есть проблемы. Самая главная — раньше ваша игра должна была завоевать определённый интерес в Steam Greenlight. В Steam Direct нужно будет просто заплатить, и всё — вы уже в деле. Проблема в том, что Steam практически превращается в PC-версию Google Play Store.

Это очень сомнительный ход для меня как для разработчика и потребителя, потому что на платформе будет ещё больше игр. Кажется, это не так плохо, правда? Но на самом деле это так, потому что в Steam и так уже сложно найти в общей куче стоящие игры — 40% игр в Steam были выпущены 2016 году. С системой Steam Direct процесс поиска новых игр, которые привлекут ваш интерес, ещё больше усложняется. Как разработчику вам придётся конкурировать с кучей не очень качественных игр, занимающих главную страницу, которую должны были занять вы.

38% of all Steam games were released in 2016 pic.twitter.com/JiX2pt6JhB

— Steam Spy (@Steam_Spy) November 30, 2016


Steam Direct добавляет новый непрерывный поток игр, но поиск игр также сложен из-за добавляемых пользователями меток. Любой человек, тролль он или нет, может зайти на страницу игры в Steam и добавить на неё метки. Часто очень низкокачественным играм люди добавляют метку «horror» или «scary», даже если она не является хоррором. Это может быть двухмерный сайдскроллер про единорога, собирающего пирожные, но если игра некачественная, то тролли добавят ей метку «horror». Если вы будете искать новые игры с меткой «horror», то наверняка найдёте игры-хорроры или пугающие игры, но также там будут и совершенно точно не относящиеся к этому жанру игры. Эта проблема уже существует, но чем больше низкокачественных игр появится в Steam из-за постоянного добавления новых, тем сильнее будут пользователи злоупотреблять системой меток.

Ещё одно мое мнение может быть непопулярным. Я говорила с несколькими разработчиками и они, как и я, считают, что цена публикации игры в Steam Direct должна быть немного выше, чем 100 долларов. По-моему, она должна быть не ниже 500 долларов, особенно учитывая то, что вы получите деньги обратно, продав на сумму больше 1000 долларов. Благодаря Patreon, потоковым каналам разработчиков на Twitch, да и просто собираемыми на сайте пожертвованиями хороший разработчик и хорошая игра легко наберут нужную сумму денег.

Кстати, об оплате: как насчёт тех разработчиков, которые продают игры за 99 центов или даже бесплатно? Они не вернут своих денег, а если и вернут, то за 99 центов нужно обеспечить солидное количество продаж. Ситуация с бесплатными играми ещё хуже, потому что при возврате средств внутриигровые транзакции не учитываются. Кто-то может сказать: «Да зачем возвращать деньги? Вы же получаете РЕКЛАМУ!». Или: «Почему вы хотите получить деньги обратно? Вы делаете игры только ради заработка?!» На оба этих заявления я могу ответить, что разработка игр не всегда дешева. Хорошо, когда вы получаете отдачу за свою работу, она помогает создавать новые игры.

Интересна (если не сказать больше) ситуация с разработчиками, выпускающими бесплатные игры. Я сочувствую тем, кто хочет выложить игру в Steam, сделать её бесплатной и при этом не получит с этой новой системой ничего — это не очень честно по отношению к ним. Разработчики, получающие небольшую прибыль, могут вообще не получить денег. Моя первая игра в Steam была бесплатной. Я понимала, что не могу вернуть деньги, потому что: 1.) Это невозможно и 2.) Никто из разработчиков не вернёт свои деньги. Если бы систем Steam Direct была введена тогда, я завидовала бы тем, кто вернул свои деньги, потому что мне бы не удалось этого сделать. Надеюсь, будет какая-то система, помогающая таким разработчикам бесплатных игр. Возможно, стоит возвращать деньги, если у них будет X загрузок, как будто это платная игра, заработавшая 1000 долларов.

И ещё одна тема: злоупотребление коллекционными карточками Steam


Серьёзной проблемой Steam Greenlight было злоупотребление коллекционными карточками Steam. Разработчики генерировали тысячи ключей, передавали их ботам, запускавшим игры Steam для фарминга карточек. Потом они ставили на карточки высокую цену и получали свой процент на их продажах.

Эта проблема существует на нескольких уровнях, в том числе она заключается и в двух наших любимых словах — в алгоритме Steam. Если вы не знали: чем больше времени играют в игру, тем Steam считает её более популярной, поэтому больше рекламирует её на главной странице, рекомендует её пользователям, и т.д. Понятно, что это серьёзная проблема. Steam показывает нам непопулярные и некачественные игры, потому что фармящие карточки боты ломают всю систему.

С вводом Steam Direct компания Valve изменила подход: теперь игре с карточками нужно достичь определённого количества часов игрового процесса у всех игроков, плюс она обязана соответствовать каким-то другим показателям, которые Valve от нас скрывает. Как только игра достигнет этих показателей, карточки начинают выпадать. После этого все игроки, наигравшие время в этой игре, будут получать карточки. Звучит круто, правда? Ну, не совсем. Особенно если учесть то, что мы не знаем показателей, которых должна достичь игра. Не говоря уже о том, что коллекционные карточки Steam являются серьёзной причиной отказа от покупки — если пользователи не смогут получить карточки сразу же, это может стать проблемой. Даже в нынешней системе потребители жалуются, что карточки не выпадают. Это вредит магазину, охотникам за ачивками и коллекционерам, и всё ради борьбы с небольшим количеством людей, фармящих карты для заработка. Но я уверена, что даже при таких изменениях фармеры карточек всё равно найдут способы продолжать свои махинации.

Эй! Это моя игра!


Последняя проблема, которая пришла мне в голову — наверно, самая важная из всех перечисленных. Это проблема украденных работ и блокировок по DMCA. В процессе Steam Greenlight злоумышленники иногда полностью копировали уже существующую в Greenlight страницу и публиковали её в Greenlight. Почему я называю их «злоумышленниками»: ссылка на демо игры на самом деле вела к вредоносному ПО. В Greenlight были фальшивые страницы, обманом вынуждавшие ничего не подозревающих пользователей скачивать вредоносное ПО.

Такое случалось как минимум один раз с оригинальной Spooky's Jump Scare Mansion в Greenlight. Что должен делать разработчик, когда увидит такое? В Steam Greenlight на страницу с копией своей игры мог пожаловаться сам разработчик и сообщество, кроме того, можно было попросить о блокировке по DMCA, и если игра получала достаточное количество жалоб, её блокировали. То же относится к фанатским играм и играм с заменёнными ресурсами. А что насчёт Steam Direct? Насколько тщательно будет проводиться поиск, чтобы никто не украл вашу работу или не заменил в ней ресурсы? При использовании Steam Direct вы больше не сможете просить о блокировке по DMCA, пока игра не будет выпущена и не начнёт зарабатывать деньги, и меня это довольно сильно пугает.

В наихудшем случае разработчик-злоумышленник может забрать чью-то игру, заработать на ней денег и исчезнуть. Такие люди могут даже брать игры из бесплатных источников (например, на itch.io или gamejolt) и выдавать их за свои. Надеюсь, Valve очень тщательно подойдёт к тому, чтобы решение проблемы не оказалось слишком сложным для разработчика, иначе мы будем завалены подобным контентом.

Куда двигаться дальше?


Это вся информация, которая пока у нас есть, плюс мои размышления. Нам просто нужно подождать подробностей, чтобы провести более точный анализ, чтобы решить, хорошая это идея, или нет. Я понимаю, из чего исходит Valve при внесении таких изменений. Она стремится уменьшить препятствия на пути разработчиков, но я не уверена, что такая система хорошо защищена от людей, пытающихся эксплуатировать её, чтобы «срубить» шальных денег.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332848/


Метки:  

Перевод отрывков из книги Роберта Хайнлайна «Заберите себе правительство» — часть 26

Вторник, 11 Июля 2017 г. 23:57 + в цитатник

Как работать наблюдателем на выборах


Собранные вами в день выборов избирательные голоса могут бесследно исчезнуть в ночь после выборов. Один из любимейших приемов подтасовки результатов голосования – использование того факта, что, проголосовав за основного партийного кандидата, многие избиратели забывают отметить свой выбор относительно кандидатов на остальные посты в правительстве. И если в бюллетене кандидаты от разных партий сгруппированы по постам, на которые они баллотируются, то после закрытия голосования очень просто проставить напротив нужных кандидатов недостающие метки. Например, если выбирают губернатора и конгрессмена, то, имея 300 бюллетеней, из которых голос за конгрессмена помечен только в 250, за 5 минут работы за закрытыми дверями очень легко превратить результаты выборов из соотношения в 110 голосов – за кандидата Двусмыслина и 140 – за кандидата Добропорядина – в соотношение: 160 голосов – за кандидата Двусмыслина и 140 – за кандидата Добропорядина, не оставив никаких следов проведенной подтасовки.


Еще чаще бюллетени со сгруппированными по партийным спискам кандидатами подтасовывают, просто выбрасывая частично помеченные бюллетени, как неверно заполненные – в том случае, если они в них указан нежелательный кандидат – и оставляя, если в них указан нужный кандидат, не обращая внимания ни на какие допущенные в бюллетене ошибки.
Прямой вброс фальшивых бюллетеней в избирательные урны встречается очень редко. Подкуп избирателей встречается еще реже, примеры выборов, результат которых был подтасован такими методами, можно найти, разве что, в архивах.
Эти грубые и вопиюще нечестные методы не используются успешными профессиональными политиками, даже если их организация насквозь коррумпирована. Они пользуются другими, более эффективными, надежными (и относительно честными) методами, характерными для профессиональной политики. Если уж эти профессионалы прибегают к грубому подлогу, значит их организация катится в пропасть. Вспомните уголовные дела о фальсификации выборов в Канзасе.


Конечно, наблюдатель на избирательном пункте не может лично проверить подсчет голосов, потому что подсчетом занимается одновременно несколько человек, и наблюдателю невозможно за всеми уследить. Однако, присутствие наблюдателя, официально зарегистрированного участковой избирательной комиссией – почти стопроцентная защита от попыток подтасовки голосов. В дополнение к созданию видимости внимательного наблюдения за подсчетом, наблюдатель должен считать сколько бюллетеней отвергнуто как испорченные и по какой именно причине, потому, что они могут сильно повлиять на исход тех выборов, где доля голосов соперников отличается не очень сильно.
При использовании машин для голосования, вышеописанная процедура становится ненужной. Но тогда становятся возможными другие, более тонкие способы подтасовки, не имеющие ничего общего с грубыми методами принуждения или подкупа избирателей. То что сконструировал один инженер, может подправить другой инженер – таким образом, чтобы машина для голосования выдавала неверные результаты. И в такой ситуации ваш наблюдатель не сможет ничего поделать. Обнаружение следов вмешательства во внутреннее устройство этих машин потребует целого расследования, которое, вероятно, ФБР – по плечу, а вашему наблюдателю – нет.
По окончанию подсчета голосов наблюдатель докладывает по телефону в штаб-квартиру результаты, где по поступающим сведениям вы и кандидат, нервничая, и догрызая от волнения ногти на руках, ведете подсчет общего количества голосов. Наблюдатель же после телефонного доклада может ехать на послевыборную вечеринку.


Послевыборная вечеринка


Когда закроются все избирательные пункты, из штаб-квартиры вы перемещаетесь в зал, в котором обычно проходят заседания клуба агитаторов. На этот раз сюда придет в три раза больше человек, чем числится в Клубе Агитаторов, но вы готовы к этому, пусть приходят, от этого будет только веселее.
Вы даже не успели поужинать, и ваш желудок сводят спазмы голода. Все чего вы сейчас хотели бы – это перехватить на ходу сэндвич. В это время возвращается с объезда избирательных участков ваш кандидат, и вы вдвоем, в кои-то веки без окружающей вас толпы сторонников, за исключением, может быть секретарши вашей штаб-квартиры и еще пары человек, готовитесь к вечеринке. Вы оставляете кого-то у телефона, поручив ему принимать звонки от наблюдателей и записывать подсчет голосов. Включаете радио и ловите свою любимую радиостанцию, которая уже начинает передавать предварительные итоги выборов в основных округах. В зале вы поставили большую школьную доску, поручив одному из сотрудников записывать на ней предварительные итоги, чтобы все могли их видеть. Теперь вы переключаетесь на организацию банкета.


В Клубе Агитаторов состоит 100 человек, но на вечеринку придет в три раза больше – 300 человек, каждому из которых, в среднем, достаточно по литру пива. Поэтому вы запаслись 300 литрами пива. Это немало, и вы покупали пиво целыми бочонками, если конечно вам не удалось организовать, чтобы вас им бесплатно снабдили ваши сторонники. И конечно же, вы договорились с продавцом о том, что за неиспользованные бочонки вам вернут деньги, поэтому выставляете в зал по одному бочонку, храня остальные в запертом помещении. Вы также не забыли запастись 500 одноразовыми бумажными стаканчиками.
Для тех, кто спиртного не пьет, у вас есть кофе и лимонад. В запасе также есть небольшое количество легких закусок, вроде пончиков, сыра, и крекеров, которые вы не выкладываете, пока не наступит час ночи.
Не нужно подавать крепкие спиртные напитки, ваш бюджет этого не вынесет. Но некоторые посетители все равно принесут их с собой, и напьются. Не препятствуйте им, у нас свободная страна.


Начинают собираться посетители, выводя вас и мистера Честнягу из той прострации, в которую вы впали с того момента, как окончилось голосование. Они собираются вокруг кандидата, жмут ему руку, хлопают по плечу, и желают с ним выпить. Кто-то из посетителей подходит и к вам.
После этих первых ласточек, народ начинает валить валом, зал быстро наполняется. Большинство из пришедших – ваши друзья, но есть и прожженные тусовщики, посещающие каждую послевыборную вечеринку каждой партии. Вы спрятались позади стола, чтобы вам не докучали журналисты, и едите сэндвич, запивая его кофе, одним ухом прислушиваясь к телефону, и в то же время, пытаясь не упустить ход обновления предварительных результатов, записываемых принимающим звонки. Одновременно вы слушаете радио, которое сообщает, что судья Лужайкин имеет внушительный перевес в голосах за его номинацию на кандидата на губернаторский пост. Вам эта новость доставляет радость – имея Лужайкина во главе партийного списка, вам будет легче выиграть основные выборы.
Начали приходить первые телефонные доклады о результатах подсчета голосов, для вас не очень радостные. Съеденный вами сэндвич норовит подкатить обратно к горлу. Честняга продирается сквозь толпу, улыбаясь и бросая реплики окружающим, нагибается к вам, бросает взгляд на предварительные результаты. Его лицо становится озабоченным, но он ободряюще хлопает вас по плечу – «Не расстраивайся» — говорит он, «Все это стоит того, чтобы пережить, даже если мы проиграем. Если когда-нибудь я буду баллотироваться снова, я хочу, чтобы руководил моей кампанией именно ты». Эта фраза трогает вас до слез, но вы крепитесь: вокруг слишком много посторонних.


Через какое-то время результаты начинают меняться: намечается перевес в сторону Честняги. У Честняги 982 голоса, у Надежды – 1005. Честняга-2107, Надежда-2043. Вы впереди! Честняга-5480, Надежда-5106, вы восстанавливаете ваше до того сбивчивое дыхание. Честняга-9817, Надежда-8166. Честняга-12042, Надежда… погодите, кажется, вы слышите по радио номер вашего избирательного округа, и тут же начинает трезвонить телефон.
«Тишина! Потише, пожалуйста!» Окружающий гам замолкает, по крайней мере, в ближайших окрестностях радиоприемника, из которого диктор бодро вещает: «Определились результаты выборов в округах. Кандидат на выдвижение в конгресс от Демпубликанской партии в Тридевятом округе Джек Надежда, по результатам голосования уступил достопочтенному Джонатану Честняге – как сообщил нам управляющий его кампании, призывая всех поддержать этого кандидата осенью на выборах. К сожалению, мы не смогли дозвониться до мистера Честняги, но уже понятно, что…» Остальное вы не слышите. Вы победили!!!


Остаток вечера вы проводите с облегченным сердцем. Вы перестает отслеживать новости по радио, разгуливаете по залу и общаетесь, хотя ваши ноги просто отваливаются от усталости. Наливаете себе бокал пива, но тут же оставляете его пениться и выдыхаться, потому что выборы генерального прокурора приняли неожиданный оборот. Похоже, в будущем это может вызвать трудности. Около трех ночи, вы с новоиспеченным кандидатом от партии на выборы в конгресс, и парой доверенных лиц, протискиваетесь к стойке круглосуточной забегаловки, и заказываете самую обильную трапезу из тех, что ели в последние две недели. У вас в руках уже предварительные итоги выборов, вы читаете их вслух… В 4 часа утра вы, наконец, доплетаетесь до своей кровати, и засыпаете мертвым сном


«Разбор полетов» после выборов


Честняга-16107, Надежда-11373


Итак, вы поставили рекорд: все предыдущие выборы в вашем округе показывали, что при гонке двух кандидатов один из них может получить максимум 10 000 голосов избирателей, если проведет свою кампанию «на отлично». Сравнение количества проголосовавших с предыдущими выборами в вашем округе и с другими округами показывает, что в этот раз в вашем округе проголосовало на 2000 больше избирателей, чем обычно. Таким образом, методы, которыми велась ваша кампания, смогли собрать на 6000 голосов больше, чем побитый вами рекорд предыдущих выборов, и вы получили 2000 голосов тех избирателей, которые до того на праймериз не ходили, что убедительно подтверждает правильность ваших методов ведения кампании. Это не тот случай, когда вы выигрываете только за счет недостатков кампании конкурирующего кандидата, а не за счет превосходства своей кампании. Детальное изучение результатов по избирательным участкам показало, что лично ваш кандидат собрал от трети до четверти перевешивающих голосов, остальное собрали агитаторы. Значит, ваше решение послать Честнягу самолично обходить дома избирателей было правильным.


Фонд кампании пуст, но все счета оплачены. Почти все – есть еще счета за пиво, за него вы платили уже из собственного кармана. Не забудьте вернуть нетронутые два бочонка – это поможет вам уменьшить свои убытки. Кроме того, на волне победной эйфории, вам наверняка удастся уговорить пару-тройку соратников разделить с вами недостачу в вашем бюджете. Честняга обещал возместить ваши расходы, но вы не будете ловить его на слове – он и сам потратил, больше, чем собирался.


Нас надули!!!


Вернее, вы не выиграли. Предположим, у вас что-то не получилось, или может быть, среди ваших сторонников произошел раскол, и вы финишировали с таким раскладом: Честняга-12785, Надежда-12009.


В такой ситуации очень легко начать кричать о подтасовке голосов, валить все на политическую мафию, использование грязных политических методов, и вброс подделанных бюллетеней. Скорее всего, вы будете неправы, и проиграли выборы совсем не по этим причинам, и не потому что у вас было недостаточно сторонников, или потому что ваши агитаторы недостаточно усердно работали. На любых выборах есть высокий процент не проголосовавших избирателей. На праймериз таких избирателей больше 50%. И вы не можете их обвинить в подтасовке результатов выборов. Конечно может быть и так, что вы сделали все что могли, а на исход выборов действительно повлияли какие-то грязные приемы, примененные на избирательных пунктах, или еще где-то. Однако, даже при таком раскладе, результаты выборов все же отражают волю американского народа, выраженную избирателями – хотя бы даже путем неявки на выборы. Смиритесь с этим.


Сплачиваем партийные ряды


Пока не озадачивайте своих агитаторов работой, по крайней мере, до следующего собрания клуба агитаторов. А до тех пор у вас много дел.


Во-первых, вам надо собрать списки проголосовавших избирателей, чтобы в следующую кампанию, вам не надо было их добывать у местных властей всеми правдами и неправдами. Некоторые из командиров отрядов агитаторов могут оказаться достаточно дисциплинированными, чтобы помочь вам в этом, но большинство будут динамить вас так долго, что записи о проголосовавших уже уйдут в архив. Поэтому лучше все делать самому. Списки избирателей очень удобно переснимать обыкновенным фотоаппаратом. Но скопировать списки для всего округа – слишком большая работа для одного человека, даже с фотоаппаратом. Так что скопируйте все, что сможете, а когда вам понадобятся остальные списки – достаньте их у чиновников. Скопированные списки учитывайте в блокноте, чтобы не делать двойной работы.


Разберитесь с этим делом побыстрее, чтобы после того, как в партийном комитете штата пройдет собрание победивших на праймериз кандидатов, вы и ваш кандидат могли хотя бы на неделю съездить отдохнуть перед началом финальной предвыборной кампании. В идеале, – неплохо бы еще и отдохнуть несколько дней сразу после праймериз. Но скорее всего, прежде чем вы решитесь уехать, вам нужно будет заняться упрочением своей победы, консолидировав партийные организации своего округа. Потому что после выборов целый ряд членов вашего Клуба Агитаторов избраны в партийный комитет округа, и вы – среди них. Так что теперь вы контролируете состав делегации округа на партийный съезд. Мистер Честняга после своей победы на праймериз автоматически становится временным членом партийного комитета штата, и делегатом на съезд партии штата. Советуясь с вами, он составил список членов партийного комитета штата, включив туда и вас. Теперь вы можете посещать проводимые в столице штата заседания партийного комитета, но у вас может не быть на это времени, ведь надо сделать столько всего. (В вашем штате порядки в партийной организации могут быть и другие, но то, что я описываю – это типичные действия партийных организаций после выборов. Вам надо быть готовым к участию в подобных мероприятиях, в каком бы порядке они ни проходили, и к работе в них, не покладая рук, даже если в партийные комитеты штата и области попало меньше ваших людей, чем нужно для того, чтобы контролировать политическую жизнь округа).


Однако, наипервейшей вашей задачей должно быть налаживание контакта с вашим бывшим соперником – Джеком Надеждой, если, конечно, он – полноценный член вашей партии, а не марионетка, засланная соперничающей партией. На финальных выборах вам понадобится его поддержка. Свяжитесь с ним, или его управляющим, пригласите их обоих к себе в гости на обед. Не забудьте позвать мистера Честнягу. После обеда вы обсудите ваши совместные действия в будущей предвыборной кампании. Не предлагайте им никаких сделок, и не подразумевайте, что они поддержат вас в обмен на что-то. Принимайте как должное то, что ваш бывший соперник по праймериз и его управляющий поддержат на выборах весь список партийных кандидатов, включая, естественно, и мистера Честнягу. Который, кстати, предложит Надежде быть председателем окружного комитета партийной кампании, пояснив при этом, что его работа на этом посту будет настолько интенсивной, насколько он сам того захочет. Ведь, по сути, этот пост – исключительно номинальный, поскольку, исполнительным директором комитета, и фактическим управляющим его работой будете вы сами. Кроме того, вы продолжите работать управляющим предвыборной кампанией мистера Честняги, а, являясь одновременно и председателем партийной делегации от вашего округа, будете отвечать за всю партийную деятельность в округе. Но Джеку Надежде вы всего этого не говорите. Вы всего лишь ему предлагаете, в обмен на его номинальную поддержку, занять номинальный пост самого высшего уровня в вашем округе. Его управляющему вы предлагаете пост вице-председателя того же окружного комитета и членство в исполнительном совете вашей предвыборной кампании. Они могут согласиться, энергично взяться за работу, и принести вам большую пользу, а могут, скептически хмыкнув, вежливо удалиться, чтобы «обдумать предложение». Или в обмен на свою поддержку прямо потребовать денег или гарантий назначения на правительственный пост, или и того и другого. У них могли остаться долги от только что прошедшей кампании, которые надо заплатить. Или же они просто хотят, работая на вашу кампанию, заработать много денег.


Бывший ваш соперник может пожелать иметь возможность распределять значительную долю правительственных постов, или же захотеть, чтобы вы помогли ему выполнить обещание, данное своему управляющему, пристроив того на секретарский пост в Конгрессе, если Честняга выиграет выборы. По каким-то загадочным причинам многие проигравшие выборы кандидаты, судя по всему, считают, что их более успешные соперники просто обязаны помочь им расплатиться с долгами, оставшимися от кампании и посодействовать им в выполнении их обещаний, данных в ходе кампании. Это что-то вроде шантажа, не поддавайтесь на него.
В этом случае ваш кандидат должен объяснить им, что не может обещать посты в правительстве каждому, кто их потребует, и что постоянно отказывает в таких обещаниях даже своим собственным соратникам. И назначениями на посты он будет заниматься только после выборов, если, конечно, их выиграет. Что же касается финансовой помощи, то денег у него просто нет.


Услышав все это, ваши бывшие соперники могут неуклюже пойти на попятную, особенно, если у них нет другого выбора, и предпочтя сохранить за собой достаточно высокое положение в партийной иерархии. Или же, они могут отвергнуть ваше предложение и гордо уйти. Не вините их, они поступили так не из-за своей испорченности. Ваш отказ заплатить по долгам, cделанными ими в попытках победить вас на праймериз, по каким-то причинам, для них может выглядеть чудовищно несправедливым по отношению к ним поступком.


В таком случае привлеките себе на помощь тяжелую артиллерию. Пусть кто-нибудь из Больших Шишек вашей партии, желательно из окружения партийного кандидата в губернаторы, свяжется с Джеком Надеждой, и вежливо, но твердо объяснит ему, что если тот хочет сохранить в партии какой-то политический вес, то лучше ему вести себя корректно – предоставить свое имя в поддержку политической кампании Честняги, призвать своих сторонников поддержать победившего кандидата, и поучаствовать, как минимум, в одном-двух публичных митингах за кандидатов из партийного списка, включая и мистера Честнягу. Возможно, после этого вы получите поддержку своего бывшего соперника. Только ни в коем случае не покупайте эту поддержку: она того не стоит.


Занимаясь всем этим, одновременно проследите, чтобы каждый из тех, кто участвовал в вашей кампании, получил от вас личное письмо с благодарностью за поддержку. Письма можете отпечатать на автомате Гувена, Пусть те, кто непосредственно обходил избирателей, получат письма, отличающиеся от типового текста: постарайтесь в них выразить особенно глубокую вашу признательность. Пусть текст письма одновременно содержит и призыв агитаторам к новой битве – финальной кампании. Кроме того, на ближайшей встрече Клуба Агитаторов устройте для них церемонию чествования: поблагодарите каждого персонально, подчеркнув тот исключительный вклад, который он внес в победу на праймериз.


Начните проводите партийные званые завтраки, о которых я писал выше. В будущем, работа по сплочению партийных рядов окупится сторицей. На званые завтраки приглашайте всех, кого сможете. Ведь в дополнение к группе сторонников мистера Надежды, в округе есть не менее двадцати других партийных фракций – по одной на каждого кандидата на каждый выборный пост. И вам понадобится поддержка их всех. Так что пригласите на завтрак каждого из проигравших праймериз кандидатов персонально по телефону, в дополнение к традиционному приглашению, высланному по почте. Партийные завтраки помогут вам уладить множество разногласий, примирить между собой множество партийных лидеров. И это будет намного легче, чем привлечь на свою сторону Джека Надежду, потому что здесь вы выступаете как посредник в урегулировании интересов многих групп. Главное же, для чего вы все это делаете – это создание единого предвыборного комитета для кандидатов партийного списка. Это лучший способ обеспечить для вашего кандидата победу на выборах. Свои планы вы превращаете в поступки окружающих людей, помогая им «сохранить лицо» и упрочить свой авторитет в партии, благородно выступая публично в поддержку своих бывших соперников по праймериз – кандидатов из партийного списка. С помпой и фанфарами раздавайте номинальные посты в комитете предвыборной кампании каждому из членов партии, который их попросит (количество комбинаций из таких слов, как «вице», «председатель», «директор», «секретарь», «координатор» и «комитет» – поистине неисчерпаемо).
Из привлеченных вами членов других партийных фракций, наберите в свой Клуб Агитаторов новых сотрудников, пусть даже лишь на время кампании. Можете даже временно переименовать ваш клуб, если это поможет заполучить в него новых членов. Для финальной кампании вам понадобится в четыре раза больше агитаторов, чем наибольшее количество ваших агитаторов во время праймериз.


Вновь встает вопрос о деньгах для фонда кампании. Теперь собрать их будет легче, но зато и понадобится их больше. Лучше всего вы сделаете, если сбор денег в фонд кампании кандидатов партийного списка переложите на управляющего кампанией кандидата в губернаторы от партии, распоряжаясь при этом ресурсами на свою кампанию самостоятельно. И обязательно настаивайте на том, чтобы национальный партийный комитет сделал взнос в фонд вашей избирательной кампании, предварительно позаботившись, о том, чтобы какой-нибудь умник–коммерсант от политики через свои налаженные связи в национальном комитете не перехватил у вас эти деньги. Некоторые партийные комитеты штатов и областей, судя по всему, уверены, что партийные кандидаты – это их дойные коровы, с которых они могут собирать деньги в обмен на свою поддержку. Это совершенно неверное представление: комитеты должны сами собирать деньги и пускать их на поддержку кандидатов. Так что если партийная организация выступит с подобным предложением, не платите им за поддержку: она не стоит потраченных денег.
Зато от правильных партийных комитетов вы сможете получить и деньги в фонд кампании и активную помощь. В том числе – бесплатную, или частично бесплатную печать ваших агитационных материалов. Поэтому, ваши расходы на печать в этой кампании будут ниже, чем в предыдущей – вы сможете пользоваться типовой печатной агитацией, предоставляемой партией всем партийным кандидатам из списка. Но вы можете напечатать и свои собственные материалы, где имя вашего кандидата будет выделено в партийном списке крупным шрифтом или расположением.


Я не буду описывать во всех подробностях финальную предвыборную кампанию, она во многом похожа на праймериз – за исключением того, что борьба в ней – напряженнее, численные показатели – выше, эмоции — сильнее, денежные траты – больше, а ваше положение в этой борьбе по сравнению с соперниками – более невыгодно, так как вы боретесь, в том числе, и с предыдущим обладателем выборного поста, пока находящимся у власти – с достопочтенным мистером Стулером, у которого больше влиятельных друзей, чем у вас. С другой стороны, за время правления Стулер допустил кое-какие ошибки, и нажил какое-то количество врагов, что дает преимущество уже вам. Но все же, нахождение претендента на пост у власти, обычно рассматривается как неоспоримое преимущество, вам необходимо учитывать это преимущество в своих планах. Если же Стулер является марионеткой мощной и сплоченной находящейся у власти политической мафии, то вам не только нужно работать очень усердно над своей кампанией, нужно и быть готовым к грязным политическим трюкам и приемам, самый вероятные из которых в такой ситуации – это махинации с подсчетом голосов в ночь выборов. Поэтому, прикиньте, на каких избирательных участках могут возникнуть проблемы такого рода, и пошлите туда наблюдателем самую миниатюрную женщину из числа ваших волонтеров: такой наблюдатель будет в полной безопасности, в то время, как посланный вами наблюдатель-мужчина может вернуться, например, со сломанной рукой. Больше, чем в праймериз вам будут докучать и другие персонажи: Влиятельные Фигуры, торговцы «карманными голосами», путающиеся под ногами праздные бездельники, и искатели правительственных постов – в общем, все те, кто усложняет политическую работу, не принося при этом дополнительных избирательных голосов.


Но даже в самом эпицентре всей этой сутолоки и сумятицы, не забывайте о том, самом главном, для чего вы занимаетесь всем этим – избирательных голосах, которые, по-прежнему находятся там, где живут избиратели, то есть, на избирательных участках. И что бы вам ни советовали Важные Персоны из центрального офиса партии, посещение избирателей – по-прежнему единственный способ собрать те самые голоса, в которых вы так нуждаетесь.
Следуйте своему заведенному в прошлую кампанию обычаю посвящать обходу избирателей два дня в неделю, каждый раз по полдня. Назначьте вашему кандидату очередные 500 часов обхода избирателей, составив его расписание так, чтобы он успевал заниматься и остальными делами.


Как и в прошлый раз, стройте свою кампанию вокруг деятельности своих агитаторов, которые, вплоть до дня выборов, не должны заниматься чем-то иным, кроме обхода избирателей.
Так же, как и в прошлый раз, игнорируйте оппозицию.
Единственные отличия финальной кампании от праймериз таковы:
а) В целом, в своей кампании вы агитируете за весь партийный список, выделяя своего кандидата более частым его упоминанием в агитации за партийный список и партийную программу.
б) Как и раньше, вы обходите избирателей, согласно своим спискам, игнорируя, однако, избирателей, проголосовавших на праймериз. Потому что на них можно положиться – за исключением тех, кого надо персонально отвезти на выборы (а вы сделаете это и на этот раз). Эти избиратели сами придут на выборы и проголосуют за кандидатов из партийного списка. Вместо них обходите тех избирателей вашей партии, которые не голосовали на праймериз, сторонников второстепенных партий, а также не определившихся, игнорируя избирателей соперничающей партии. Вам и так надо будет обойти примерно 40 000 человек, на что у вас не хватит ни людей, ни времени. Поэтому, направьте ваши усилия на то, чтобы получить как можно больше голосов избирателей вашей партии, и, в первую очередь, – голосов «спящих» избирателей.
в) Чтобы осуществить вышесказанное, вам надо будет поработать еще больше, чем раньше над организацией ваших действий в день выборов. Если партийные комитеты области или штата смогут предоставить вам дополнительных сотрудников, они будут вам очень полезны, поскольку для работы им не понадобится вникать в местную ситуацию, достаточно будет только подготовленного вами списка избирателей, имея который они смогут обходить избирателей, помогать вам в день выборов, и быть вашими наблюдателями на участках.


Ну вот и все


По мере приближения вашей предвыборной кампании к финишной прямой, на вас будет оказываться сильное давление в попытке заставить вас отказаться от победы на выборах. И один из источников этого давления, может оказаться совершенно неожиданным – вам вдруг позвонит заслуженный член партии, с самого начала кампании входящий в номинальный предвыборный штаб вашего кандидата, много хорошего сделавший для кампании, и неявно, но доходчиво, намекнет, что вам нужно прекратить предвыборную борьбу и позволить выиграть вашему сопернику мистеру Стулеру. Он скажет вам, что вы провели хорошую схватку, но у вашего кандидата нет шансов выиграть выборы. Что мистер Честняга не совсем готов к работе на этом посту, и созреет для этого лишь через два-четыре года, но уж точно не в этом году. Кроме того, он случайно узнал, что на следующих выборах мистер Стулер собирается баллотироваться в Сенат, и поддержит тогда мистера Честнягу всем своим авторитетом, если тот пойдет ему навстречу, и откажется от борьбы на этих выборах. Так почему бы ему не уступить, ведь это отличный задел на будущее? Для этого вам даже не надо будет прекращать поддержку других кандидатов из партийного списка, просто убедите мистера Честнягу не тратить время, силы и деньги на заведомо проигрышное дело, и ненадолго «заболеть», выйдя из предвыборной борьбы. Что же касается вас, то какой правительственный пост вы бы хотели занять? Возможно, это можно будет устроить!
Здесь у вас появляется редкая в вашей политической карьере возможность, не сдерживаться, и сказать своему собеседнику все, что вы думаете о нем и о его предложении. Но пользы делу это не принесет. Так что просто пошлите его далеко и надолго. Не созывайте по этому поводу экстренных заседаний комитета, просто проследите за тем, чтобы позвонившего вам деятеля никогда больше не было ни на каких мероприятиях, касающихся вашей кампании – если конечно вы в силах это обеспечить. Этот человек – троянский конь в вашем лагере.
Не теряйте из-за этого прискорбного события веру в человечество! Эти жулики не пытались бы вас подкупить, если бы не были напуганы, видя, как ширятся ряды ваших сторонников – искренних и честных людей, всецело подтверждающих вашу веру в добропорядочность обычного гражданина. Ведя кампанию своими методами и продвигая свои политические взгляды, вы на практике доказали свою правоту. И ваши соперники это поняли.


А по прошествии еще некоторого времени, вы снова будете сидеть за столом на послевыборной вечеринке. Снова будет надрываться радио, беспрерывно трезвонить телефон, а вы – будете пытаться прожевать свой сэндвич, слушая новости, и одновременно думая, как наскрести денег на отправку восьми-девяти сотен писем, которыми ваш кандидат должен будет поблагодарить своих агитаторов в течение следующих двух недель.
Первые подсчеты голосов обнадеживают: Честняга даже выходит вперед, хотя и ненамного. Но нельзя сбрасывать со счетов Стулера, чья кампания ведется профессиональными и опытными сотрудниками. Вы решаете до следующей недели забыть о предстоящих почтовых расходах: деньги на это найдутся, раз до сих пор всегда находились. Сейчас есть заботы и поважнее: результатов подсчета голосов на выборах в конгресс не сообщают уже целый час – вы начинаете нервничать. Радиоведущий тем временем представляет кандидатов и всяких знаменитостей – и почему эти субъекты всегда такие напыщенные?


Наконец, начинают сообщать результаты голосования: 9-й округ, 10-й, 11-й, 12-й. Тут ведущий замолкает. Что на него нашло?


«Дорогие радиослушатели, после небольшой паузы нам сообщат новые результаты подсчета голосов, а пока – небольшая новость: новые результаты показывают, что в Тридесятом округе, неожиданно для всех, Джонатан Честняга по числу голосов обходит прежнего заслуженного депутата от этого округа – конгрессмена Стулера, предварительные результаты показывают, что…» Вы не дослушиваете… Вы добились избрания своего конгрессмена! Это значит, что завтра вы не сможете уехать отдохнуть. И течение нескольких следующих недель – тоже. Кроме рассылки благодарственных писем, вам нужно будет проводить заседания клуба агитаторов, устраивать еженедельные партийные завтраки, участвовать в заседаниях партийных комитетов штата и области. Мистер Честняга захочет обсудить с вами кандидатуры для назначения на посты своих секретарей. Вы же для себя решили, что не собираетесь ехать с ним в Вашингтон, и не будете даже его секретарем в округе. Потому что не хотите быть наемным сотрудником, и хотите остаться независимым в своих суждениях. Именно поэтому, у вас есть право принимать, или отвергать предлагаемые Честнягой кандидатуры, как сейчас, так и во время его работы в Конгрессе. К тому же, у вас есть собственные планы – связать клуб агитаторов напрямую с политической столицей страны, путем получения от Честняги еженедельных сводок новостей о ситуации в столичных органах власти, регулярных докладов о событиях в правительстве, о смысле этих событий, и проведении голосований. Вы же, в свою очередь, будете сообщать в столицу об одобрении или неодобрении клубом всех этих событий, чтобы Честняга и два сенатора от вашего округа учитывали ваше мнение в своей работе.


Когда вы, почти полтора года спустя после описанных событий, сидя у себя дома, будете листать очередной номер Вестника Конгресса – одно из немногих оставшихся у вас материальных свидетельств двух проведенных вами кампаний, вы наткнетесь на список членов Конгресса, проголосовавших за принятие интересующего вас закона. Вы считаете, что это – хороший, и нужный для всей страны закон. И у вас в руках – отчет об окончательном голосовании по нему, после которого закон уйдет на подпись президенту. Вы с радостью заметите, что Честняга проголосовал именно так, как вы желали: еще до рассмотрения закона он сообщил вам, что будет голосовать за этот закон. И теперь закон принят – хотя и со скрипом, с перевесом всего в один голос. Только теперь вы понимаете всю важность проведенной вами кампании. Потому что без того самого единственного, решающего, голоса вашего конгрессмена, этот закон не был бы принят, а мистер Стулер заведомо проголосовал бы против него.


Всего один голос – ваш голос!


Вы, своими собственными мыслями, речами, и поступками, добились принятия хорошего закона, которым отныне будут руководствоваться все 140 000 000 американских граждан – вы сделали это своими собственными руками, и руками волонтеров, тех, кто вам доверял и помогал.


И это – очень приятное чувство!


-> Часть 1, где есть ссылки на все остальные части

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332818/


Метки:  

[Перевод] Привилегированные порты — причина глобального потепления

Вторник, 11 Июля 2017 г. 23:27 + в цитатник
Мне 37 лет, что по программистским меркам равняется 99 годам. Я достаточно стар, чтобы помнить первые дни публичного Интернета и первых интернет-провайдеров. Впервые я вышел в онлайн через провайдера, который назывался Internet Access Cincinnati (IAC). Он предоставлял доступ по диалапу к серверу Sun SparcStation 10, где пользователи могли запускать почтенные в своей древности терминальные приложения вроде elm (почтовый клиент), emacs, lynx (текстовый веб-браузер), и конечно IRC.

Позже добавили возможность звонить на терминальный сервер CSLIP (предшественник PPP) и подключаться напрямую к Интернету с собственного компьютера под Linux или Windows (при наличии Trumpet WinSock) с настоящим IP-адресом.

Но вернёмся к той SparcStation. Машина была оборудована двумя CPU, которые работали на чудовищной частоте 33 Мгц, и она могла вместить аж 512 МБ памяти, хотя я сомневаюсь, что слоты там были забиты по максимуму. Оперативная память очень дорого стоила в те времена. Сервер с такими скромными ресурсами обслуживал 50-100 активных пользователей одновременно, обрабатывал почту для десятков тысяч, держал IRC-чат, поддерживал ранний HTTP 1.0 через NCSA HTTPd и добровольно выполнял роль FTP-зеркала для Slackware Linux. В целом он неплохо справлялся с нагрузкой и часто показывал аптайм 1-2 месяца.

Уверен, вы предчувствуете напыщенную речь о том, как в наше время распухли программы. Если так, то вы правы. Но отличие этой речи от других подобных в том, что она выдвигает логическую гипотезу, которая может объяснить главные причины такого разбухания. На мой взгляд, это последствия того, что очень простые варианты дизайна прошлого пошли не по той дороге.

Я вспомнил SparcStation, потому что хотел бы начать с очень глупого вопроса: зачем нам виртуализация? Или контейнеры? Как мы пришли к этому взрыву сложности вложений ОС->VM->контейнеры->… вместо простоты многопользовательских операционных систем?

Виртуализация обходится дорого


Мой стартап ZeroTier (прошу прощения за рекламу) работает на облачной инфраструктуре, разбросанной по многим дата-центрам, провайдерам и континентам. Большинство узлов, которые составляют облачное присутствие, выступают стабильными опорными точками в Интернете и последними ретрансляторами. Они принимают и отправляют пакеты. Им нужна полоса и немного CPU, но очень мало памяти или места на диске. Взять к примеру один из резервных ретрансляторов TCP (TCP fallback relay): он обычно передаёт 5-10 Мбит/с трафика, но программному обеспечению требуется лишь 10 МБ памяти и менее одного мегабайта (!!!) места на диске. Он также использует менее 1% ресурсов CPU.

Однако его виртуальная машина занимает 8 ГБ места на диске и по крайней мере 768 МБ памяти. Всё это нужно для хранения полной базовой инсталляции CentOS Linux, полного комплекта стандартных приложений и инструментов, системных сервисов вроде systemd и cron, а также сервера OpenSSH для удалённого доступа. Большое потребление RAM — прямое следствие виртуализации, эдакого «хака, чтобы обмануть ядро, будто оно работает на собственном оборудовании». Вся эта память должна быть доступна VM, потому что ядра как будто работают на отдельных машинах со своей локальной памятью, так что гипервизор вынужден подчиниться. (Современные гипервизоры могут в некоторой степени резервировать память про запас, но излишнее резервирование повышает риск ухудшения производительности при резком повышении нагрузки).

Контейнеры немного более эффективны, чем гипервизоры. Они не задействуют собственное ядро Linux и не тратят лишнюю память на гипервизор, но по-прежнему несут в себе по крайней мере часть всего дистрибутива Linux всего лишь для выполнения одной или нескольких программ. Контейнер для запуска 10-мегабайтной программки может весить несколько гигабайт, а для управления контейнерами нужен свой собственный пухлый набор приложений.

Спросите кого угодно, зачем нам всё это нужно. Он скажет о безопасности, изоляции и масштабируемости — и будет прав.

В старые времена, до виртуализации и контейнеров, компаниям вроде ZeroTier приходилось размещать собственное оборудование в дата-центрах. Это неудобно и не очень выгодно. Виртуализация позволяет обслуживать сотни пользователей с одного очень мощного сервера (моя виртуальная машина на 768 МБ, вероятно, крутится на 16-24-ядерном монстре Xeon с 256+ ГБ памяти).

Сотни пользователей — это же как… хм… та старая SparcStation на 33 МГц...?

Сегодняшний софт на порядки более громоздкий и сложный, чем программы, которые работали на старом сервере IAC, и хотя отчасти это стало результатом увеличения уровней абстракций и ненужного распухания, но при этом нельзя не отметить реальное увеличение функциональности и гигантский рост обрабатываемых данных. Я не говорю, что мы должны впихнуть нагрузку от сотни типичных современных пользователей в кофеварку. Но я считаю, что мы должны иметь возможность вместить хотя бы несколько сайтов Wordpress (это типичный пример задачи, которую принято размещать в виртуальной машине) на Raspberry Pi — на компьютере, который примерно в 100 раз превосходит старый сервер по мощности CPU, в несколько раз по RAM и в 10-20 раз по объёму постоянной памяти.

RPi стоит $30 и потребляет менее 15 Вт. Нужно ли говорить, сколько стоит одна монструозная VM и сколько она потребляет?

Время для Pi!


Проделаем маленький мысленный эксперимент, где попытаемся установить RPi в качестве терминального сервера для группы пользователей, которые хотят вести блоги Wordpress. Веб-сервер и небольшая база данных вместе займут примерно 10-20 МБ памяти, а у нашего RPi — 1024 МБ, так что он сможет хостить по крайней мере 50 сайтов маленького или среднего размера. (В реальности большая часть RAM избыточна или неактивна, так что со свопом или KSM наш RPi захостит несколько сотен сайтов, но будем консервативными).

Сначала установим Linux. Это наследник Unix, многопользовательская операционная система (верно?), так что создадим 50 аккаунтов. Каждый из этих пользователей теперь может залогиниться. Входящая сессия SSH и шелл занимают всего один-два мегабайта в памяти, а у нашего RPi больше тысячи, так что на данный момент всё должно идти гладко.

Да, да, пока что игнорируем безопасность. Позже займёмся этим вопросом. Но если никто из наших пользователей не будет плохо себя вести, то все они сейчас скачивают и распаковывают Wordpress. Всё хорошо. Проблемы начнутся, когда они приступят к установке.

Шаг первый: установить базу данных MySQL.

А, так это просто! Набираем "sudo apt-get install..."

Погодите… sudo? Предоставление прав sudo означает, что вы с тем же успехом могли и не заводить отдельные аккаунты для пользователей.

Оказывается, что вы можете установить MySQL в собственную домашнюю директорию. Если хотите скомпилировать его или вручную распаковать пакет Debian и отредактировать какие-то конфигурационные файлы, то можете сделать это без специальных привилегий. Ему нужно будет использовать папки /home/yourname/… но в итоге вы получите собственный локальный сервер MySQL, работающий в вашем собственном локальном пространстве пользователя.

Шаг второй: сконфигурировать веб-сервер для работы PHP.

Не будем ворчать… снова используем "sudo apt-get install", чтобы загрузить все необходимые компоненты, собрать их вместе и запустить. Оказывается, это тоже можно сделать, и после бритья быка [бесполезные на первый взгляд действия, которые на самом деле необходимы: например, мы решаем проблему, которая решает другую проблему, которая через несколько уровней рекурсии решает реальную проблему, над которой мы работаем, слэнг Массачусетского технологического института — прим.пер.] наш собственный веб-сервер с PHP готов к работе.

Затем вы сталкиваетесь с чем-то вроде "bind: permission denied". Хм? Немного покопавшись, вы находите, что порт 80, то есть веб-порт по умолчанию, является привилегированным портом. Вам нужны права рута, чтобы привязаться к нему.

Неважно. Просто изменим порт. Но этой значит, что теперь всем придётся вводить URL вашего сайта с дурацким :### на конце хоста, чтобы подключиться к нестандартному порту.

Яйца!


Сейчас вы осознали, что без ограничения на привилегированные порты всё значимое в системе Unix не следовало оставлять под рутом и тогда вы могли по крайней мере обеспечить лучшую безопасность системных сервисов. Но не поэтому я назвал этот раздел «яйца». Я назвал его так, потому что для понимания более широких последствий ограничения на привилегированные порты нужно отвлечься на минуту и поговорить о яйцах.

Яички — это жизненно важный орган. Размещение их в маленьком мешочке за пределами мужского тела было глупо, не говоря уже о странном внешнем виде. Самки нашего вида сконструированы более логично: их яичники спрятаны глубоко внутри живота, где они гораздо лучше защищены от ударов, пинков, мечей, заборов и старых тёток.

Зависимость от первоначально выбранного пути — концепция из экономической теории и эволюционной биологии — пытается объяснить, откуда берутся такие причудливые конструкции. Суть в том, что решения, принятые в прошлом, ограничивают в принятии решений, которые легко могли бы быть приняты в настоящем.

Мужские яички находятся за пределами тела, потому что определённые ферменты в мужской сперме лучше функционируют при температуре чуть ниже температуры тела. Это «решение» было принято очень давно, вероятно (если верить самой простой и поэтому наиболее вероятной гипотезе), когда мы либо не были теплокровными, либо имели меньшую температуру тела. Репродуктивные органы — это то, что биологи называют крайне консервативной системой, то есть они не склонны часто изменяться, потому что любые мутации репродуктивной системы с большой вероятностью вычеркнут особь из генетического пула. В результате, «легче» (в смысле пересечения эволюционного графа вероятностей) поместить мужские яички в пикантного вида мешочек между ног, чем вернуться назад и эффективно переработать сперму для работы при более высокой температуре.

Даже если бы мутации для функционирования спермы при более высокой температуре были настолько же вероятны, как те мутации, которые привели к появлению сленгового слова «зависать», не факт, что это бы произошло. Может быть, эти конкретные мутации не произошли бы из-за случайности, не оставив эволюционной системе самообучения никаких вариантов, кроме… э-э-э… неудачного. Ладно-ладно, я закончил.

Технологическую эволюцию движут разумные (по крайней мере, так мы считаем) агенты, но во многих отношениях она похожа на биологическую эволюцию. Как только принято решение, устанавливается путь для будущих решений и система с большей вероятностью движется по проторенной дороге. Иногда изменение старого решения обходится дороже, чем смириться с ним, а иногда это простая инерция.

Возьмите эти странные круглые 12-вольтовые штекеры в автомобилях. Изначально они предназначались для прикуривателей сигарет. Когда стали популярными различные портативные электронные устройства, инженеры задумались, как подключить их к автомобилю. Договориться с автопроизводителями на установку розетки не удалось, так же как уговорить пользователей установить розетки самостоятельно механическим способом, но поскольку во всех автомобилях есть прикуриватели… ну тогда… ответ очевиден. Сделаем розетку, которая помещается в разъём прикуривателя. Теперь автомобили часто даже не выпускают с прикуривателями, но в них есть эта розетка в разъёме прикуривателя, потому что куда же человеку подключить свой смартфон?

(USB постепенно заменяет прикуриватели, но в большинстве машин они по-прежнему установлены).

Не выбранный путь


К этому моменту вы должны были понять, к чему мы ведём. Unix изначально был разработан как многопользовательская система с разделением времени, и с этой целью добавлялись многие функции, чтобы ресурсы системы можно было использовать совместно. Там есть система разрешений для доступа к файлам с пользователями и группами, а на новых системах досконально отрегулированные списки контроля доступа. Там есть квоты на каждого пользователя по памяти, диску и использованию CPU, чтобы какой-то один пользователь не захватил все ресурсы системы. Там есть изоляция процессов, защита памяти и так далее. Но по какой-то причине никто даже не подумал адаптировать её сетевой слой для мультиаренды (мультитенантности) сетевых сервисов. Может быть, в то время привилегированные порты по-прежнему имели смысл и были уместны. Или просто никто не подумал об этом.

Привилегированные порты изначально были функцией безопасности. В те времена все компьютеры принадлежали организациям и управлялись штатными системными администраторами, а сети были закрыты для посторонних устройств (если такие устройства вообще существовали). Список портов, к которым имеет доступ только рут, позволял любому системному сервису знать, что какое-то входящее соединение инициировано программой с разрешения системного администратора.

В начале 90-х, когда Интернет начал становиться публичной сетью, многие системы и сети по-прежнему работали таким образом и полагались на привилегированные порты как на критический механизм аутентификации. Так что когда начали распространяться веб-сайты и каждый захотел иметь собственные веб-серверы на собственных IP-адресах, показалось более концептуально очевидным и менее хлопотным реализовать виртуализацию операционных систем и оставить остальную часть стека в неприкосновенности.

Виртуализация ОС полезна для других целей: для тестирования и отладки кода, для поддержки древнего ПО, которое должно работать на старых (или иных) операционных системах или версиях ядра, и это подливает масла в огонь. В конце концов, вместо адаптации сетевого стека Unix к нуждам мультиаренды мы просто закинули коробки внутрь коробок и пошли дальше.

Всё это сделано за счёт лишнего расхода железа и энергии. Рискну предположить, что тот же 16-24-ядерный Xeon с примерно 256 ГБ RAM, на котором размещается, наверное, меньше сотни 768-мегабайтных VM, мог бы хостить тысячи задач пользователей, если бы они работали напрямую на том же ядре, а не были обвешаны гипервизорами и пухлыми контейнерами. Насколько меньше CO2 попадёт в атмосферу, если каждый дата-центр уменьшить в десять раз?

Контейнеры вроде Docker частично решают проблему. Вы можете сказать, что контейнеризация — это именно та мультиарендность, к которой я стремлюсь, разве что она частично придерживается наследия виртуализации, воспринимая системные образы как гигантские статично связанные бинарники. Это также шаг назад в удобстве пользования. Мне по-прежнему нужны рутовые права, чтобы запустить контейнер. Я не могу (легко) залогиниться в один контейнер и запустить другой, как я делаю с процессами на простой мультиарендной машине Unix. Вместо этого приходится выстраивать массивные консоли центрального управления и инструменты «оркестровки».

Так что можно сделать? Как мог выглядеть путь, по которому мы не пошли?

Мультиарендная работа в сети


В некоторых случаях зависимость от выбранного пути проявляет себя, потому что так много новых решений принято на основе старых, что выходит слишком дорого вернуться и изменить старое решение. Мне кажется, что в этом случае несколько простых изменений могли бы перемотать 20 лет истории DevOps и направить нас по другому пути — к гораздо более простой и кардинально более эффективной архитектуре. Это не решит всех проблем, но устранит некоторую сложность в большинстве типичных сценариев.

Шаг первый: убрать привилегированные порты. Думаю, это изменение на 1-2 строчки. Вероятно, достаточно просто удалить оператор if. Сломается всё, что полагалось на не-криптографическую защиту вроде номера порта для безопасности, поскольку такие вещи легко подделать.

Шаг второй: расширить пользовательские и групповые разрешения, а также права владения на сетевые ресурсы, введя маски разрешений UID/GID на чтение/запись/привязку (привязка вместо выполнения) для устройств и IP-адресов. По умолчанию вызов bind() не указывает, что адрес (0.0.0.0 или ::0) будет прослушивать пакеты или соединения на всех интерфейсах, для которых текущий пользователь имеет соответствующее разрешение на привязку, а исходящие соединения по умолчанию будут направляться на первый интерфейс, принадлежащий пользователю.

Шаг третий: вероятно, хорошей идеей будет разрешить в пространстве пользователя создание виртуальных сетевых устройств (tun/tap) по той же причине, по которой пользователи могут создавать свои процессы и файлы. Это не критично, но было бы хорошо. Разрешения для программ вроде tcpdump/pcap тоже придётся изменить в соответствии с новой моделью разрешений для сетевых ресурсов.

Теперь любой сервис можно запустить под обычным пользователем. Рутовый доступ нужен только для обновлений ядра системы, изменений аппаратного обеспечения или драйверов, а также для управления пользователями.

Не выбранная дорога уже заросла


Поскольку мы выбрали путь виртуализации и контейнеризации, то позволили атрофироваться способностям к многоарендности в Unix. Понадобиться некоторая работа, чтобы вернуть их в форму. Но мне кажется, что это может стоить того — ради простоты и для устранения излишнего потребления ресурсов.

Нам нужно вернуться назад и усилить защиту режима пользователя. Не думаю, что это слишком тяжело. Виртуализация не обеспечивает такую защиту, как многие думают, и атаки вроде Rowhammer доказали, что VM — не панацея. Мы потратили невероятное количество человеко-часов на разработку крепкой и безопасной виртуализации и на разработку цепочки инструментов для этого, не говоря уже о том, сколько потрачено на создание экосистемы контейнеров. Думаю, что части этих усилий было бы достаточно, чтобы защитить user-space на минимальном хосте Linux от атак с повышением привилегий и утечек.

Нам нужно подтянуть другие аспекты изоляции и внедрить опции для ограничения того, что пользователь может видеть с помощью команд вроде ps и netstat — информацию следует ограничить только ресурсами пользователя. Нужно изменить пакетные менеджеры, чтобы разрешить установку пакетов в поддиректорию домашней директории пользователя, если он не рут, и т. д. Вероятно, изменения также потребуются для системных элементов вроде динамического компоновщика, чтобы пользовательским бинарникам было проще делать выбор в пользу общих библиотек в своей собственной локальной области, а не в пользу системных библиотек, если таковые имеются. Было бы хорошо, если бы системные сервисы init поддерживали и сконфигурированные пользователем сервисы, чтобы пользователям не приходилось мастерить скрипты watcher и задания cron, а также прибегать к другим хакам.

Конечный результат будет немного похож на контейнеризацию, но без неуклюжести, раздутости, изобретения велосипеда и неудобства. Вы можете развёртывать приложения в git, запускать git checkout и git pull по ssh, а оркестровка будет выполняться либо локально, либо на манер P2P, и вы сможете просто залогиниться на машину и запустить что-то, без необходимости продираться через сложную инфраструктуру управления контейнерами. Приложения станут легче, потому что большинству программ достаточно общих стандартных библиотек (libc, stdc++ и др.) и стандартных инструментов в системе, если нет каких-либо непреодолимых ограничений, вроде проблем с с совместимостью библиотек.

Заключение


Вероятно, всё это дела давно минувших дней. Скорее всего, в реальности будет выбран путь разработки по-настоящему безопасной контейнерной мультиаренды, так что с помощью контейнеров будет решена задача, которую следовало решить расширением модели разрешений Unix на сетевую подсистему в пространстве пользователя.

Цель этой статьи — показать, как маленькие решения, о которых никто не думал, могут повлечь драматические последствия для будущей эволюции технологии (и общества). Решение 1970-х годов использовать номера портов как встроенный сигнальный механизм для проверки безопасности между системами может оказаться ошибкой на триллион долларов, которая направила эволюцию платформы Unix по пути гораздо большей сложности, стоимости и большего потребления ресурсов.

Но погодите, может, не всё ещё решено. Существует более десятка дистрибутивов Linux, и большинство из них работает примерно одинаково. Переход на новую парадигму станет интересным способом выделиться для одного из этих дистрибутивов. Первым делом нужно реализовать сетевые разрешения вроде описанных выше — и предложить патч для ядра. Для обратной совместимости можно сделать так, например, что разрешения активируются через настройку sysctl, или можно выпустить модуль (если модули способны производить такие глубокие изменения).
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332896/


Синхронизация Vivaldi: ответы на вопросы

Вторник, 11 Июля 2017 г. 21:30 + в цитатник
image

Всем привет!

Не так давно один из разработчиков Vivaldi, Джулиен Пикалауса, провёл сеанс «живого программирования» с пользователями браузера. В процессе пятичасового диалога с пользователями Джулиен ответил на массу вопросов по поводу того, над чем он сейчас работает. А работает он над функцией синхронизации Vivaldi. Ниже вы сможете прочитать его ответы на наиболее популярные вопросы о синхронизации.

Вопрос: Какие данные будут синхронизироваться после первого стабильного релиза данной функции браузера Vivaldi?
Ответ: В данный момент мы планируем в первую очередь синхронизировать такие данные, как закладки, пароли, настройки (пока только относящиеся к Chromium, а не к Vivaldi), данные автозаполнения форм, историю введённых адресов, расширения, заметки и вкладки. Кое-что из этого не будет иметь полной функциональности при первом запуске синхронизации, но мы постараемся максимально быстро довести этот сервис до полной функциональности, а также добавить в синхронизацию и другие данные.

Вопрос: А какие данные вы планируете добавить в синхронизацию после первого запуска?
Ответ: Собственные настройки Vivaldi, включая темы.

Вопрос: А как насчёт собственных закладок в Экспресс-панели и фоновых рисунков?
Ответ: Экспресс-панель — это часть закладок, поэтому есть хороший шанс увидеть синхронизацию этой функции в первом релизе. Но фоновые рисунки — это уже собственные настройки Vivaldi, они будут добавлены позже.

Вопрос: Как работает система синхронизации Vivaldi? Будет ли она брать данные из одной версии браузера и заменять данные в другой версии, или все данные синхронизации будут объединяться со всех копий браузера в одном месте на сервере без удаления данных?
Ответ: Синхронизация Vivaldi использует код встроенной в Chromium синхронизации с некоторыми изменениями и использует тот же самый протокол. Данные для синхронизации сначала шифруются, затем отправляются на удалённый сервер, с которого они могут быть переданы в другие копии браузера Vivaldi этого же пользователя. А уже в клиентском браузере данные будут объединяться с уже существующими.

Вопрос: Совместимы ли системы синхронизации Vivaldi и Chrome? Будет ли возможен импорт данных с серверов Google?
Ответ: Нет, наша версия синхронизации не будет работать с синхронизацией Chrome. Мы разрабатываем собственную серверную часть, авторизация на которой будет осуществляться через портал vivaldi.net.

Вопрос: Понадобится ли создавать новые логин и пароль для использования синхронизации или будет возможно использовать уже существующие?
Ответ: Логин и пароль будут те же самые, что и для входа на vivaldi.net. Если у вас ещё нет учётной записи на vivaldi.net — вам нужно будет её создать.

Вопрос: Будет ли возможно выбрать другой сервер для синхронизации или это будут только серверы Vivaldi?
Ответ: Поначалу это будут только серверы Vivaldi. Все ваши данные будут отправляться в зашифрованном виде, поэтому мы не сможем их читать. В дальнейшем мы планируем дать пользователям возможность использовать их собственные серверы. Но сначала мы хотим убедиться, что синхронизация работает без сбоев и проблем, поэтому точных сроков, когда пользователи смогут использовать собственные серверы, мы пока сказать не можем.

Вопрос: Будет ли ваш серверный код открыт под свободной лицензией?
Ответ: Да, мы планируем, что пользовательская версия серверной части синхронизации будет выпущена под свободной лицензией.

Вопрос: Будут ли открытые вкладки синхронизироваться в режиме реального времени?
Ответ: В общем, да. Может возникать некоторая задержка в зависимости от загруженности сервера.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332892/


Метки:  

[Из песочницы] Запуск Java классов и JAR-ов не по учебнику

Вторник, 11 Июля 2017 г. 19:02 + в цитатник
Меня давно занимала мысль как в Linux-е запускать программы на Java без вспомогательных Bash скриптов. Я не видел приемлемого решения, если не считать способ «bash script payload», когда в конец скрипта помещается бинарный файл.

Но на прошлой неделе случайно наткнулся на модуль ядра binfmt_misc, с помощью которого можно перехватить исполнение файла по его magic number. Для этого через update-binfmts добавляется собственный обработчик для получения имени исполняемого файла и аргументов пользователя.

Первое открытие


Как оказалось в моей Ubuntu 16.04 уже зарегистрирован обработчик для JAR файлов:

update-binfmts --display
...
jar (enabled):
     package = openjdk-8
        type = magic
      offset = 0
       magic = PK\x03\x04
        mask = 
 interpreter = /usr/bin/jexec
    detector = 

Отдав команду chmod +x foo.bar я радостно потирал руки, но реальность оказалось сурова — запуск ./foo.jar выдал следующее:

invalid file (bad magic number): Exec format error

Погуглив, я нашел обросший мхом баг bugs.java.com/bugdatabase/view_bug.do?bug_id=6401361 Как оказывается сборка через Maven не добавляет «0xcafe» в начало JAR файла. Не менее безответственно ведет себя и плагин maven-assembly-plugin. Что не нравится /usr/bin/jexec, зарегистрированному обработчику по умолчанию.

Погуглив еще, я нашел решение проблемы через установку пакета jarwrapper. После установки добавляется новый обработчик /usr/bin/jarwrapper и страховка /usr/bin/jardetector (проверяет по META-INF что это действительно JAR). Но изучив код обработчика мне не понравилась куча лишней работы, которую делает скрипт запуская множество вспомогательных программ.

Поэтому решением стал собственный обработчик:

#!/bin/sh
#/usr/bin/jarinvoke

JAR=$1
shift

exec java -jar $JAR $@

Дальше открываем файл sudo gedit /var/lib/binfmts/jar и регистрируем обработчик заменив строчку с /usr/bin/jexec на /usr/bin/jarinvoke. На самом деле это плохое решение и лучше создать собственную группу (об этом ниже), но для первичного понимания сойдет.

Для вступления изменений в силу может потребоваться выполнить:

sudo update-binfmts --disable jar && sudo update-binfmts --enable jar

После чего можете запускать JAR файлы как любые другие исполняемые файлы.

Исполняемые классы


Теперь можно идти дальше и сделать из Java классов исполняемые файлы, где jarwrapper не сможет помочь. Обработчик будет работать только для классов с пакетом по умолчанию (т.е. классы с отсутствующим package заголовком). Может можно сделать и лучше, но мне хватило такой функциональности для «скриптования» на Java:

#!/bin/sh
# /usr/bin/clsinvoke

CLASS_FILE=$1
shift

ABSOLUTE_PATH=`readlink -f $CLASS_FILE`

CLASS=`basename $ABSOLUTE_PATH`
CLASS=${CLASS%.*}
CLASSPATH=`dirname $ABSOLUTE_PATH`

exec java -cp $CLASSPATH $CLASS $@

После чего регистрируем собственный обработчик (этим же способом можно создать новый обработчик для JAR-ов не редактируя /usr/bin/jexec):

sudo update-binfmts --package clsinvoke --install clsinvoke /usr/bin/clsinvoke --magic '\xca\xfe\xba\xbe'

Тестируем:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World");
    }
}

javac HellWorld.java
chmod +x HelloWorld.class
./HelloWorld.class
Hello, World

Можно пойти и дальше, сделав более сложный обработчик, который по импорту классов будет определять какие библиотеки добавить в CLASSPATH из ~/.m2, но это отдельная история. Сейчас интересен взгляд со стороны, замечания, дополнения, если таковые есть. После чего думаю оформить это в deb пакет и выложить всё на гитхабе.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332890/


Метки:  

Темные моменты SELinux

Вторник, 11 Июля 2017 г. 18:44 + в цитатник

В процессе эксплуатации систем с SELinux я выделил несколько интересных кейсов, решения которых вряд-ли описаны в Интернете. Сегодня я решил поделиться с вами своими наблюдениями в надежде, что число сторонников SELinux еще немного возрастет :)


0. Переустановка policy package


Если вы не знали, то сообщаю: весь SELinux насквозь файловый, и никакой магии там нет. Поэтому можно прям при включенном SELinux переустановить пакет полиси, если что-то пошло не так.
Пример для centos 7 & selinux-policy-minimum


#!/bin/sh
setenforce 0
semanage export > exports.semanage
yum remove -y selinux-policy-minimum
rm -rf /etc/selinux/minimum
yum install -y selinux-policy-minimum
semodule -RB
semanage import -f exports.semanage

1. SELinux в permissive mode, но часть команд не работает


Invalid process context


Причина в том, что некоторые программы пытаются изменить контекст ( по аналогии с setuid/setgid ) перед exec(3), но используют неверный контекст для этого.


Пример: демон crond, который обрабатывает crontab пользователя user, контекст которого неизвестен. В этом случае он execlp(3) вернет ошибку 'Invalid context'.


Решение


  1. Сделать policy reload ( semodule -R )
  2. Посмотреть какой пользователь используется
  3. Посмотреть какой для него selinux-пользователь (semanage login -l)
  4. Убедиться в наличии файла /etc/selinux/$type/contexts/users/$username
  5. Если файла нет — сбросить на дефолт настройки при помощи переустановки policy package.

Invalid file context


Если по каким-то причинам авторелейбл не произошел и файл остался вообще без контекста, либо с мусором вместо контекста, доступ к нему так-же может быть заблокирован из-за того, что open(3) упадет при попытке сравнить контексты.


Решение


  1. Сделать restorecon /path -Rv
  2. Убедиться в правильности контекстов и в том, что загружены все модули
  3. Сделать policy reload ( semodule -R )
  4. Если не помогло — сбросить на дефолт настройки при помощи переустановки policy package.

2. После включения SELinux и перезагрузки все процессы запущены от kernel_t / В логах много ошибок про доступ к kernel_t


Как происходит включение SELinux?


  1. Создание файла /.autorelabel
  2. Перезагрузка, ядро видит этот файл и запускает autorelabeling
  3. Перезагрузка еще раз и запуск ядра с контекстом kernel_t.

Проблемы наступают на этапе два: ядро знает только о контекстах модулей, которые были явно включены до перезагрузки. Например, если не был включен модуль systemd, то:


  • Ядро запущено с контекстом kernel_t
  • Правил перехода контекста от kernel_t к systemd не срабатывают, т.к. relabel не назначил ему контекст init_exec_t, systemd наследует контекст kernel_t
  • Для демонов, которые запускает systemd, тоже не срабатывают правила перехода контекста, поскольку правила написаны для контекста init_t, а не kernel_t. Все демоны запущены от kernel_t.
  • ....
  • FAIL

Решение


  • Перед созданием /.autorelabel вручную включить все нужные модули командой semodule -e $module, или
  • Сделать restorecon -R / после перезагрузки и перезагрузить систему еще раз, или
  • Сделать systemctl daemon-reexec и перезапустить всех демонов вручную, если вторая перезагрузка неприемлима
  • Воспользоваться утилитой offrestorecon* вместо /.autorelabel

3. После обновления policy package ничего не работает, все команды пишут ошибки


Это проблема возникает тогда, когда после обновления не могут быть решены циклические зависимости между модулями или контекстами. Например:


  • В версии 1.0 были сделаны настройки и добавлен модуль local_module
  • local_module проэкспортировал контекст local_module_file_t
  • Этот контекст при помощи semanage был назначен для "/opt/local(/.*)?"

При обновлении до версии 1.1 модуль local_module будет установлен после того, как будут применены настройки контекста для "/opt/local", что может привести к циклической зависимости. На самом деле от одного модуля это бывает редко, а вот когда их 30 и они ссылаются друг на друга и несут часть настроек "снаружи" ( через semanage fcontext или semanage port например ) — вот тогда проблемы почти гарантированы.


Решение


  • Переставить policy package ( см. пункт 0 ), или
  • Выполнить последовательно ДО обновления
    semanage export > outfile
    semanage fcontext -D
    semanage user -D
    semanage port -D
    semanage login -D
    # update your packages 
    semanage import -f outfile

4. Долгая перезагрузка при включении SELinux


Autorelabeling — боль для владельцев больших серверов. Средний сервер с базой данных может перезагружаться 3-4 часа из-за включения SELinux, что абсолютно неприемлемо для бизнеса.


Решение


На самом деле метки на файлах лежат в extended-атрибутах файловой системы, доступ к которым можно получить при помощи команд getfattr(1)/setfattr(1)/attr(1). Атрибут называется security.selinux и содержит контекст в виде строки. При этом даже на выключенном SELinux работает команда matchpathcon из libselinux-utils, которая показывает дефолтный контекст для того или иного пути.


Совмещая оба этих факта, получаем возможность сделать audorelabel прямо во время работы сервера, не тратя на это время при перезагрузке.


Сегодня днем я выложил свой код на github, утилита называется offrestorecon. Не забудьте предварительно включить все нужные модули и удалить файл /.autorelabel!


5. После перезагрузки слетели все настройки переменных


Решение


Используйте ключ -P для setsebool, либо semanage boolean


Вместо послесловия


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

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332886/


Метки:  

Критическая уязвимость механизма аутентификации BIND позволяет похищать и изменять DNS-записи серверов

Вторник, 11 Июля 2017 г. 17:12 + в цитатник


В популярном DNS-сервере BIND обнаружена критическая уязвимость. Ее эксплуатация позволяет злоумышленнику получить корректную подпись для произвольных данных и с помощью этой подписи вносить в него изменения или получать список всех DNS-записей сервера (dns zone transfer attack).

В чем проблема


Уязвимость CVE-2017-3143 обнаружена в реализации протокола аутентификации для BIND DNS под названием TSIG. Также протокол TSIG используется рядом других DNS-сервисов вроде PowerDNS, NSD и Knot DNS.

Исследователи компании Synacktiv обнаружили ошибку в обработке TSIG-записей, позволяющую злоумышленнику, который знает название ключа (key name) преодолевать механизм защиты операций обновления зоны, оповещения и трансфера зон.

Если отправить TSIG-дайджест неправильной длины (больше той, что должна быть при используемом алгоритме хеширования), сервер, вместо пустой подписи, вернет данные из запроса злоумышленника с корректной подписью. В результате атакующий получает возможность получить правильную подпись для произвольных поддельных данных и преодолеть аутентификацию TSIG. Уязвимость может быть использована злоумышленниками для изменения данных или получения доступа к файлу с DNS-зонами.

Согласно RFC 2845, ответный дайджест вычисляется от трех полей из запроса:

  • дайджест (MAC) из запроса вместе с полем длины;
  • записи из запроса (обновления), но без записи TSIG;
  • сама запись TSIG, но без дайджеста.

Таким образом, эксплуатация уязвимости происходит в несколько этапов:

  1. Злоумышленник посылает DNS запрос с обновлением зон и записью SOA, где вместо дайджеста помещает данные RR записей, которые он намерен вставить в базу сервера. Например, запись TXT в одну из подконтрольных серверу зон с текстом “Injected”. Длина такого дайджеста должна быть больше той, которая подразумевается используемым алгоритмом хеширования, например, с длинной больше 32 байт для алгоритма HMAC-SHA256.
  2. Сервер, вместо ответа с пустым полем MAC (дайджест) в записи TSIG, возвращает данные от атакующего, включая запрос с обновлением зон и запись TXT, подписанные секретным ключом сервера.
  3. Используя полученную подпись, злоумышленник посылает тот же запрос с обновлением зон, что и на шаге 1, но дополнительные записи, вместо поля MAC записи TSIG, находятся в секции Zones после записи SOA, а поле MAC теперь содержит корректный дайджест из шага 2. Для эксплуатации, значение поля Time Signed записей TSIG должно быть одинаковым, чтобы при проверке сигнатуры уязвимый сервер использовал одни и те же данные.
  4. Сервер, после успешной проверки присланного запроса, применяет данные к базе, о чем можно узнать из лога:

14-Jun-2017 07:48:55.003 client 172.17.42.1#50445/key tsig_key: updating zone 'example.com/IN': adding an RR at 'i.can.inject.records.in.the.zone.example.com' TXT "injected"

Согласно опубликованной исследователями информации, наличие уязвимости подтверждено для следующих версий BIND:

  • BIND 9.9.10
  • BIND 9.10.5
  • BIND 9.11.1

По данным компании ISC, под лицензией которой распространяется программное обеспечение BIND, также уязвимы версии:

  • с 9.4.0 до 9.8.8
  • с 9.9.0 до 9.9.10­P1
  • с 9.10.0 до 9.10.5­P1
  • с 9.11.0 до 9.11.1­P1
  • с 9.9.3­S1 до 9.9.10­S2
  • с 9.10.5­S1 до 9.10.5­S2

Представители Synaktiv в своем материале также представили код PoC-эксплоита для данной уязвимости.

Как защититься


Специалисты ISC опубликовали патч для устранения описанной ошибки безопасности. Кроме того, эксперты Positive Technologies создали сигнатуру для IDS Suricata, которая позволяет выявлять и предотвращать попытки эксплуатации уязвимости CVE-2017-3143 по сети, в архиве также пример трафика при эксплуатации данной уязвимости:

ISC #BIND #TSIG #Authentication Bypass
CVE-2017-3143
Affected: 9.9 - 9.11#Suricata rules and pcap:https://t.co/guHgAPhsNN https://t.co/LJWhrdKswc

— Attack Detection (@AttackDetection) July 10, 2017

Также для обнаружения уязвимостей специалисты нашей компании рекомендуют использовать специализированные средства вроде системы мониторинга защищенности и соответствия стандартам MaxPatrol 8.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332880/


Метки:  

Вводим рейтинг участника «Хабра» и «Тостера» на «Моём круге»

Вторник, 11 Июля 2017 г. 16:57 + в цитатник
На «Моём круге» появилась возможность демонстрировать свою активность и рейтинг в сообществах «Хабрахабра» и «Тостера». Чуть позже планируем сделать так же для GitHub и, может, для некоторых других сообществ. Считаем, это позволит работодателям и соискателям точнее и быстрее находить друг друга.

На профиле пользователя это выглядит следующим образом:

image

На поиске кандидатов или на откликах к вакансии — так:

image

Такая возможность доступна всем, кто привязал учётную запись TMID к своему аккаунту на «Моём круге». Если вы пока не привязали TMID, сделайте это прямо сейчас в один клик, в кабинете своего профиля на «Моём круге» в «Ключнице»: https://moikrug.ru/preferences/socials

Далее подробно расскажем, по какому принципу мы выводим блоки участия в сообществах, как считаем вклад в каждое из них, за какой вклад даём медали.



Итак, блок участника «Хабрахабра» появляется на профиле пользователя «Моего круга», если у него есть хотя бы одна публикация на «Хабре», а блок участника «Тостера», если хотя бы один ответ на «Тостере».

В каждом блоке участника мы выводим до 10 хабов или тем, в которых пользователь внёс наибольший вклад в соответствующем сообществе. Напомним, вклад в хаб считается как сумма всех «плюсов» и «минусов» у публикаций пользователя, привязанных к данному хабу. А вклад в тему (тег) как сумма всех отметок «нравится» и «решение вопроса» у ответов пользователя, привязанных к данной теме.

Если пользователь со своим вкладом попал в первые 50% пользователей по данному хабу или теме, мы выдаём ему медаль за вклад в этот хаб или тему: золото — если он попал в первые 10%; серебро — если в 11-30%; бронзу — если в 31-50%. Медаль выводится в виде звёздочки, при наведении на неё можно получить более детальную информацию о её смысле.

image

Из блока участника сообщества можно перейти в профиль пользователя в данном сообществе и посмотреть подробней, о чём и как он пишет. Более того, из блока «Тостера» можно даже переходить напрямую на список ответов пользователя по данной теме.

Посмотреть всех пользователей, по которым в базе «Моего круга» есть информация об их участии в ИТ-сообществах, можно на поиске по специалистам, выбрав среди фильтров соответствующий пункт «Участник ИТ-сообществ»: https://moikrug.ru/resumes?currency=rur&with_social_ratings=1

Блоки участника ИТ-сообществ подключаются и отключаются в кабинете своего профиля на «Моём круге», в разделе «Ключница».

image



На наш взгляд, рейтинг участника ИТ-сообществ получился и полезным, и забавным. Впервые можно узнать свою репутацию среди других участников «Хабра» и «Тостера», увидеть её в полном объеме, а не по частям.

Так что приглашаем всех, кто этого пока не сделал, привязать свою учётную запись TMID к своему профилю на «Моём круге» и узнать свой рейтинг: moikrug.ru/preferences/socials (=
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332878/


[Из песочницы] Проброс портов или как попасть в сеть за NAT используя Node.JS

Вторник, 11 Июля 2017 г. 16:23 + в цитатник
Привет! Хочу поделиться очередным способом проброса портов, теперь и на Node.JS!

Для чего это нужно? Представим, есть удалённый компьютер, к которому нужно подключиться, например, по ssh, rdp, http(s), proxy, vnc, и т.д. Но, увы, у него нет общедоступного IP по той или иной причине.
image

В этом примере предполагается, что у вашего устройства есть внешний IP.

Что в таком случае можно сделать? Подключиться из удалённого ПК к вашему, который слушает, например, порт 3000, пробросив определённый порт, например, 22. В результате зайдя по ssh на localhost:3000, мы зайдём на удалённый ПК.

Что же для этого нужно? На вашем и удалённом ПК:

Клонируем github.com/mgrybyk/node-tunnel и инсталим npm модули:

cd node-tunnel
npm install

Запускаем

На вашем ПК запускаем:

node server

в другом терминале:

node client

На удалённом ПК создаём файл .env, где мы укажем какой порт нужно пробросить:

N_T_AGENT_DATA_HOST=localhost
N_T_AGENT_DATA_PORT=22


node agent

На этом настройка закончена, можем подключиться:

ssh -p 8000 localhost

Сессия ssh к удалённой машине установлена!

Для начала (и чтобы поиграться) server, client и agent можно запустить на одном устройстве, тогда подключившись к localhost:8000 по ssh вы зайдёте к себе же. Вместо localhost можно указать другой хост; вместо ssh можно использовать другой TCP порт, например, http(s)

Но, что же делать, если у вас нет внешнего IP? Нужно найти промежуточную точку, где он имеется, например, бесплатный контейнер на AWS.

image

Суть примерно та же, для примера возьмём теперь порт rdp и дадим имена агенту и клиенту.
Имена отдельного агента и клиентов должны совпадать.

На удалённом ПК отредактируем .env файл, в этот раз укажем ещё и хост Windows PC внутри вашей сети:

N_T_SERVER_HOST=хост ПК с внешним IP
N_T_AGENT_DATA_HOST=Windows PC внутри удалённой сети
N_T_AGENT_DATA_PORT=3389
N_T_AGENT_NAME=test-rdp


И запустим:

node agent

На ПК с внешним IP просто запустим node server предварительно склонив репозиторий и установив модули npm.

На вашем ПК создадим .env файл, так же указав порт, который клиент будет слушать:

N_T_SERVER_HOST=хост ПК с внешним IP
N_T_CLIENT_NAME=test-rdp
N_T_CLIENT_PORT=3388


Запустим node client. Здорово! Теперь мы можем подключиться по RDP на localhost:3388 открыв rdp сессию к ПК внутри сети агента.

Больше клиентов?

Также, можно рассказать как настроить (создать .env) клиент другу. Запустив у себя клиент, он также сможет заходить по rdp туда же.

.env

Для удобства, можно создавать много файлов типа .env.ssh, .env.rdp, .env.proxy и т.д., после чего запускать agent/client/server передав имя файла как аргумент, например:

node client .env.rdp

Шифрование
ВНИМАНИЕ! Шифрование трафика ещё не готово, пока не разобрался как это лучше сделать.
При шифровании данных их длина растёт, из-за чего сообщение часто делится на два. После чего, на другой стороне их нужно склеить, перед тем как пускать дальше. Выглядит слишком криво :(

Ух, начну самое сложное, попытаюсь в двух словах объяснить как это работает.
Использовал стандартный модуль Net, который работает по TCP.

Клиенты и агенты подключаются к серверу, который перенаправляет трафик с агента — клиенту и обратно. Это и есть основная магия.

У клиента, сервера и агента есть важные две части.

Первая — сокет, для установки соединения, чтобы дать понять кто есть кто, назовём его — сервисный сокет.

Вторая — сокет для данных. Именно тут и происходит создание pipe'ов:

agentSocket.pipe(clientSocket)
clientSocket.pipe(agentSocket)

Пример с ssh

image

  1. Подключаюсь к клиенту
  2. Клиент перенаправляет трафик на сервер
  3. Сервер перенаправляет трафик на агента
  4. Агент создаёт соединение на указанный host:port и перенаправляет туда трафик
    Ну и обратно. Ответ SSH сервера агенту, далее сервер, клиент, ssh клиент.

… немного по каждому отдельно

Server

  • Сервер ждёт на клиентов и агентов
  • Когда приходит агент — сервер создает отдельный сервер для него, через который будет в дальнейшем идти весь трафик
  • При подключении клиента с тем же именем что и агент — сервер отправляет клиенту порт сервера для агента
  • может быть много агентов, но имена должны быть уникальны
  • может быть много клиентов для каждого агента, связка много к одному

Зная, кто есть кто, сервер, созданный для агента, перенаправляет трафик от агента к клиенту и обратно. Без шифрования! Работает примерно так:

  1. Приходит клиент, сохраняем ссылку на сокет
  2. Сервер уведомляет агента, что есть клиент и пора открывать соединение
  3. Когда агент приходит — сервер пайпит сокет агента на первый доступный сокет клиента и обратно
  4. Сервер уведомляет клиента, что пайп создан и пора форвардить трафик
    В дальнейшем сервер не слушает событие «data» клиента и агента.

Agent

установив соединение с сервером агент ждёт команд от клиентов, как только приходит команда — агент устанавливает соединение на указанный host:port. После чего перенаправляет трафик с сервера на открытое соединение и обратно.

Client

клиент создаёт локальный сервер (порт N_T_CLIENT_PORT). При успешном соединении с удалённым сервером перенаправляет весь трафик с удалённого на локальный сервер и обратно.

Это всё!

image

Спасибо за прочтение.

Надеюсь, вам было хоть немного интересно, капельку понятно и, может быть, даже пригодиться это приложение, как пригодилось мне и моим коллегам.

-> Github

Интересные модули
Кому нужно работать с пайпами, рекомендую посмотреть through2.

При его помощи можно вклиниться посреди цепочки из пайпов для различных целей, например, логирование, обработка ошибок, в конце концов, замены всех ключевых слов на свои или даже единичек на нолики :)

П.С.
Статью пишу впервые и с русским плохо. Заранее прошу прощения.

П.П.С.
Писал приложение изначально для себя и потому что просто было интересно что-то такое сделать на Node. Сам использую для ssh, rdp, proxy, vnc и других целей :)
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332876/


Метки:  

Банк «Открытие» проводит харвест по кредитованию малого бизнеса

Вторник, 11 Июля 2017 г. 16:20 + в цитатник
Банк «Открытие» собирает лучшие идеи по кредитованию малого бизнеса. Мы проводим открытый конкурс и предлагаем его участникам разработать прототип инновационного банковского продукта для малого бизнеса и предпринимателей. Финальная битва претендентов пройдет 29—30 июля в Москве.

Участникам нужно предложить идею продукта, не имеющего аналогов на рынке, и проработанный бизнес-кейс. Главный приз победившей команде — 500 000 рублей.

Заявки принимаются как от команд, так и от индивидуальных участников, из которых будут сформированы команды. Последний день подачи заявки — 25 июля.

Подробности можно узнать по ссылке: openfightbizz.ru
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332874/


Метки:  

CSS и iOS Safari

Вторник, 11 Июля 2017 г. 16:20 + в цитатник
image Доброго времени суток, дорогие хабрахабровцы!

Всегда хочется, что бы твой сайт выглядел одинаково хорошо на разных устройствах, включая и мобильные. Но, если поведение в браузерах Android во многом предсказуемо, то с iOS возникает ряд «сюрпризов». О них сегодня и поговорим!

Часть примеров уже публиковалась на Хабре, но я все-равно решил включить их в статью. Разделю статью на две части. В первой – приведу список полезных css-свойств для webkit, а во второй поговорим о фиксах проблем, возникающих при версте для iOS Safari.

Свойства


1. -webkit-overflow-scrolling: touch

Это css-свойство добавит плавный скролл в блоках с overflow: scroll. Рекомендую добавлять это свойство везде, где внутри блока может возникать прокрутка, к примеру, в мобильном меню.

.ov-scroll{
	overflow-y: auto;
	-webkit-overflow-scrolling:touch;
}

2. -webkit-text-size-adjust: none

Отключает масштабирование текста в горизонтальной ориентации.

body{
	-webkit-text-size-adjust: none;
}

Пример:

image

3. -webkit-tap-highlight-color: #ccc

Устанавливает цвет выделения активного элемента при тапе на нем (a, label). По умолчанию это серый цвет, и часто может быть ни к чему, или выбиваться из общего дизайна.

a, label{
	-webkit-tap-highlight-color: transparent;
}

Пример такого выделения:

image

4. -webkit-appearance: none

Отключает наложение на элементы стилей системы: тени, border-radius и т.д. Применяется для input (но не всех), textarea, и т.д. Удобно, когда надо задать единый вид элементов на всех устройствах.

input[type=text], input[type=submit], textarea{
	-webkit-appearance: none;
} 

Применяется не только в верстке для Safari.

5. media (hover)

Данный медиа-запрос позволит отдельно прописывать стили только для устройств, поддерживающих hover. Таким образом, на тач-устройствах не будут возникать лишние анимации, ненужные данным типам устройств.

@media (hover){
	.plus__item:hover{
		transform: scale(0.6);
	}
}

Применяется не только в верстке для Safari.

Фиксы


1. background-attachment: fixed

Проблема: background-attachment: fixed не работает в iOS Safari.

Решение: Фиксировать не фон, а блок или псевдоэлемент.

body:before {
    content: '';
    background-image: url(...);
    position: fixed;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
    z-index: -1;
}

2. Нежелательный скролл модального окна

Проблема: Это довольно редкий случай, но для общей информации, думаю, так же полезно будет знать о нем. Если модальное окно имеет собственную прокрутку и в закрытом состоянии просто установлен отрицательный z-index (и, к примеру, opacity: 0) — то при попытке скролла страницы, модальное окно может перехватить скролл. В результате чего не будет осуществляться прокрутка страницы.

Решение: Добавляем pointer-events: none к модальному окну в закрытом состоянии.

.modal{
	position: fixed;
	z-index: -9;
	top: 0;
	bottom: 0;
	left: 0;
	right: 0;
	opacity: 0;
	pointer-events: none;
}

3. Провадание меню при скролле
Для того, что бы меню «прилипало» к верхней границе экрана при скролле страницы, часто используют следующий прием. Изначально у меню установлено свойство position: absolute, и при достижении верхней границы окна, через js оно меняется на fixed. А при скролле страницы к началу, значение опять меняется на absolute.

Проблема: В Safari на iOS, при смене position с fixed на absolute, меню пропадает с экрана пока скролл не завершится.

Решение: Использовать для меню position: -webkit-sticky. Поведение меню будет сравнимо с вышеописанным, но пропадать ничего не будет! Плюс, не надо использовать js

.nav{
	.........
	position: absolute;
}

.nav_fix{
	position: fixed;
}

@supports ((position:-webkit-sticky) or (position:sticky)){
	.nav, .nav_fix{
		position: sticky;
		position: -webkit-sticky;
	}
}

К слову, значение sticky для свойства position сейчас поддерживается большим количеством браузеров, поэтому его можно использовать и в десктопных браузерах.

4. Блок с position: fixed при скролле

Если реализации решений предыдущих проблем я видел на некоторых сайтах, то данная проблема на сайтах встречается постоянно.

Проблема: При скролле в браузере изменяется высота экрана. Отсюда, если при раскрытом меню или модальном окне не блокировать скролл, возникает подобный эффект:

image

Решение: Нужно сделать следующий «трюк», используя transform.

.nav{
	position: fixed;
	left: 0;
	right: 0;
	bottom: 0;
	top: -70px;
	padding-bottom: 70px;
	transform: translateY(70px);
}

Величина в 70px покрывает разницу в изменении высоты окна. И только transform позволяет прорисовывать фон элемента за пределами экрана в данной ситуации.

Выводы


А выводов особо нет, просто пользуйтесь ) Если знаете еще полезные css-свойства или «фиксы», применимые на практике, пишите в комментариях!

Спасибо за внимание!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332872/


Метки:  

[Из песочницы] Линейное программирование в python силами библиотеки scipy

Вторник, 11 Июля 2017 г. 15:41 + в цитатник
В своей первой публикации мне хочется рассказать о том, как можно быстро и просто решить задачу линейного программирования с помощью замечательной библиотеки scipy. Для подобных задач в python есть так же pulp, но для новичков в scipy более понятный синтаксис.

Зачем может понадобиться линейное программирование на практике? Как правило, с его помощью решают задачу минимизации функции f(x) (или обратную задачу максимизации для — f(x) ).

Здесь я не буду приводить теоретические выкладки (можно посмотреть тут), а рассмотрю конкретный пример.

Итак, задача.

У нас есть 8 фабрик, которые каждую неделю производят некоторое количество продукции. Нам нужно распределить продукцию по 13 магазинам так, чтобы максимизировать суммарную прибыль, при этом разрешается закрывать нерентабельные магазины.

Нам известны:

  1. Производительность фабрик (поле supply в кг продукции за неделю), их координаты (X, Y)

              fact	      x	          y	   supply
    0	F_01	59.250276	59.871183	389
    1	F_02	84.739320	14.179336	409
    2	F_03	42.397937	42.474530	124
    3	F_04	19.539202	13.714643	70
    4	F_05	41.280669	37.860993	386
    5	F_06	37.159066	41.353602	196
    6	F_07	96.890453	64.420010	394
    7	F_08	86.267499	81.662811	365

  2. Производительность магазинов (поле demand в кг продукции за неделю), их координаты (X, Y)

         shop           	x	    y	         demand
    0	S_01	13.490869	73.269974	200
    1	S_02	85.435435	66.637250	20
    2	S_03	28.578297	8.997380	320
    3	S_04	31.324145	91.839907	360
    4	S_05	40.338575	15.487028	360
    5	S_06	41.642451	42.121572	120
    6	S_07	53.983692	20.950457	360
    7	S_08	75.761895	87.067552	60
    8	S_09	81.836739	36.799647	80
    9	S_10	54.260517	25.920108	100
    10	S_11	67.918105	68.108601	340
    11	S_12	92.200710	10.898110	360
    12	S_13	19.966539	39.046271	60
    

  3. Так же мы знаем, что затраты на производство конфет: 200 руб/кг; выручка от продажи конфет: 800 руб/кг; стоимость доставки конфет: 20 руб/кг/км; недельные расходы на магазин: 10 000 руб.

Теперь наложим первое логические ограничение:

  1. общий supply <= общего demand, то есть фабрики не могут отгрузить в магазин больше продукции, чем те могут сбыть .

Введем обозначения:

  1. costkg = затраты на производство;
  2. revkg = выручка от производства (цена сбыта за кг);
  3. devkg = затраты на логистику;
  4. costweek = затраты на обслуживание магазина.

Для работы с данными сделаем cross join фабрик с магазинами, чтобы получить все комбинации поставок (фабрика — магазин).

Получим таблицу такого вида:

	fact	supply	shop	demand	distance	cost_kg	rev_kg	del_kg	cost_week
99	F_08	365	S_09	80	44.863164	200	800	20	10000
100	F_08	365	S_10	100	55.742703	200	800	20	10000
101	F_08	365	S_11	340	13.554211	200	800	20	10000
102	F_08	365	S_12	360	70.764701	200	800	20	10000
103	F_08	365	S_13	60	42.616540	200	800	20	10000

Теперь посмотрим на функцию, которую мы будем оптимизировать (пока без учета содержания магазинов).

$inline$profit = volume* ( revkg - costkg - devkg *distance)$inline$

Здесь profit — прибыль в рублях от отгрузок в конкретный магазин, а volume — это объем отгрузок фабрики в данный магазин.

Всего у нас будет 104 слагаемых profit (т.к. у нас 104 комбинации фабрик и магазинов).

Конечный вид функции будет выглядеть как:

$inline$Profit = sum(profit_1...profit_n) - 13*10000$inline$

13 * 10000 — это затраты на содержание магазинов.

Теперь переходим к самому линейному программированию. Описание модуля scipy.optimize вы можете найти тут. В общем виде:

res = linprog(c, A_ub=A, b_ub=b, bounds=(x0_bounds, x1_bounds), options={"disp": True})

Здесь:

  1. с — это коэффициенты при наших volume (то есть издержки). У нас они будут отрицательные, т.к. мы решаем задачу максимизации (минимизация- f(x));
  2. A_ub — это значения при volume для накладываемого нами условия, b_ub — значения ограничений;
  3. x0_bounds and x1_bounds нижние и верхние границы на volume

Ограничения следующие:

  1. volume для каждой строки из нашей таблицы не превышает supply;
  2. сумма volume для фабрики по строкам не превышает supply;
  3. сумма volume для магазина по строкам не превышает demand;
  4. volume принимает значения от нуля до одного.

Код ниже:

## ff - table with factories and shops
coefs = []
for f in ff.iterrows():
    coefs.append((f[1]['rev_kg'] - f[1]['cost_kg'] - f[1]['del_kg']*f[1]['distance'])*(-1))
A = []
b = []
for f in ff['fact'].values:
    A.append((ff['fact'] == f)*1)
    b.append(ff[ff['fact'] ==f]['supply'].max())
    

for f in ff['shop'].values:
    A.append((ff['shop'] == f)*1)
    b.append(ff[ff['shop'] ==f]['demand'].max())

x0_bounds = []
x1_bounds = []

for f in ff.iterrows():
    x0_bounds.append(0)
    x1_bounds.append(f[1]['demand'])

x0_bounds = tuple(x0_bounds)
x1_bounds = tuple(x1_bounds)
A.append(coefs)
b.append(-10000*13)

res = linprog(coefs, A_ub=A, b_ub=b,  bounds=list(zip(x0_bounds, x1_bounds)), options={"disp": True,   'maxiter'  : 50000}
             )

Output:

Optimization terminated successfully.
Current function value: -948302.914122
Iterations: 20


Посчитаем чистую прибыль и посмотрим, сколько будет поставлять каждая фабрика и какие магазины стоит закрыть:

ff['supply_best'] = res.x
ff['stay_opened'] = (ff['supply_best'] > 0)*1
ff['profit'] = (ff['supply_best']*(ff['rev_kg']- ff['cost_kg'] - ff['distance'] * ff['del_kg']))*ff['stay_opened']
net_profit = ff['profit'].sum() - ff[ff['stay_opened']==1]['shop'].nunique()*10000

grouped = ff.groupby(['fact', 'shop'])['supply_best'].sum().reset_index()

f = {'supply_best': 'sum', 'supply': 'max'}
ff.groupby('fact')['supply_best', 'supply'].agg(f)

Читая прибыль — 828302.9141220199 рублей

Поставки каждой фабрики:

	fact	shop	supply_best
0	F_01	S_01	166.0
17	F_02	S_05	360.0
24	F_02	S_12	49.0
31	F_03	S_06	120.0
38	F_03	S_13	4.0
50	F_04	S_12	70.0
58	F_05	S_07	346.0
61	F_05	S_10	40.0
73	F_06	S_09	80.0
74	F_06	S_10	60.0
77	F_06	S_13	56.0
78	F_07	S_01	34.0
79	F_07	S_02	20.0
88	F_07	S_11	340.0
94	F_08	S_04	305.0
98	F_08	S_08	60.0

Поставки в магазин:

	
	supply_best	demand
shop		
S_01	200.0	200
S_02	20.0	20
S_03	0.0	320
S_04	305.0	360
S_05	360.0	360
S_06	120.0	120
S_07	346.0	360
S_08	60.0	60
S_09	80.0	80
S_10	100.0	100
S_11	340.0	340
S_12	119.0	360
S_13	60.0	60

Мы видим, что S_03 стоит закрыть, а в S_12 будет поставляться около 30% спроса.

Таким образом, с помощью нехитрых манипуляций мы решили хоть и базовую и сильно упрощенную, но часто встречающуюся на практике задачу оптимизации цепочки поставок.

Если у вас будут вопросы и замечания, буду рад ответить.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332866/


Метки:  

Новый подход к кэшированию процессора

Вторник, 11 Июля 2017 г. 15:17 + в цитатник
Чипы на большинстве современных настольных компьютеров имеют четыре ядра, но производители микросхем уже объявили о планах перехода на шесть ядер, а для высокопроизводительных серверов и сегодня 16-ядерные процессоры далеко не редкость.
Чем больше ядер, тем больше проблема распределения памяти между всеми ядрами при одновременной совместной работе. С увеличением числа ядер всё больше выгодно минимизировать потери времени на управлении ядрами при обработке данных — ибо скорость обмена данными отстает от скорости работы процессора и обработки данных в памяти. Можно физически обратиться к чужому быстрому кэшу, а можно к своему медленному, но сэкономить на времени передаче данных. Задача усложняется тем, что запрашиваемые программами объемы памяти не четко соответствуют объемам кэш-памяти каждого типа.

Физически разместить максимально близко к процессору можно только очень ограниченный объем памяти — кэш процесcора уровня L1, объем которого крайне незначителен. Daniel Sanchez, Po-An Tsai и Nathan Beckmann — исследователи из лаборатории компьютерных наук и искусственного интеллекта Массачусетского технологического института — научили компьютер конфигурировать разные виды своей памяти под гибко формируемую иерархию программ в реальном режиме времени. Новая система, названная Jenga, анализирует объемные потребности и частоту обращения программ к памяти и перераспределяет мощности каждого из 3 видов процессорного кэша в комбинациях обеспечивающих рост эффективности и экономии энергии.


Для начала исследователи протестировали рост производительности при комбинации статичной и динамической памяти в работе над программами для одноядерного процессора и получили первичную иерархию — когда какую комбинацию лучше применять. Из 2 видов памяти или из одного. Оценивались два параметра -задержка сигнала (латентность) и потребляемая энергия при работе каждой из программ. Примерно 40% программ стали работать хуже при комбинации видов памяти, остальные — лучше. Зафиксировав какие программы «любят» смешанное быстродействие, а какие — размер памяти, исследователи построили свою систему Jenga.

Они виртуально протестировали 4 виды программ на виртуальном компьютере с 36 ядрами. Тестировали программы:
  • omnet — Objective Modular Network Testbed, библиотека моделирования C и платформа сетевых средств моделирования (синий цвет на рисунке)
  • mcf — Метаконтент Framework (красный цвет)
  • astar — ПО для отображения виртуальной реальности (красный цвет)
  • bzip2 — архиватор (фиолетовый цвет)


На картинке показано где и как обрабатывали данные каждой из программ. Буквы показывают, где выполняется каждое приложение (по одному на квадрант), цвета показывают, где находятся его данные, а штриховка указывает на второй уровень виртуальной иерархии, когда он присутствует.

Уровни кэша
Кэш центрального процессора разделён на несколько уровней. Для универсальных процессоров — до 3. Самой быстрой памятью является кэш первого уровня — L1-cache, поскольку расположена на одном с процессором кристалле. Состоит из кэша команд и кэша данных. Некоторые процессоры без L1 кэша не могут функционировать. L1 кэш работает на частоте процессора, и обращение к нему может производиться каждый такт. Зачастую является возможным выполнять несколько операций чтения/записи одновременно. Объём обычно невелик — не более 128 Кбайт.

С кэшем L1 взаимодействует кэш второго уровня — L2. Он является вторым по быстродействию. Обычно он расположен либо на кристалле, как и L1, либо в непосредственной близости от ядра, например, в процессорном картридже. В старых процессорах — набор микросхем на системной плате. Объём L2 кэша от 128 Кбайт до 12 Мбайт. В современных многоядерных процессорах кэш второго уровня, находясь на том же кристалле, является памятью раздельного пользования — при общем объёме кэша в 8 Мбайт на каждое ядро приходится по 2 Мбайта. Обычно латентность L2 кэша, расположенного на кристалле ядра, составляет от 8 до 20 тактов ядра. В задачах, связанных с многочисленными обращениями к ограниченной области памяти, например, СУБД, его полноценное использование дает рост производительность в десятки раз.

Кэш L3 обычно еще больше по размеру, хотя и несколько медленнее, чем L2 (за счет того, что шина между L2 и L3 более узкая, чем шина между L1 и L2). L3 обычно расположен отдельно от ядра ЦП, но может быть большим — более 32 Мбайт. L3 кэш медленнее предыдущих кэшей, но всё равно быстрее, чем оперативная память. В многопроцессорных системах находится в общем пользовании. Применение кэша третьего уровня оправдано в очень узком круге задач и может не только не дать увеличения производительности, но наоборот и привести к общему снижению производительности системы.

Отключение кэша второго и третьего уровней наиболее полезно в математических задачах, когда объём данных меньше размера кэша. В этом случае, можно загрузить все данные сразу в кэш L1, а затем производить их обработку.

Периодически Jenga на уровне ОС реконфигурирует виртуальные иерархии для минимизации объемов обмена данных, учитывая ограниченность ресурсов и поведение приложений. Каждая реконфигурация состоит из четырех шагов.


Jenga отправляет данные не только в зависимости от того, какие программы — любящие большую односкоростную память или любящие быстродействие смешанных кэшей, но и в зависимости от физической близости ячеек памяти к обрабатываемым данным. Независимо от того — какой вид кэша требует программа по умолчанию или по иерархии. Главное чтобы соблюсти минимизировать задержку сигнала и энергозатраты. В зависимости от того, сколько видов памяти «любит» программа, Jenga моделирует латентность каждой виртуальной иерархии с одним или двумя уровнями. Двухуровневые иерархии образуют поверхность, одноуровневую иерархию — кривую. Затем Jenga проектирует минимальную задержку в размерах VL1, что дает две кривые. Наконец, Jenga использует эти кривые для выбора лучшей иерархии (то есть размера VL1).

Применение Jenga дало ощутимый эффект. Виртуальный 36-ядерный чип стал работать на 30 процентов быстрее и использовал на 85 процентов меньше мощности. Конечно, пока Jenga
— просто симуляция работающего компьютера и пройдет некоторое время, прежде чем вы увидите реальные примеры этого кеша и еще до того, как производители микросхем примут его, если понравится технология.

Конфигурация условной 36 ядерной машины
  • Процессоры. 36 ядер, x86-64 ISA, 2.4 GHz, Silvermont-like OOO: 8B-wide
    ifetch; 2-level bpred with 512x10-bit BHSRs + 1024x2-bit PHT, 2-way decode/issue/rename/commit, 32-entry IQ and ROB, 10-entry LQ, 16-entry SQ; 371 pJ/instruction, 163 mW/core static power
  • Кэши уровня L1. 32 KB, 8-way set-associative, split data and instruction caches,
    3-cycle latency; 15/33 pJ per hit/miss
  • Служба предварительной выборки Prefetchers (Fig. 23 only). 16-entry stream prefetchers modeled after and validated against
    Nehalem
  • Кэши уровня L2. 128 KB private per-core, 8-way set-associative, inclusive, 6-cycle latency; 46/93 pJ per hit/miss
  • Когерентный режим (Coherence). 16-way, 6-cycle latency directory banks for Jenga; in-cache L3 directories for others
  • Global NoC. 6x6 mesh, 128-bit flits and links, X-Y routing, 2-cycle pipelined routers, 1-cycle links; 63/71 pJ per router/link flit traversal, 12/4mW router/link static power
  • Блоки статической памяти SRAM. 18 MB, one 512 KB bank per tile, 4-way 52-candidate zcache, 9-cycle bank latency, Vantage partitioning; 240/500 pJ per hit/miss, 28 mW/bank static power
  • Многослойная динамическая память Stacked DRAM. 1152MB, one 128MB vault per 4 tiles, Alloy with MAP-I DDR3-3200 (1600MHz), 128-bit bus, 16 ranks, 8 banks/rank, 2 KB row buffer; 4.4/6.2 nJ per hit/miss, 88 mW/vault static power
  • Основная память. 4 DDR3-1600 channels, 64-bit bus, 2 ranks/channel, 8 banks/rank, 8 KB row buffer; 20 nJ/access, 4W static power
  • DRAM timings. tCAS=8, tRCD=8, tRTP=4, tRAS=24, tRP=8, tRRD=4, tWTR=4, tWR=8, tFAW=18 (all timings in tCK; stacked DRAM has half the tCK as main memory)

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332702/


Метки:  

[Из песочницы] Нагрузочное тестирование Web-систем. Как к нему подготовиться

Вторник, 11 Июля 2017 г. 14:41 + в цитатник
Если вы все знаете о нагрузочном тестировании и как правильно к нему подготовиться, то вам статья будет не интересна. Статья рассчитана на тех, кто хочет понять как строить “правильные” профили для тестирования и на что необходимо обращать внимание при подготовке сценария. Речь будет идти о Web-системах с Web-интерфейсом.

Я работаю в области тестирования более 10 лет, так или иначе сталкиваюсь с нагрузочным тестированием. Я читал разные статьи по этому виду тестирования, посещал конференции, старался узнавать что-то новое и инновационное в данной области. В большинстве получаемой информации вы найдете инструкции к действиям по тестированию микросервисов, баз данных и прочих подсистем по отдельности. При этом если подсистемы проверены и настроены должным образом, то не уделяется должного внимания Web-системе в целом.

Что сейчас Web-система — это набор микросервисов, подсистем, баз данных и др., которые могут располагаться на разных серверах, на разных континентах. Но все они так или иначе взаимодействуют с Web-интерфейсом (как написал выше, я рассматриваю только текущий вариант).

Многие утилиты для выполнения нагрузочного тестирования имеют возможность записи трафика. Почти все утилиты записывают полученные запросы последовательно в рамках одной сессии. То есть запрос за запросом и не заботятся о том как эти запросы выполняются в браузерах.

Количество соединений и последовательность выполнения

Возьмем несколько наиболее популярных браузеров (Google Chrome, Mozilla FireFox, Internet Explorer) и попробуем открыть любой сайт. Как показала практика работы с браузерами у некоторых есть настройка какое количество соединений они могут открывать параллельно, некоторые сами регулируют данное количество. К тому же количество соединений может меняться в зависимости от используемого типа соединения.

Internet Explorer:

image

Google Chrome:

image

Например я видел как для одного и того же ресурса https создавалось разное количество параллельных соединений. Так Google Chrome создавал 6 соединений и все запросы обрабатывал в рамках этого количества, а вот Internet Explorer мог создавать до 20 — 30 параллельных соединений.

Мы видим, что браузеры обращаются к Web-системой в несколько потоков, они могут загружать содержимое параллельно. Но ряд утилиты выполняют только один поток для одного пользователя.

То есть фактически неправильно говорить, что один поток в утилите для тестирования производительности будет всегда соответствовать работе одного реального пользователя.

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

Другими словами каждый виртуальный пользователь может поддерживать несколько параллельных соединений. И даже с одним пользователем можно нагрузить систему так, что она не сможет работать. Если вы используете утилиту, которая выполняет только один поток (поддерживает только одно соединение) для одного пользователям, то здесь надо понимать, что данный поток не является реальным пользователем.

Сторонние ресурсы

Необходимо обращать внимание на то, что Web-системы могут использовать сторонние ресурсы. Это может быть аналитика, счетчики, предоставляемые шрифты, стили, javascript. В зависимости от ваших потребностей необходимо определять для себя какие именно ресурсы вам требуется тестировать. В сторонних ресурсах может инициализироваться какая-либо информация, которую вы в дальнейшем можете использовать на своей системе. Тем самым исключив сторонние ресурсы, вы не сможет симулировать полностью получаемый контент для пользователя. Необходимый перечень запросов можно определить только путем долгого анализа и глубокого понимания тестируемой системы.

image

На картинке видна ситуация, когда запрос делается на ресурс, будем считать его тестируемым, который делает запрос на отличный от него. Вот здесь мы и должны решить нужен ли нам данный ресурс в нашем сценарии или он не связан с Web-системой и мы можем просто его исключить.

Группировка

Необходимо группировать запросы по выполняемым действиям. Так можно создавать отдельные группы на открытие главной страницы, на вход в систему, на переход по ссылке и т. д. Это все нужно в основном только для того, что установить необходимые задержки между группами действий. Мы рассматриваем одного виртуального пользователя как пользователя, который реально работает с системой. Естественно при наличии 100, 200, 1000 и более реальных пользователей, каждый из них будет проводить на определенной странице разное количество времени. Следовательно трафик должен идти от виртуальных пользователей неравномерно. Поэтому между группами действий необходимы устанавливать задержки. И чем более реальными они будут, тем более реальные результаты тестирования вы будете получать.

image

Заключение

Мы можем проигнорировать количество параллельно выполняемых соединений, сторонние ресурсы, группировки и задержки. Но в результате мы можем получить результаты тестов где видно, что система работает с 200 виртуальными пользователями (потоками), а на практике получите только 10 реальных. Или получить прямо обратные результаты, когда по графикам мы видим только 200 пользователей могут работать с системой, но с учетом разного времени использования страниц, количество используемых соединений и исключения сторонних ресурсов, мы можем получить и 500 реально работающих.

Я верю, что четкое понимание количества выполняемых соединений, правильное использование необходимого набора ресурсов и задержки между группами действий помогут вам получать более точные результаты нагрузочного тестирования, которое вы будет выполнять у себя.

Конечно это не полный список пунктов, с которых следует начинать подготовку. Есть еще множество различных аспектов, которые так или иначе влияют на тестирование производительности. Часть из них может влиять непосредственно на агента, который выполняет нагрузку и может быть никак не связан с тестируемой Web-системой.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332862/


Метки:  

И еще 9 инструментов для разработки мобильных приложений

Вторник, 11 Июля 2017 г. 14:28 + в цитатник
Продолжая традицию делиться найденным, представляем новую порцию инструментов для разработки и тестирования приложений, которые читатели, возможно, захотят добавить к себе в арсенал. Сегодня в меню: звуки, анимации, голосовое управление и даже целые языки.





Maker on the IFTTT Platform

Бесплатный набор инструментов для создания апплетов, включающих несколько действий и производящих операции по более сложным схемам, чем «если — то». Решение также открывает разработчикам доступ к широкой базе API разнообразных компаний, устанавливая связи с другими сервисами. Воспользоваться нетворкинговыми возможностями платформы могут также и те, кто хочет популяризовать свое творение — его легко представить на суд аудитории в 10 миллионов пользователей.

Glyphish

Коллекция разнообразных звуков для iOS приложений в хорошем качестве и профессиональной обработке. Образцы систематизированы как по аудиальным характеристикам, так и по назначению (звуки ошибки, всплывающего окна, пролистывания); в общей сложности набор насчитывает 101 тип звуков. По мнению создателей, коллекция вполне окупает единовременный платеж в 25 $, который за нее просят; собственное же мнение на этот счет вы можете составить на официальном сайте, где представлены версии похуже качеством для ознакомления в онлайн-режиме.

Eve

Для тех, кто хочет попробовать нечто эдакое, спешим сообщить, что в открытом доступе появился Eve — язык программирования + IDE «с человеческим лицом». Авторы ставили своей целью создать язык, который берет в расчет человеческий фактор и обеспечивает программисту максимально комфортный опыт. Достигается это за счет различных аспектов: от формулировок сообщений об ошибке до интуитивно понятного синтаксиса. Меняется сама структура документов, которые по большей части представляют собой связный текст, где спецификации перемежаются фрагментами кода, а внутрення система навигации позволяет легко ориентироваться в нарративе. Eve базируется на единообразной, последовательной системе, в которой каждая пара свойство/значение рассматривается как объект под названием «запись», что обеспечивает простую схему работы (написание кода сводится к комбинированию девяти типов операций) и значительно ускоряет поиск и устранение багов.

Fuse (UX Markup)

Еще одна альтернатива для собственно кода: новый декларативно-реактивный XML язык программирования (на этот раз базе Uno) для создания приложений на iOS и Android в реальном времени. Платформа предназначена для разработки интерактивных модулряных компонентов. Создатели традиционно обещают скорость и лаконичность не в ущерб качеству, интуитивность, а также удобную визуализацию.Среди прочего пользователям предлагаются продвинутые UI-технологии: нативные компоненты платформ, OpenGL и векторная графика, которые позволяют создавать качественные кроссплатформенные проекты с унифицированным дизайном. Платформа совместима как с Objective-C, так и с Java, так что элементы, которые создаются в UX Markup, можно не только оформлять в самостоятельный проект, но и встраивать в сторонние нативные приложения. Код платформы Fuse, использующей UX Markup, находится в открытом доступе.

Snips Voice Platform

Просто добавь AI: компания Snips предлагает голосового помощника для вашего проекта. Создание кастомизированного помощника осуществляется в веб-консоли за счет использования существующих запросов и формирования собственных. Затем команда на индивидуальной основе помогает провести деплой на нужной платформой (RaspberryPi, Linux, Android). Вся «кухня» в итоге находится на девайсе, обеспечивая пользователю приватность и безопасность данных. Сейчас поддерживаются английский, французский, немецкий, испанский и корейский языки, в будущем разработчики планируют расширять этот список.

API Tester

Облачное решение для тестирования функционала, скорости и производительности приложений. Возможности включают, в частности: создание HTTP запросов, извлечение значений из ответов, проверку значений, многократное использование переменных на различных стадиях и прописывание логики на Javascript. По словам разработчиков, система, которую они создавали, рассчитана на более сложные и динамичные тесты, чем то, что предлагает любимый многими Postman. Удобный интерфейс сайта упрощает и до известной степени автоматизирует написание тестов, позволяя вдобавок сохранять их, чтобы использовать результаты запросов при дальнейшей работе. Итогами можно поделиться с командой, в один клик сгенерировав ссылку. На данный момент весь функционал доступен бесплатно.

SQLify

Компактный веб-инструмент: быстрое конвертирование CSV и JSON файлов и (просто фрагментов) в SQL в онлайн-режиме.

Flawless App

Решение для тех, кто не хочет вкладываться в дорогостоящие программы для коллаборации дизайнеров и разработчиков команды. Плагин дает возможность подгружать мокапы, прототипы и прочие наброски дизайнов, в эмулятор iOS, чтобы постоянно сверять то, что должно быть, с тем, что получается, и корректировать интерфейс по ходу дела. Дизайны можно сверять как путем наложения, так и визуально, располагая их на одном экране; масштабирование позволяет проводить сопоставление вплоть до мелочей. Стоимость плагина — 15 $ за неограниченное время эксплуатации.

Lottie

Библиотека с широким выбором готовых анимаций After Effects для Android, iOS и React Native. Анимации рендерятся в формат JSON в реальном времени, вследствие чего использовать их в нативных приложениях не сложнее, чем простые изображения, независимо от платформы, да и весят они не намного больше. Разработчик может кастомизировать элементы под собственные потребности, в частности сделать их интерактивными.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332858/


Метки:  

Перевод книги Appium Essentials. Глава 5

Вторник, 11 Июля 2017 г. 14:06 + в цитатник
Привет. Продолжаем перевод книги Appium Essentials и изучение мобильной автоматизации. Что уже пройдено:

В этой главе мы, переходим к автоматизации приложений:
  • Автоматизация нативных приложений
  • Автоматизация гибридных приложений
  • Работа с веб-приложениями и нативными браузерами
  • Работа с веб-приложениями и Safari

Впереди много кода. Поехали!



Перед стартом.


Перед запуском Appium, давайте убедимся, что весь необходимый софт установлен:
Требования для Android:
  • Java (версии 7 и выше)
  • Android SDK API (версии 17 и выше)
  • Эмулятор
  • Eclipse [ну или Idea]
  • TestNG
  • Appium-сервер
  • Клиентская библиотека Appium (Java)
  • Selenium Server и java-библиотека WebDriver
  • APK тестируемого приложения

Требования для iOS:
  • Mac OS 10.7 и выше
  • Xcode (версии 4.6.3 и выше; рекомендуется 5.1)
  • Симулятор
  • На симуляторе стоит Safari
  • Java версии 7
  • Eclipse [или Idea]
  • TestNG
  • Appium-сервер
  • Клиентская библиотека Appium (Java)
  • Selenium Server и java-библиотека WebDriver

Работая с Appium, необходимо установить desired capabilities и инициировать Android/iOS драйвер.


Необходимые desired capabilities для Android и запуск Android драйвера.


Есть два способа задать desired capabilities: через Appium GUI и, инициировав объект desired capabilities. Объект desired capabilities более предпочтителен. Рассмотрим оба варианта:
Ниже настройки Android в Appium GUI для нативных и гибридных приложений:

Как настроить:
  • Откройте в Appium GUI настройки Android.
  • Укажите путь до тестируемого приложения.
  • Выберите пакет из списка.
  • Выберите из списка активити для запуска.
    Примечание от автора
    Если приложение уже установлено на виртуальное устройство, шаги 2-4 делать не нужно. Нужно передать на эмулятор информацию об APK для дальнейшей работы. Как это сделать:
    1. Запустите эмулятор
    2. Откройте командную строку [на компьютере]
    3. Напишите
      adb -e install <путь до apk>
    4. Нажмите Enter
    5. Вы должны увидеть сообщение об успешной установке

  • Включите Launch AVD и выберите созданный эмулятор из списка [предполагается, что эмулятор вы уже создали].
  • Выберите из списка PlatformVersion.
  • Включите Device Name и напишите «Android emulator».
  • Запустите Appium-сервер.

Теперь про настройки Android в Appium GUI для веб-приложений:

Как настраивать:
  1. Откройте настройки Android.
  2. Включите Launch AVD и выберите созданный эмулятор из списка [предполагается, что эмулятор вы уже создали].
  3. Выберите из списка PlatformVersion.
  4. Включите Use Browser и выберите браузер из списка.
  5. Включите Device Name и напишите «Android emulator».
  6. Запустите Appium-сервер.

Теперь о втором способе формирования DC.

Desired capabilities для нативных и гибридных приложений


В первой главе мы уже обсудили, какие бывают desired capabilities и зачем они нужны, так что здесь мы сразу погрузимся в код [наканецта!!1!]. Прежде всего, нужно импортировать пакеты:
import java.io.File;
import org.openqa.selenium.remote.DesiredCapabilities; 
import io.appium.java_client.remote.MobileCapabilityType;

Затем, создадим desired capabilities (для нативных и гибридных):
DesiredCapabilities caps = new DesiredCapabilities();//создаем объект
File app=new File("path of the apk");//создаем объект File, чтобы определить путь до apk
caps.setCapability(MobileCapabilityType.APP,app);//требуется, если приложение еще НЕ установлено на эмулятор.
caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "4.4");//указываем версию Android
caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");//Имя OS
caps.setCapability(MobileCapabilityType.DEVICE_NAME, "Android emulator");//Сообщаем, что будет использоваться эмулятор
caps.setCapability("avd","Name of the AVD to launch");//Указываем, какой конкретно эмулятор хотим запустить
caps.setCapability(MobileCapabilityType.APP_PACKAGE, "package name of your app (you can get it from apk info app)");//определяем package для запуска
caps.setCapability(MobileCapabilityType.APP_ACTIVITY, "Launch activity of your app (you can get it from apk info app)");//activity для запуска

Desired capabilities для веб-приложений


В веб-приложения на Android, некоторые опции не нужны. Например APP, APP PACKAGE и APP ACTIVITY, потому что мы запускаем браузер.
Для начала, необходимо импортировать пакеты:
import org.openqa.selenium.remote.DesiredCapabilities; 
import io.appium.java_client.remote.MobileCapabilityType;

Затем, создадим desired capabilities (для веб):
DesiredCapabilities caps = new DesiredCapabilities();//создаем объект
caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "4.4");//указываем версию Android
caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");//Имя OS
caps.setCapability(MobileCapabilityType.DEVICE_NAME, "Android emulator");//Сообщаем, что будет использоваться эмулятор
caps.setCapability("avd","Name of the AVD to launch");//Указываем, какой конкретно эмулятор хотим запустить
caps.setCapability(MobileCapabilityType.BROWSER_NAME, "Browser"); //для запуска браузера

По части desired capabilities мы все сделали. Теперь нужно инициировать драйвер Android и подключить его к Appium-серверу.
Снова нужно импортировать пакеты:
import io.appium.java_client.android.AndroidDriver;
import java.net.URL;

Затем, инициализируем Android драйвер:
AndroidDriver driver = new AndroidDriver (new URL("http://127.0.0.1:4723/wd/hub"), caps); //caps был создан выше

Эта строка запустит приложение на эмуляторе, используя те настройки, которые были заданы в desired capabilities.
Ну а теперь можно создать заготовку для теста, используя TestNG:
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.remote.MobileCapabilityType;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class TestAppIication {
  AndroidDriver driver;

  @BeforeClass
  public void setUp() throws MalformedURLException{
  //Определяем desired capabilities
    DesiredCapabilities caps = new DesiredCapabilities();
    File app=new File("path of the apk");
    caps.setCapability(MobileCapabilityType.APP,app);
    caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "4.4");
    caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
    caps.setCapability(MobileCapabilityType.DEVICE_NAME, "Android emulator");
    caps.setCapability("avd","Name of the AVD to launch");
    caps.setCapability(MobileCapabilityType.APP_PACKAGE, "package name of your app (you can get it from apk info app)");
    caps.setCapability(MobileCapabilityType.APP_ACTIVITY, "Launch activity of your app (you can get it from apk info app)");
    caps.setCapability(MobileCapabilityType.BROWSER_NAME, "Browser");// при работе с веб-приложением
    driver = new AndroidDriver (new URL("http://127.0.0.1:4723/wd/hub"), caps);
    driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
  }
  @Test
  public void testExample(){
  //здесь будет сам тест
  }
  @AfterClass
  public void tearDown(){
    driver.closeApp();//CloseApp() функция используется для закрытия нативного или гибридного приложения, а quit() и close() - для веба
  }
}



Необходимые desired capabilities для iOS и запуск iOS драйвера


Также, как и на Android, задать desired capabilities можно двумя путями.
Настройки для нативных и гибридных приложений:

  1. Откройте настройки iOS
  2. Укажите путь до тестируемого приложения
  3. Включите Force Device и выберите симулятор из списка
  4. Выберите из списка Platform Version (или можете написать сами, например 8.1)
  5. Запустите Appium-сервер

Настройки для веб-приложений:

  1. Откройте настройки iOS
  2. Выберите «Use Mobile Safari»
  3. Включите Force Device и выберите симулятор из списка
  4. Выберите из списка Platform Version (или можете написать сами, например 8.1)
  5. Запустите Appium-сервер

Desired capabilities для нативных и гибридных приложений


Какие бывают DC и зачем, мы обсудили в главе 1, так что перейдем сразу к коду.
Сперва, импорт пакетов:
import java.io.File;
import org.openqa.selenium.remote.DesiredCapabilities;
import io.appium.java_client.remote.MobileCapabilityType;

Затем, создадим desired capabilities (для нативных и гибридных):
DesiredCapabilities caps = new DesiredCapabilities();//создаем объект
File app=new File("path of the app");//создаем объект File, чтобы определить путь до приложения
caps.setCapability(MobileCapabilityType.APP,app);//указываем путь до приложения
caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "8.1");//Версия iOS
caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS");//Имя OS
caps.setCapability(MobileCapabilityType.DEVICE_NAME, "iPhone 5");//Укажите корректное имя эмулятора или Appium сгенерирует исключение

Desired capabilities для веб-приложений


Импорт пакетов:
import java.io.File;
import org.openqa.selenium.remote.DesiredCapabilities;
import io.appium.java_client.remote.MobileCapabilityType;

Теперь установим desired capacities для веб-приложения:
DesiredCapabilities caps = new DesiredCapabilities();//создаем объект
caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "8.1");//Версия iOS
caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS");//Имя OS
caps.setCapability(MobileCapabilityType.DEVICE_NAME, "iPhone 5");//Укажите корректное имя эмулятора или Appium сгенерирует исключение
caps.setCapability(MobileCapabilityType.BROWSER_NAME, "Safari"); //Чтобы запустить Safari

Осталось инициализировать драйвер iOS.
Импорт:
import io.appium.java_client.ios.IOSDriver;
import java.net.URL;

Инициализация:
IOSDriver driver = new IOSDriver (new URL("http://127.0.0.1:4723/wd/hub"),caps);

Теперь можно писать тест, используя TestNG:
import io.appium.java_client.ios.IOSDriver;
import io.appium.java_client.remote.MobileCapabilityType;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class TestAppIication {
  IOSDriver driver;

  @BeforeClass
  public void setUp() throws MalformedURLException{
  //Задаем desired capabilities
    DesiredCapabilities caps = new DesiredCapabilities();
    File app=new File("path of the .app");
    caps.setCapability(MobileCapabilityType.APP,app);
    caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "8.1");
    caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS");
    caps.setCapability(MobileCapabilityType.DEVICE_NAME, "iPhone 5");
    caps.setCapability(MobileCapabilityType.BROWSER_NAME, "Safari");// при работе с веб-приложением
    driver = new IOSDriver (new URL("http://127.0.0.1:4723/wd/hub"), caps);
    driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
  }
  @Test
    public void testExample(){
    //здесь будет сам тест
  }
  @AfterClass
  public void tearDown(){
    driver.closeApp();//для нативных или гибридных приложений
    //driver.quit(); //для веб-приложений
  }
}



Автоматизация нативных приложений


Android


Ниже пример автоматизации калькулятора Android. В примере мы пробуем сложить два числа.

  1. Обновите desired capabilities в методе setup(), чтобы запустить калькулятор:
    caps.setCapability("avd","AVD_Nexus_4");// Mention the created AVD name
    caps.setCapability(MobileCapabilityType.APP_PACKAGE, "com.android.calculator2");
    caps.setCapability(MobileCapabilityType.APP_ACTIVITY, "com.android.calculator2.Calculator");
  2. Теперь на нужно найти два числа. Будем искать их по name:
    WebElement five=driver.findElement(By.name("5"));
    WebElement four=driver.findElement(By.name("4"));
  3. Также, нужно найти знаки "+" и "="; будем искать по AccessabilityID:
    WebElement plus=driver.findElement(By.name("+"));
    WebElement equalTo=driver.findElementByAccessibilityId("equals"));
  4. Теперь, кликаем:
    five.click();
    plus.click();
    four.click();
    equalTo.click();
  5. Запустите свой тест, используя TestNG:
    public class TestAppIication {
      AndroidDriver driver;
      @BeforeClass
      public void setUp() throws MalformedURLException{
        DesiredCapabilities caps = new DesiredCapabilities();
        caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "4.4");
        caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
        caps.setCapability(MobileCapabilityType.DEVICE_NAME, "Android emulator");
        caps.setCapability("avd","AVD_Nexus_4");// Mention the created AVD name
        caps.setCapability(MobileCapabilityType.APP_PACKAGE, "com.android.calculator2");
        caps.setCapability(MobileCapabilityType.APP_ACTIVITY, "com.android.calculator2.Calculator");
        driver = new AndroidDriver (new URL("http://127.0.0.1:4723/wd/hub"), caps);
        driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
      }
      @Test
      public void testExample(){
        WebElement five=driver.findElement(By.name("5"));
        five.click();
        WebElement plus=driver.findElement(By.name("+"));
        plus.click();
        WebElement four=driver.findElement(By.name("4"));
        four.click();
        WebElement equalTo=driver.findElementByAccessibilityId("equals"));
        equalTo.click();
      }
      @AfterClass
      public void tearDown(){
        driver.closeApp();
      }
    }

iOS


Ниже пример работы с приложением TestApp; его можно скачать отсюда. После скачивания, разархивируйте его.

В этом примере попробуем сложить два числа:
  1. Обновите метод setup(), чтобы запустить TestApp:
    File app=new File("/Users/mhans/appium/ios/TestApp.app");//You can change it with your app address
    caps.setCapability(MobileCapabilityType.APP,app);
  2. Теперь нужно найти элементы для ввода чисел; будем искать по name:
    WebElement editBox1=driver.findElement(By.name("TextField1"));
    WebElement editBox2=driver.findElement(By.name("TextField2"));
  3. Затем, найдем кнопку compute; используем AccessibilityID:
    WebElement computeSumBtn=driver.findElementByAccessibilityId("Compute Sum"));
  4. Введем значение в первое поле:
    editBox1.sendKeys("10");
  5. Введем значение во второе:
    editBox2.sendKeys("20");
  6. Теперь, клик по кнопке Compute Sum:
    computeSumBtn.click();
  7. Запустите свой тест, используя TestNG:
    public class TestAppIication {
      IOSDriver driver;
      @BeforeClass
      public void setUp() throws MalformedURLException{
      File app=new File("/Users/mhans/appium/ios/TestApp.app");//You can change it with your app address
        DesiredCapabilities caps = new DesiredCapabilities();
        caps.setCapability(MobileCapabilityType.APP,app);
        caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "8.1");
        caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS");
        caps.setCapability(MobileCapabilityType.DEVICE_NAME, "iPhone 5");
        driver = new IOSDriver (new URL("http://127.0.0.1:4723/wd/hub"), caps);
        driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
      }
      @Test
      public void testExample(){
        WebElement editBox1=driver.findElement(By.name("TextField1"));
        editBox1.sendKeys("10");
        WebElement editBox2=driver.findElement(By.name("TextField2"));
        editBox2.sendKeys("20");
        WebElement computeSumBtn=driver.findElementByAccessibilityId("Compute Sum"));
        computeSumBtn.click();
      }
      @AfterClass
      public void tearDown(){
        driver.closeApp();
      }
    }



Работа с веб-приложениями


Android


В качестве примера, возьмем поисковую страницу Google. Для работы будем использовать нативный браузер Android:

  1. Обновите метод setup() для запуска браузера:
    caps.setCapability("avd","AVD_Nexus_4");
    caps.setCapability(MobileCapabilityType.BROWSER_NAME, "Browser");
  2. Теперь нужно перейти на www.google.com:
    driver.get("https://www.google.com");
  3. Нужно найти элемент searchBox; искать будем по name:
    WebElement searchBox=driver.findElement(By.name("q"));
  4. Затем, введем поисковый запрос:
    searchBox.sendKeys("Appium for mobile automation");
  5. Запустите свой тест, используя TestNG:
    public class TestAppIication {
      AndroidDriver driver; 
      @BeforeClass
        public void setUp() throws MalformedURLException{ 
          DesiredCapabilities caps = new DesiredCapabilities();
          caps.setCapability(MobileCapabilityType.BROWSER_NAME, "Browser");
          caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "4.4");
          caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
          caps.setCapability(MobileCapabilityType.DEVICE_NAME, "Android emulator");
          caps.setCapability("avd","AVD_Nexus_4");// Mention the created AVD name
          driver = new AndroidDriver (new URL("http://127.0.0.1:4723/wd/hub"), caps);
          driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
          }
        @Test
        public void testExample() {
        driver.get("https://www.google.com");
        WebElement searchBox=driver.findElement(By.name("q"));
        searchBox.sendKeys("Appium for mobile automation");
      }
      @AfterClass
      public void tearDown(){
        driver.quit();
      }
    }

iOS


В качестве примера, возьмем поисковую страницу Google. Для работы будем использовать нативный браузер Safari:

  1. Обновите метод setup(), чтобы запустить Safari:
    caps.setCapability(MobileCapabilityType.BROWSER_NAME, "Safari");
  2. Нужно перейти на www.google.com:
    driver.get("https://www.google.com");
  3. Затем, найти поисковую строку (по name):
    WebElement searchBox=driver.findElement(By.name("q"));
  4. В поисковую строку отправить запрос:
    searchBox.sendKeys("Appium for mobile automation");
  5. Запустите свой тест, используя TestNG:
    public class TestAppIication {
      IOSDriver driver; 
      @BeforeClass
      public void setUp() throws MalformedURLException{ 
        DesiredCapabilities caps = new DesiredCapabilities();
        caps.setCapability(MobileCapabilityType.BROWSER_NAME, "Safari");
        caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "8.1");
        caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS");
        caps.setCapability(MobileCapabilityType.DEVICE_NAME, "iPhone 5");
        driver = new IOSDriver (new URL("http://127.0.0.1:4723/wd/hub"), caps);
        driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
        }
      @Test
      public void testExample(){
        driver.get("https://www.google.com");
        WebElement searchBox=driver.findElement(By.name("q"));
        searchBox.sendKeys("Appium for mobile automation");
        }
      @AfterClass
      public void tearDown(){
      driver.quit();
      }
    }



Автоматизация гибридных приложений


Android


Для изучения, используем testApp. Его можно скачать отсюда
Перед работой с гибридными приложениями, нужно выполнить шаги инструкции.

  1. Обновите метод setup(), чтобы запустить приложение:
    File app=new File("C:\\Appium_test\\testApp.apk");
    caps.setCapability(MobileCapabilityType.APP,app);
    caps.setCapability("avd","AVD_Nexus_4");
    caps.setCapability(MobileCapabilityType.APP_PACKAGE, " com.example.testapp");
    caps.setCapability(MobileCapabilityType.APP_ACTIVITY, " MainActivity");
  2. Нам нужно найти поле для ввода нашего URL (https://www.google.com), найдем его по ID:
    WebElement editBox=driver.findElement(By.id("com.example.testapp:id/urlField"));
    editBox.sendKeys("https://www.google.com");
  3. Теперь найдем кнопку Go:
    WebElement goButton=driver.findElement(By.name("Go"));
  4. Кликаем на кнопку:
    goButton.click();
  5. Теперь нужно переключить контекст:
    Set 
    contexts = driver.getContextHandles();
    for (String context : contexts) {
      System.out.println(context); //выведет список контекстов вроде NATIVE_APP или WEBVIEW_com.example.testapp
    }
  6. Переключаемся на web_view:
    driver.context("WEBVIEW_com.example.testapp");

    или так:
    driver.context((String) contextNames.toArray()[1]);
  7. Теперь можно работать с веб-страницей Google. Можем кликнуть на вкладку Images и найти элемент по linkText:
    WebElement images=driver.findElement(By.linkText("Images"));
    images.click();
  8. Запустите свой тест, используя TestNG:
    public class TestAppIication {
      AndroidDriver driver; 
      @BeforeClass
      public void setUp() throws MalformedURLException{
        DesiredCapabilities caps = new DesiredCapabilities();
        File app= new File("/Users/mhans/appium/ios/webViewApp. app");
        caps.setCapability(MobileCapabilityType.APP,app");
        caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "4.4");
        caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
        caps.setCapability(MobileCapabilityType.DEVICE_NAME, "Android emulator");
        caps.setCapability("avd","AVD_Nexus_4");// Mention the created AVD name
        caps.setCapability(MobileCapabilityType.AUTOMATION_NAME, "Appium");//Use Selendroid in case of <4.4 android version
        caps.setCapability(MobileCapabilityType.APP_PACKAGE, "com.example.testapp");
        caps.setCapability(MobileCapabilityType.APP_ACTIVITY, "com.example.testapp.MainActivity");
        driver = new AndroidDriver (new URL("http://127.0.0.1:4723/wd/hub"), caps);
        driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
      }
      @Test
      public void testExample(){
        WebElement editBox=driver.findElement(By.id("com.example.testapp:id/urlField"));
        editBox.sendKeys("https://www.google.com");
        WebElement goButton=driver.findElement(By.name("Go"));
        goButton.click();
        Set contexts = driver.getContextHandles();
        for (String context : contexts) {
          System.out.println(context);
        }
        driver.context((String) contexts.toArray()[1]);
        WebElement images=driver.findElement(By.linkText("Images"));
        images.click();
      }
      @AfterClass
      public void tearDown(){
        driver.closeApp();
      }
    }
    

iOS


Здесь возьмем, для примера, WebViewApp. Скачать можно отсюда. После скачивания, разархивируйте приложение:

  1. Обновите метод setup(), чтобы запустить приложение:
    File app=new File("/Users/mhans/appium/ios/WebViewApp.app");
    caps.setCapability(MobileCapabilityType.APP,app);
  2. Нужно найти поисковую строку чтобы передать туда URL (https://www.google.com). Давайте найдем ее по className:
    WebElement editBox=driver.findElement(By.className("UIATextField"));
    editBox.sendKeys("www.google.com");
  3. Теперь, по name найдем кнопку Go:
    WebElement goButton=driver.findElement(By.name("Go"));
  4. Клик:
    goButton.click();
  5. Теперь нужно получить список контекстов:
    Set contexts = driver.getContextHandles();
    for (String context : contexts) {
      System.out.println(context);
    }
  6. И переключиться для работы с web_view:
    driver.context("WEBVIEW_com.example.testapp");
    или
    driver.context((String) contextNames.toArray()[1]);
  7. Теперь можно работать с веб-страницей Google. Можем кликнуть на вкладку Images и найти элемент по linkText:
    WebElement images=driver.findElement(By.linkText("Images"));
    images.click();
  8. Запустите свой тест, используя TestNG:
    public class TestAppIication {
      IOSDriver driver;
      @BeforeClass
      public void setUp() throws MalformedURLException{
        DesiredCapabilities caps = new DesiredCapabilities();
        caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "8.1");
        caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS");
        caps.setCapability(MobileCapabilityType.DEVICE_NAME, "iPhone 5");
        driver = new IOSDriver (new URL("http://127.0.0.1:4723/wd/hub"), caps);
        driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
      }
      @Test
      public void testExample(){
        WebElement editBox=driver.findElement(By.className("UIATextField"));
        editBox.sendKeys("https://www.google.com");
        WebElement goButton=driver.findElement(By.name("Go"));
        goButton.click();
        Set contexts = driver.getContextHandles();
        for (String context : contexts) {
          System.out.println(context);
        }
        driver.context((String) contexts.toArray()[1]);
        WebElement images=driver.findElement(By.linkText("Images"));
        images.click();
      }
      @AfterClass
      public void tearDown(){
        driver.closeApp();
      }
    }



На этом все. В следующей главе, мы посмотрим особенности работы с реальными устройствами
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332814/


Метки:  

Эксперимент: возникает ли финансовое неравенство при случайной раздаче денег

Вторник, 11 Июля 2017 г. 13:53 + в цитатник


Представьте, что запертые в одной комнате люди просто раздают друг другу деньги: каждый дает по доллару кому-то другому в случайном порядке. Как в итоге средства распределятся между этими людьми? Ответ может оказаться удивительным.

Задача: как распределяются деньги при случайной раздаче


Издание Decision Science News опубликовало материал с описанием необычного эксперимента:

«Представьте себе комнату, в которой одновременно находится 100 человек. У каждого из них есть по 100 долларов. Каждую секунду каждый из находящихся в комнате дает доллар одному случайно выбранному человеку. Как по прошествии некоторого времени распределятся деньги между всеми, кто есть в комнате?».

У большинства из тех, кто столкнулся с этой задачей, само собой возникло предположение, что в итоге все получат примерно поровну денег. Даже пять докторов наук, опрошенные Decision Science News, пришли к тому же первоначальному выводу. Но так ли это на самом деле?

Как выглядит распределение


То, как будут распределяться средства с течением времени, наглядно видно здесь.

image

Инфографика охватывает временной интервал в 5000 секунд. Ось Y показывает количество денег, которое есть у каждого из участников мысленного эксперимента. Отсчёт начинается с 45 долларов. На оси Х показано количество людей в комнате — 45 человек.

Красные столбцы показывают сколько денег есть у каждого человека в каждую секунду. Синие полосы призваны продемонстрировать, как распределяется богатство. Самый правый синий столбец соответствует самой высокой красной полосе и так далее.

Проверить результаты эксперимента самостоятельно можно с помощью следующего кода (понадобятся R, tidyverse и gganimate):

library(tidyverse)
library(gganimate)

NUMPLAYERS = 45
ROUNDS = 5000
INITWEALTH = 45

#initialize the bank
#columns wealths of the NUMPLAYERS players
#rows show wealths of each of the ROUNDS ticks of the clocks
bank = matrix(0, nrow = ROUNDS, ncol = NUMPLAYERS)
bank[1,] =  c(rep(INITWEALTH, NUMPLAYERS))

#function to give a dollar to someone other than oneself
get_recipient = function(player) {
  sample(setdiff(1:NUMPLAYERS, player), 1)}

#execute trades and update the ledger 
for (i in 2:ROUNDS) {
  #every player with wealth chooses another person to receive a buck
  recipients = sapply(which(bank[i - 1,] > 0), get_recipient)

  #table of the dollars owed each person
  count_table = table(recipients)
  
  #get the indices of the people owed money
  indices = as.integer(names(count_table))
  
  #everyone gives up a dollar, unless they are at zero
  bank[i,] = ifelse(bank[i - 1,] > 0, bank[i - 1,] - 1, bank[i - 1,])
  
  #selected people receive dollars
  bank[i, indices] = bank[i, indices] + count_table
}

####################Animate it
#Make a suitable long data frame
df = as.data.frame(bank)
names(df) = 1:NUMPLAYERS
df = df %>%
  mutate(frame = 1:ROUNDS) %>%
  gather(person, wealth, 1:NUMPLAYERS) %>%
  mutate(person = as.numeric(person)) %>%
  arrange(frame) %>%
  group_by(frame) %>%
  mutate(rank = rank(wealth, ties.method = "random")) %>%
  ungroup() %>%
  gather(histtype,playerid,c(person,rank)) %>%
  mutate(histtype = sprintf("Ordered by %s", histtype))

p <- ggplot(df, aes(x = playerid, y = wealth, frame = frame, fill=histtype)) +
  theme_minimal() +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank()) +
  geom_rect(aes( xmin = playerid - .4, xmax = playerid +.4, ymin = 0, ymax = wealth)) +
  scale_x_continuous(breaks = 1:NUMPLAYERS) +
  coord_cartesian(xlim = c(0, NUMPLAYERS), y = c(0, 5 * INITWEALTH)) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  labs(x='players',y='dollars') +
  facet_wrap( ~ histtype,ncol=1) +
  theme(legend.position = "none")
p

#set options for the animation package. Need ImageMagick installed on your computer
animation::ani.options(nmax = ROUNDS,
                       convert = 'C:\\Program Files\\ImageMagick-7.0.6-Q16')
#save the movie
gganimate(p, "dollar_stacked.mp4", interval = .01)

Как видно, неравенство возникает даже при самом казалось бы безобидном сценарии. Поэтому необходимо следить за распределением финансов.

Останутся ли богатые вечно богатыми?


Математик Джордан Элленберг поясняет, что многие считают, будто при случайной раздаче все получат приблизительно поровну денег. На самом деле оказывается, что неравенство в распределении финансов появляется почти сразу же. Более того, оно сохраняется, пока люди продолжают раздавать друг другу деньги случайным образом.

Значит ли это, что в результате некоторые становятся богатыми и никогда не теряют своего высшего положения? Вовсе нет. Напротив, их благосостояние всё время меняется: каждый человек со временем то богатеет, то беднеет.

Таким образом, в долгосрочной перспективе все варианты распределения денег одинаково вероятны. Наблюдатели эксперимента смогут увидеть и ситуацию, в которой у одного человека в руках 9 901 доллар, а у прочих — по одному доллару, и распределение всех средств поровну, как в самом начале эксперимента.

Другие материалы по теме финансов и фондового рынка от ITinvest:


Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332854/


Метки:  

Запись с 1 млн нейронов: новые планы DARPA

Вторник, 11 Июля 2017 г. 13:45 + в цитатник
На днях IEEE Spectrum рассказали о новом заказе DARPA. Он входит в тематическую программу по нейроинженерии и разработке соответствующих систем, которой занимается Управление.

/ фото gomessda CC


Программа NESD (Neural Engineering System Design) была запущена еще в начале 2016 года. В ее цели и задачи входит разработка имплантируемых нейроинтерфейсов нового поколения (объемом до 1 кубического сантиметра).

Это — достаточно высокая планка, достижение которой требует существенного прогресса в ряде смежных дисциплин вроде неврологии, синтетической биологии, работы по направлению маломощной электроники и настоящих «прорывов» в других смежных сферах научной деятельности.

На данный момент не существует даже близких аналогов подобного нейроинтерфейса, которые могли бы похвастаться возможностью обработки сигнала хотя бы тысячи нейронов. Основная работа, которая велась в этом на правлении, была сосредоточена вокруг темы роботизированных протезов. В этой сфере удалось наладить получение и обработку сигнала всего с нескольких сотен нейронов.

Управление подчеркивает, что 1 млн — это только начало. Мозг человека содержит приблизительно 86 миллиардов нейронов. Эта величина пока не обсуждается, но и на практическом уровне запись сигнала с такого количества источников не представляет какого-либо смысла. Изучение сложных процессов, связанных с работой мозга, и разработка нейроинтерфейсов будут идти в итеративном режиме.

Правительственный грант на реализацию задач NESD был распределен между рядом команд. Например, стартап Paradromics будет заниматься разработкой шины Neural Input-Output Bus (NIOB). Согласно заявлениям руководства проекта, план по «поддержке» 1 млн нейронов будет реализован.

С практической точки зрения подобные разработки означают значительное продвижение в терапевтических процедурах. Разработки вроде NIOB позволят получать данные от участков мозга, отвечающих за обработку звуковых сигналов. Практика в данной нише позволит в значительной степени прояснить то, как мозг оперирует семантическими структурами более высокого уровня. Например, «декодировать» процесс восприятия музыкальных произведений, где голос исполнителя и музыка «сведены» в единую композицию.

Универсальный характер шины сделает возможной работу и с другими участками мозга — для этого потребуется соответствующее ПО.

Аналогичный подход сбора данных по «нейрокрупицам» (neurograins) исповедует команда (участник NESD) Брауновского университета — одного из наиболее престижных учебных заведений США. Основная проблема, с которой придется столкнуться ученым, заключается в разработке высокопроизводительной системы, связывающей десятки тысяч «нейрокрупиц» между собой.

В рамках этого проекта предстоит решить не только вопросы герметичности и безопасности самого импланта, но и работы с существенными объемами данных, получаемых с помощью нейроинтерфейса, плюс задачи не только «вывода», но и «ввода» данных с помощью разрабатываемого нейроинтерфейса.
Как вы относитесь к подобным разработкам?

Проголосовал 21 человек. Воздержалось 3 человека.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332828/


Метки:  

Анализ трафика GSM сетей в Wireshark

Вторник, 11 Июля 2017 г. 13:37 + в цитатник


Вторая статья будет посвящена работе с GSM трафиком в Wireshark. Рекомендую ознакомиться с первой, если Вы хотите получить больше возможностей для практики.
Для работы нам osmocom-bb совместимый телефон, способный принимать сигнал на частотах GSM, для России это 900 МГц и 1800 МГц и компьютер с установленным сниффером Wireshark.

GSMTAP


Для корректного отображения протоколов GSM в Wireshark последних версий не нужно устанавливать никаких дополнительных диссекторов.
Единственное, что нужно выставить настройку для протокола LAPD – Use GSM SAPI values



GSM протоколы будут инкапсулироваться в UDP пакеты с заголовком GSMTAP при передаче через Um интерфейс или в TCP пакеты с заголовками OML, RSL при трассировке A-bis интерфейса.



Запустим Wireshark на прослушивание loopback-интерфейса и зададим фильтры, чтобы видеть только GSM Um трафик.

wireshark -k -f udp -Y gsmtap -i lo


Приложения, способные генерировать GSMTAP трафик для Wireshark обычно действуют следующим образом:

  1. Получают Um фрейм по радио интерфейсу
  2. Добавляют GSMTAP заголовок
  3. Отправляют все это на указанный IP адрес в UDP пакетах (в нашем случае на loopback)

Помимо фильтра GSMTAP, можно использовать другие фильтры, начинающиеся с gsm, например gsm_sms, для поиска SMS-сообщений в трафике. Но использование фильтра GSMTAP позволит просматривать весь GSM Um трафик, поскольку все прочие заголовки вложены в GSMTAP.



Захват трафика



Для изучения GSM трафика его нужно сначала как-то записать. Используя SDR устройство в качестве приемника, Вы сможете изучать данные, передаваемые на общедоступных каналах CCCH, если только вам не известен Kc — сессионный ключ шифрования.

Однако при использовании OsmocomBB, телефона с SIM-картой и приложения mobile Вы знаете свой ключ шифрования Kc и сможете просматривать весь свой трафик в открытом виде, передаваемый через Um интерфейс (радио интерфейс) в Wireshark, и изучать как работают реальные сотовые сети.

Если Вы запустили свою GSM сеть на основе двух OsmocomBB-совместимых телефонов, как было указано в предыдущей статье, Вы можете передавать GSMTAP пакеты из OsmoBTS в Wireshark и таким образом изучать работу сети.

Если Вы хотите поупражняться в захвате своего трафика при помощи SDR-трансиверов, то рекомендую ознакомиться с пакетом утилит gr-gsm.
Самым бюджетным вариантом будет покупка RTL-SDR приемника.



Я не рекомендую покупать дешевые китайские приемники, вроде такого за 700 рублей.



Лично у меня он работал нестабильно и спустя неделю вовсе перестал. На форумах по RTL-SDR у людей возникали похожие проблемы. Так что это не единичный случай.

Дело в том, что оба чипа rtl2832u и r820t2, обычно используемые RTL-SDR совместимыми устройствами, очень сильно греются при работе, а никакого охлаждения дешевые приемники не предусматривают. Во-вторых, нет никакой защиты от статики и можно запросто сжечь приемник при неаккуратном обращении. Есть и другие проблемы.

Поэтому, я рекомендую приобрести официальный RTL-SDR приемник последней версии в алюминиевом корпусе. Он стоит всего 1500 рублей, но в комплекте Вы получите 2 антенны, пассивное охлаждение, защиту от статики, стабильную работу, улучшенную фильтрацию, и много другое. Как известно «Скупой платит дважды».

Анализ трафика



Я не буду здесь рассматривать работу с gr-gsm и RTL-SDR, поэтому сразу переходим к Osmocom.

Вы можете работать с любой коммерческой GSM сетью используя Open Source имплементацию стека протоколов GSM от Osmocom. Другими словами, Вы можете подключить телефон на чипсете Calypso к компьютеру, запустить приложение из пакета OsmocomBB и звонить, отправлять СМС и делать все то, что умеет делать обычный 2G телефон, плюс получать доступ к любой технической информации о текущем сеансе связи.

Приложение, которое нам нужно для этого, называется mobile и находится здесь src/host/layer23/src/mobile

Надеюсь, все уже скомпилировали OsmocomBB на своих компьютерах.
Процесс описан в моей предыдущей статье и в этом цикле.

Mobile — это приложение, которое запускается на стороне компьютера, но Вы также должны загрузить в телефон прошивку layer1

В базовом виде Вам нужно:

  1. Подключить телефон к компьютеру через USB-TTL конвертер
  2. Проверить, что появилось устройство /dev/ttyUSBx, загрузить в телефон прошивку layer1 через osmocon.
  3. Запустить mobile и указать интерфейс для отправки GSMTAP, чтобы мы могли прослушать этот интерфейс в Wireshark.


О том как загрузить прошивку в телефон я уже писал в предыдущей статье. Чтобы запустить mobile, перейдите к директорию с приложением и выполните следующую команду

./mobile -i 127.0.0.1


При первом запуске Вы можете увидеть сообщение об отсутствии конфигурационного файла. Создайте его пустым в директории, указанной в сообщении об ошибке. (У меня это /root/.osmocom/bb)

Если Вы все сделали правильно, то увидите в консоли лог работы mobile



Теперь вы можете подключиться к терминалу mobile и управлять телефоном так

telnet localhost 4247


Вы попадете в интуитивно понятный cisco-подобный VTY интерфейс. Используйте команду help, TAB для авто дополнения или SHIFT+?



Команды show ms, show subscriber, show ba и show cell помогут получить информацию о текущем подключении. Для перехода в привилегированный режим используйте enable и для записи изменений в файл write file.

Wireshark у нас уже запущен, и Вы можете видеть GSMTAP пакеты в списке.
Пока телефон находится в режиме ожидания, а нам никто не присылает СМС и не звонит, вывод будет состоять из открытого трафика с управляющих каналов.



Вы можете отправить СМС со своего личного номера на телефон mobile или отправить СМС самому себе через VTY интерфейс.
Тогда, если поискать в Wireshark трафик по фильтру gsm_sms, мы увидим



Есть и другие утилиты, позволяющие захватывать различного рода GSM трафик, их Вы можете найти тут src/host/layer23/src/misc

В частности, cell_log позволяет определить, какие базовые станции находятся вокруг Вас и умеет отправлять GSMTAP пакеты в Wireshark.

ccch_scan позволяет прослушивать сообщения на CCCH каналах, в том числе SMS, если использовать модифицированную версию из osmocombb ветки sylvain/burst_ind, которая позволяет задать ключ шифрования Kc.
Однако в этом случае Вам придется еще прошить ваш USB-TTL конвертер для работы на нестандартных скоростях.

Что касается захвата голосовых вызовов, то здесь все становится сложнее, так как реальный оператор может использовать Frequency Hopping, что «размазывает» burst-ы по разным частотам и нам требуется следовать за изменением частоты телефона, либо записывать весь трафик на всех возможных TCH частотах соты, что в свою очередь может не позволять сделать ваш приемник из-за физических ограничений.
Если Вы исследуете свою собственную сеть, то вам не нужен Frequency Hopping, однако Osmocom не предоставляет утилит для сниффинга голосовых вызовов при помощи osmocombb-совместимых телефонов.

Но утилита grgsm_decode пакета gr-gsm, способны декодировать речь, при захвате трафика SDR приемником и grgsm_capture.

Анализ трафика интерфейса A-bis



A-bis – интерфейс обмена сообщениями между BTS и BSC. У нас нет доступа к исследованиям такого рода трафика коммерческих сетей. Но Вы можете изучать подобные вещи на примере собственной GSM сети.
Чтобы просмотреть RSL сообщения, нужно начать прослушивать loopback интерфейс (обратите внимание, что здесь используется TCP, а не UDP) и вы увидите сообщения вроде этих:

Для RSL можно использовать фильтр gsm_abis_rsl


И для OML. Можно воспользоваться фильтром gsm_abis_oml либо фильтровать по портам 3002 и 3003


В то же время SMS сообщения будут вложены в RSL пакеты, а не в GSMTAP, как в случае с передачей через Um интерфейс.



На этом всё. В следующий раз я расскажу про добавление в Вашу домашнюю сеть поддержку GPRS.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332778/


Метки:  

Анонимный трудоголик: как мотивировать самого себя

Вторник, 11 Июля 2017 г. 13:30 + в цитатник
«Привет, Хабр! За 10 лет я сменил несколько мест работы, трижды получил дополнительное образование и научился любить каждую свою работу. Практически при любых условиях. Я тщательно изучил вопросы мотивации самого себя и понял, что в ИТ не бывает откровенно плохой работы — бывают новички, нытики, «короли разработки», свои в доску и чужие. В общем, все эти кресла-груши и анлимные напитки в холодильниках ничего не решают. А вот что решает — об этом и поговорим… Вот как-то так я хочу начать свою статью. Дадите свободный микрофон?» — такое сообщение прислал один из наших сотрудников. Конечно, дадим.


Источник

Мы предоставляем свободный микрофон своим сотрудникам — в рамках корпоративного блога они могут высказаться по волнующему их вопросу. Сегодня — второй раз. Такие статьи не проходят никакую цензуру: как говорится, на тебе блог, отбивайся сам. Итак, передаём слово одному из наших менеджеров, он давно не был в отпуске и хочет высказаться, как оно, работать в современном мире. И как заставить себя полюбить то, что делаешь.



Итак, привет, Хабр! Я — менеджер по внедрению CRM-систем в Регионсофт. В общем-то, я один из тех, кто не пристал к миру программистов и системных инженеров, но и не приемлет классические продажи как навязывание своей разработки. Короче, гремучая смесь инженера и коммерсанта. Моя базовая специальность — финансовый менеджмент и финансовая математика, опыт работы — 10 лет. За это время я понял, что найти работу — искусство, а вот удержаться на ней — профессия.

Я ни дня не работал во время учёбы в институте — только потому, что стремился поступить в аспирантуру и стать учёным, заниматься экономическим анализом, статистикой и моделированием. Моих знаний ПК хватало только на то, чтобы набрать диплом и сделать несложный расчёт в Excel. Я ошалело делал экономические модели и экономические выкладки в тетрадках в клеточку. Аспирантуру я закончил. Впрочем, не буду углубляться в причины, по которым я понял, что экономическая наука больна и меня не ждёт — остановимся на интересном и захватывающем мире бизнеса. Тогда он казался мне зазеркальем и соответствовал одной фразе: «Нас этому не учили».

Коротко: работа, мотивация и система ценностей


Мы произносим сами и слышим от коллег и друзей: скорей бы пятница, ад, каторга, пытка, работу работать за оплату спасибо и т.д. Мы все лукавим — это субъективное, а иногда и наносное отношение. Работа для человека — это источник благополучия, зачастую энергии и роста, гарантия собственной и семейной безопасности (элементарно есть средства на пожить-поесть-отдохнуть-полечиться).

Личная мотивация сотрудника тесно связана с потребностями: иметь деньги, реализовать свои потенциальные и реальные способности. В конце концов, заставить свой же профессионализм работать на себя. И признание моей профессии и навыков — тоже мотивация, едва ли не самая основная. Отдельная и доминирующая мотивация — достойная оплата труда, соотносимая с вложенными усилиями.


От того, насколько удовлетворены или не удовлетворены все мотивы человека, зависит мотивация работника. Поэтому при поиске работы у человека существует комплекс потребностей и желаний. Главное — определить, что для вас на данный момент наиболее важно; как правило, удаётся найти один-два критических пункта типа хорошей зарплаты, работы рядом с домом/удалённо или, например, работы в проекте с определённым стеком технологий. Одно известно точно — базис мотивации всегда должен быть разумным. Необходимо учитывать важный аспект мотивации — возможность достижения цели.  У каждого человека такие возможности разные, отсюда и различия в потребностях групп людей: карьера, комфортное место работы, интерес к проекту и проч.

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

И вот что я выяснил: 100% потребностей и желаний удовлетворить невозможно. Нужно выделять наиболее приоритетные на данный момент. И вот тут неплохо хотя бы примерно представлять, что тебя ждёт.

Муравейник класса А+


В начале своей карьеры я был активным адептом веры в красный диплом — это такая группа молодых выпускников, которые уверены, что красная корочка приравнена как минимум к удостоверению начальника МУРа. Не знаю, что именно  помогло, ум или тот самый диплом, но меня пригласили на собеседование в крупную телеком-компанию. В далёком 2007-м меня покорил офис класса А+ в центре города. А надо было слушать интуицию.

Собеседование было сложным и многоэтапным (кажется, их было 6). Все оппоненты мне показались адекватными и умными людьми, чувствовался их профессионализм. Кроме одного — моего будущего непосредственного начальника.


Когда меня спрашивают, что за шум на заднем фоне, я всегда отвечаю, что я не в офисе, а в зоопарке.

Через некоторое время я познал категории работников большой компании:

  • нормальные коллеги — спокойно работают, честно выполняют задачи, никого не жрут
  • любимчики, они же доносчики — безобидные, но неприятные ребята
  • кляузники — иногда очень опытные и умные сотрудники из серии «не вороши г… — себе дороже», особо опасны
  • блатные — важные протеже и протеже важных, а иногда и не очень важных; как правило, работают редко, а качественно работают — почти никогда.

Итак, что я ждал?


  • Я не скрывал того, что это моя первая настоящая работа, не наглел с запросами по заработной плате (согласился на предложенную), но ожидал обучения или минимальной стажировки. Я был уверен, что практикуется и дальнейшее обучение.

  • Казалось, что в такой компании все гарантированно профессиональны.

  • Я ожидал выстроенных, отлаженных бизнес-процессов, свободной циркуляции информации внутри компании.

  • Хотелось, чтобы мои огромные теоретические знания и навыки моделирования использовались по полной — ведь я ещё в вузе слышал, что с экономистами-математиками в компаниях напряг.

  • Я радовался обещанному социальному пакету: ДМС, корпоративная культура, спортзал с бассейном, компенсация питания и сотовой связи. Кстати, оговорюсь сразу, всё было добросовестно выполнено.

  • Я обрадовался системе KPI — уууух, как я сейчас себя покажу и начну зарабатывать премию с первых же месяцев.

Мои первые ошибки


  • Я посчитал первые поручения (обойти офисы связи тайным покупателем) оскорбительными и дал понять, что недоволен. Мне дали математические модели и я сел в лужу — сложнейшие макросы, выгрузки из биллинга, отраслевая специфика — ни одна моя модель не ложилась на практику.

  • Я полностью проигнорировал «особую атмосферу» внутри отдела: отказался ехать на чью-то дачу, не был каждую пятницу в соседнем пивном баре, не обсуждал свою личную жизнь с любопытными женщинами, не курил. Просто молча шёл домой.

  • Я стал дружить с другими отделами, где нашёл много поддержки — слишком вся компания ненавидела ту службу, где я оказался. Правда, эта ошибка чуть позже спасла меня и я смог продержаться в компании ровно 4 года.

  • История казалась совершенно безвыходной — я искал новую работу. Но я не знал про функцию сокрытия резюме от выбранных компаний. Ко мне было много, очень много вопросов.

Было неприятно. Первое, что ударило по мне — это  KPI. Даже без косяков по работе я словил минусовой коэффициент за расплывчатый термин «лояльность» и получил зарплату ниже обещанной. Потом последовали коэффициенты и за всё остальное. Я сходил на несколько собеседований, всё было не то — меня брали, а я отказывался и снова шёл на свою каторгу. Кстати, мне бы тогда ещё задуматься, почему мне дали пройти испытательный срок, а не выгнали с него — но я ещё не знал, что профессионал умеет видеть перспективного сотрудника. Но я задумался о другом: почему меня так тянуло снова идти на эту работу, где все хмуро сидели в своих ячейках-кабинетах, где каждый был едва ли не гайкой в огромной совершенной машине оператора связи и где мне было так… а как? Я понял: я люблю именно эту компанию и я горжусь, что являюсь частью известной и любимой миллионами компании. Это моё и я смогу. С тех пор мне везде было если не хорошо, то точно нормально. А главное — крайне полезно.

Итак, что можно получить в большой компании на старте карьеры?


Обучение. Вы идёте и знаете, что у вас нет опыта — в этом нет ничего плохого. Плохо — не хотеть этот опыт получить, а заниматься только выпрашиванием зарплаты. Даже если в компании нет системы наставничества и обучения, используйте следующие возможности:

  • спрашивайте у коллег — формулируйте грамотные вопросы, усваивайте информацию, пробуйте её применять на практике

  • осваивайте основные инструменты — погружение в особенности биллинга, внутренние отчёты и бюджет компании дали мне импульс для огромного профессионального скачка

  • не бойтесь принимать участие в сложных проектах — я вызвался добровольцем в сложнейший межрегиональный проект внедрения корпоративной CRM-системы, именно тот опыт стал первым шагом к любимой профессии

  • пользуйтесь корпоративными базами знаний — даже если они не структурированы, чаще всего, они есть.

Навыки коммуникации. Моя жизнь проходит между программистами-интровертами и обычными людьми, которым мы внедряем  CRM-систему. Тренд очевиден: скоро интровертность перестанет быть оправданием и навык коммуникации и офисной дипломатии будет одним из важнейших скиллов при приёме на работу. А всё от того, что мы разучились общаться, в то время как ни один проект нельзя реализовать без функциональных рабочих групп. В большой компании в любом случае придётся договариваться, обсуждать, решать проблемы, спорить. Именно в них можно набить шишки и узнать, насколько важны взаимоотношения и насколько они влияют на качество рабочего процесса.


Диалоги в большом офисе

Понимание корпоративных ценностей. Я до сих пор ярый противник всяких там корпоративов, выездов и прочих любовных отношений (особенно их!) внутри организации, но при этом очень ценю дух компании. Так вот, настоящая корпоративная культура не в том, чтобы набухаться в слюни и преданно смотреть в глаза начальству на очередной посиделке, а в том, чтобы гордиться компанией и продуктом. Тогда я гордился миллионами абонентов, которые нас любили и которым мы давали самое ценное — качественную связь, сейчас я горжусь нашим продуктом и тем, что им активно пользуются более 6000 клиентов. Если вам не стыдно сказать, кем и где вы работаете — вы на правильном пути.

Осознание ценностей бизнеса. Когда среднестатистический человек видит другого человека, допустим, на Лексусе и знает, что он директор фирмы, он говорит: «Ну как круто у него дела идут, Лексус купил». Но он никогда не скажет: как он круто поработал и как он классно организовал свою команду, ведь именно благодаря этому появились деньги на автомобиль. Офис А+, макбуки на столах, автопарк владельца и машины сотрудников на стоянке офиса — это антураж бизнеса, но не ценности. Ценности — это команда, продукт, технологии и умение всё это дело продвинуть и продать, умение грести и выживать среди конкурентов. Как ни странно, именно в большой компании ты осознаёшь, насколько важно работать в команде и делать классный продукт. И насколько плачевным может быть каждый неверный шаг.

Осознание роли личности. На моей первой работе был адекватный, умный, дальновидный генеральный директор, который кроме всего прочего всех нас знал в лицо. И он был стержнем всего бизнеса (хотя и наёмным). Именно благодаря его решениям и политике удалось собрать команду лучших профессионалов под одной крышей и тратить бюджет именно на развитие и рост качества услуг. Такая же история у нас в Регионсофт — генеральный директор (не наёмный) не исчезает на неделю, не приходит к обеду, а пашет рядом с нами с утра и до ночи, полностью руководя разработкой и контролируя всю коммерцию. Так и должно быть: если ты рулишь компанией, необходимо включаться в процессы и быть внутри них, а не выше. Забегая вперёд, скажу, что во время моей работы в тру-стартапе я увидел интенсивное падение компании именно из-за роли личности: слабый руководитель позволил каждому ощутить себя Гейтсом или Джобсом. Столько гениев Боливар не выдержал…

Итак, я видел, какие важные уроки даёт мне моя первая работа, ценил их, учился, осваивал ПК на профессиональном уровне. Через два года меня называли «гуру Excel». Я не сумел победить часть проблем в первом отделе и перевёлся в другую службу, проработав там успешно и с нормальным KPI ещё два года. В конце работы я добровольно за свой счёт пошёл учиться в корпоративный университет на разработчика ПО. Разработчиком я не стал, но получил абсолютно потрясающие навыки и наконец начал учить английский. С таким багажом очередным летом я ушёл из любимого уютного телекома в стартап.

Тут место небольшому лирическому отступлению. Про бабло.

Часто мы рассуждаем так: было бы бабло — остальное приложится. Но на такие деньги ты тратишь большую часть жизни, нервов, энергии и здоровья. Знаю, мне в комментариях напишут: «На деньги я куплю всё». Ничего подобного. Не буду повторять прописные истины о том, что здоровье и любовь не купишь. Увы! Пришёл к выводу: если ради этого самого бабла целый день ходишь на полусогнутых, проклинаешь всё на свете, конца рабочего дня ждёшь, как спасения, то в конце концов опустишься на колени, а там и поползёшь. Сильно богатым ты всё равно вряд ли станешь, а вот злым и ненавистным — точно. Короче, душу за бабло продавать не хочу! Лучше я её в хорошую работу вложу.  

Стартап — Олимп в миниатюре


Да, это был тот дух, которого мне так не хватало. Как в том эпохальном выступлении про полимеры, ветер свободы щекотал всё. Это был сильный софтверный продукт с мировым рынком сбыта и огромным рекламным бюджетом — некоторые из сотрудников уже присматривали себе домики в Калифорнии.

Итак, что я ждал


  • Триумфа на рынке — мы верили в свою программу, она легко ставилась, её мог полюбить и бизнес, и частный пользователь.

  • Братство и дружбу на работе — мы не выбирали слова на совещаниях, покупали вкусности к общему столу, проводили вместе выходные, искали новый офис и ощущали себя равными владельцу. Который, кстати, так не считал и периодически выбирался из своего кабинета, чтобы что-то уточнить про продажи.

  • Быстрые деньги — казалось, что до мирового взрыва и огромных зарплат осталось несколько месяцев. Пока жили на деньги чуть выше средних по городу, всё было прилично.

  • Собственного развития — я ощущал себя способным сделать для компании очень многое и был готов к любым горизонтальным передвижениям. Работать было интересно: я создал целую стратегию продвижения продукта исходя именно из его потребительских особенностей, а не маркетинговых фишек. И это начинало работать.

Мои ошибки


Поскольку стартап наш был единым целым и мы работали действительно слаженно, то расскажу не о своих ошибках, а об ошибках всех в целом.

  • Стартап, каким бы он не был душевным — это не твоя компания, у него есть владелец. У босса свои взгляды на развитие, которые иногда продиктованы партнёрами и инвесторами. У всех этих ребят есть свои интересы, среди которых классный продукт — не всегда приоритетный. Так что очередной рефакторинг может никого и не обрадовать, как и очередная стратегия развития.

  • Руководитель, отстранившись от команды, получает команду-Олимп: каждый причастный к проекту считает себя «биг боссом» и запускается процесс разрушения. Постепенно разногласия приводят к скандалам, простою в работе, демотивации и увольнениям.

  • Мир не ждёт ваш продукт и не набросится с радостью, если вы его ему предложите. Увы, придётся шаг за шагом доказывать своё преимущество перед конкурентами (если вы не уникальны) или же свою целесообразность (если вы — новое нестандартное решение).

    Бизнес не взлетел с невероятной скоростью, как я на то рассчитывал. Пожалуйста, помогите. (PayPal принимаю)

  • Хаос и бардак — это ситуация, когда всё вокруг срочное, а важное в пролёте.

Так чему можно научиться в стартапе даже, если он не взлетел?


Правилам бизнеса. Никогда ни в какой компании вы не окажетесь настолько близки к ядру управления: вы можете прочувствовать все особенности бизнеса, узнать то, как работать с контролирующими органами и конкурентами, как выбирать партнёров. Это пригодится в любом случае — зная бизнес изнутри, трудно быть категоричным и проще строить отношения с руководством. Как дополнительный плюс — вы видите развитие компании с самого начала, проживаете все периоды и видите все ошибки и находки.

Навыкам самопрезентации. Вы рассказываете о проекте в питчах перед инвесторами, звоните партнёрам, ищете потенциальных дистрибьюторов и учитесь. Не минует это даже программистов — именно на их плечах лежит «доказательная база» качества, демонстрации продуктов, тестовые установки, доработки и даже обучение продажников преимуществам продукта. Вместе с программным обеспечением (или чем-то другим) вы учитесь презентовать себя, говорить коротко и по делу.


Навыки управления людьми. В стартапе все управляют всеми, каждый выступает в роли внутреннего заказчика и внутреннего же исполнителя. Команду нужно постоянно переорганизовывать под разные задачи, и это путь компромиссов, грамотного менеджмента и самодисциплины.
Ради этого стартапа я начал получать образование переводчика с английского языка и обучился азам web-разработки. Я любил эту работу, искренне верил в то, что мы делали, но предыдущий опыт помог мне раньше остальных понять, что дела не столь хороши, как это звучало на утренних митингах. Стартап стал загибаться от детских и не совсем уже детских болезней. Немалую роль в разрушении неплохой компании сыграли странные партнёры, плачевным фактором оказался податливый СЕО. Мы разошлись, кто куда. Никто не пропал.

Компания «семейного» типа


Через шесть лет с начала своего трудового стажа я примерно знал, что хочу. Меня не влекла новенькая высотка Газпрома, не манили банки, не воодушевлял желанный третью менеджеров города Атомэнергопроект. Я не думал о своём бизнесе, но и в стартап тоже не хотелось — только уволившись, я понял, что там выгорел как нигде. В Регионсофт я попал самым обыденным путём: резюме — собеседование — работа. Но сама работа не совсем стандартная: я довольно редко бываю в офисе, и даже имею своё место в другом бизнес-центре. Мне так удобнее географически да и чисто функционально. Так вот, первое, что я заметил — я сразу влился в компанию, как в семью и ещё никогда не было ощущения, что я отдельно, а они отдельно. Выше я уже говорил, что во многом это заслуга руководителя: компания небольшая, его хватает на всех. Ещё одна важная черта — в отличие от «муравейника», где было много людей с дублирующими функциями, здесь каждый ровно на своём месте. Собственно, именно ощущение нужности и полезности, пожалуй, и держит сотрудников по 10-15 лет. Для современного мира такой расклад — редкость.

Итак, что я ждал


  • Я хотел работать на рынке CRM, но не хотел уезжать из родного города. Мне сильно повезло, что в Нижнем Новгороде оказался не франшизный, не загнувшийся, а полноценный вендор CRM-систем с рынком продаж на всё СНГ. В принципе, мы относительно недавно стали активно продвигаться — нам и так хватает работы: большая часть внедрений проходят как интеграционный проект. Мне это нравится, такой процесс гораздо интереснее, чем скучная продажа SaaS-продуктов.

  • Вновь я ждал обучения. Хоть я и работал в ИТ-сфере, и имел определённые навыки и теоретическую базу, мне не хватало знания специфики именно интеграции, автоматизации бизнеса и структуры такого ПО. Единственное, что у меня было — участие в мощнейшем проекте внедрения в телекоме. Я сторонник того, что в софтвере все, от внедренца до пиарщика и продажника, обязаны глубоко знать своё ПО, понимать, как оно работает  на стороне клиента.

  • Развязанные руки — то, чего мне хотелось как профессионалу. Хотелось не просто шагать от задачи к задаче (которые, кстати, у нас прописаны в нашей же CRM), хотелось привносить в работу что-то своё. От предыдущей работы у меня осталось понимание законов бизнеса и его же проблем, а значит, я понимал, каким образом часть этих проблем может решить CRM-ка. И мне хотелось работать именно с позиций выгоды клиента, играть на его поле. Так и вышло.

  • Хотелось быть услышанным. Проблемой первого моего места работы была тотальная глухота к инициативе снизу — линейные начальники и среднее звено просто отшивали все идеи и предложения на корню по понятным причинам. Весь масштаб деятельности ограничивался правильной организацией своих таблиц, расчётов и моделей. А идеи были и с опытом их только прибавилось. Я готов обсуждать каждую из них и активно реализовывать всё, что покажется полезным.

  • Было интересно увидеть чистый В2В. До этого я на 70-90% работал в В2С, и эта сфера казалась мне хоть и интересной, но какой-то однородной: компания предлагала продукт или услугу, а потребитель активно или не очень их покупал. Не было комплексности, а мои задачи поначалу так вообще больше сводились к пост-анализу и текущей информационно-технической поддержке коммерции. В2В — другая история, это многомерный мир, где есть и человеческий фактор, и техническая сторона, и индивидуальные особенности каждой компании. Фактически каждый новый проект — новая работа, 100% не соскучишься.

Мои ошибки


  • Ошибки в работе — без них сложно обойтись, особенно в новой отрасли. Были технические ошибки, коммерческие, коммуникативные. Я «проимел» потенциальных партнёров, не распознал засланца конкурентов и умудрился бесплатно поработать на пару особо втеревшихся в доверие людей. У нас не ругают за ошибки (ну почти), а мне была наука.

  • Непонимание законов автоматизации. Мне казалось, что можно автоматизировать бизнес по частям, а потом уже как-то собирать данные ещё в одной системе. Теперь я знаю, что лоскутная автоматизация и зоопарк систем — зло, этого зла в компаниях много и мне очень интересно менять ситуацию по мере своих сил.

  • Я недооценил ужасы рынка CRM в России. Это, как в старом анекдоте, не ужас-ужас-ужас, но да, ужас. Основные беды: CRM называется всё, что не попадя; менеджеры активно сопротивляются внедрению; бизнес не понимает выгод и никому не верит; конкуренты врут о своих функциях, надеясь «чё-то как-то разрулить»; после неудачных внедрений бизнес не хочет новую CRM; фрилансеры творят ад как он есть.


Иногда бывает и так

  • Я слишком хорошо думал о тех, кто к нам обращался. Бизнес боится автоматизации, не готов анализировать и тем более менять бизнес-процессы. Предприниматели не понимают, что ускорение и оптимизация процессов — это их прибыль. Кажется, все чего-то ждут. Ждать не надо, надо действовать.

Чему можно научиться и что можно получить, работая в «компании-как-семье»?


Стабильный профессиональный рост. С каждым новым клиентом я получаю новый опыт, преодолеваю особые проблемы — ощущается рост, я осознаю себя профессионалом. Это дорогого стоит.

Уважение к навыкам и знаниям — когда ты напрямую взаимодействуешь с генеральным (нет «муравейной» бюрократии), а он умеет слушать и обсуждать, ты понимаешь своё место в компании и чувствуешь ценность. Всегда можно найти применение своим навыкам и, в отличие от стартапа, никто не будет бурно ревновать, что это придумал именно ты. Недостаток один — некоторые решения затягиваются и могут потерять свою актуальность. Учусь воспринимать это философски: значит, не так уж и было нужно.

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

Огромный горизонт развития. Небольшие компании с хорошим продуктом активно борются за рынок в условиях ограниченных ресурсов — им редко приносят деньги в клюве инвесторы, зачастую не хватает рук, чаще всего — времени. Едва ли не каждый из нас мечтает о том, чтобы в сутках было 48 часов. Так вот, спустя уже 10 лет своей непрерывной деятельности могу сказать, что именно такие условия идеальны для развития профессионала. Ну это примерно как сессия, в которую ты узнаешь больше, чем за учебный год. С той разницей, что концентрированные знания и навыки постоянно закрепляются на практике.

Уверенность в команде. Когда команда стабильна, спаяна и знает все цели, для которых она работает, сотрудник чувствует почву под ногами. Без конфликтов не обходится, как и в любом человеческом сообществе, бывает, что и в семье не без урода. Но это воспринимается как обычный рабочий процесс, а не как повод для года сплетен в муравейнике или личная трагедия в стартапе. Вообще нельзя недооценивать важность хороших отношений среди коллег.

Подводя итог, что важно для самомотивации?

  1. Внутреннее ощущение свободы.
  2. Отдача от того, что делаешь — когда видишь результат, работа становится более плодотворной.
  3. Независимость от негативных обстоятельств.
  4. Не нужно любви, пусть на работе будет уважение.
  5. Демократия должна закачиваться у кончика носа каждого.

Не стоит настраивать себя на работу насильно — рано или поздно у вас лопнут струны. Работа не должна быть тянучей скучной обузой, стоит научиться находить лучший опыт в каждой работе и формировать из него свой опыт. С каждым местом работы вы обретаете ценность как профессионал, обрастаете знаниями и умениями. Этот багаж только ваш. Позитивное мышление — фраза избитая, а вещь — клёвая. Важно то, как ты воспринимаешь определённые вещи. Верьте в себя — это не даст ходить по кругу.

Есть работа в Нижнем Новгороде и не только


P.S.: мы ищем программиста Delphi и full stack веб-разработчика в офис в Нижнем Новгороде на полный рабочий день (возможно совмещение с учёбой, возраст также значения не имеет). Всему, что нужно, обучим, доучим и покажем. Звоните, договаривайтесь, приходите — мы не любим расписывать требования, нам нужен кандидат, готовый работать и расти. Резюме шлите на contact@regionsoft.ru Территориально — Сормово.

В других городах РФ и СНГ мы ищем продажников на удалёнке — если с программистскими скиллами, вообще идеально. Писать туда же contact@regionsoft.ru



Нам от компании добавить нечего — свою позицию мы излагали несколькими постами ранее. Поэтому просто опрос.
Вам нравится ваша текущая работа?

Проголосовало 80 человек. Воздержалось 11 человек.

Вы работаете в…?

Проголосовало 70 человек. Воздержалось 16 человек.

Когда вы шли на первую работу, что вам было важнее всего?

Проголосовало 78 человек. Воздержалось 10 человек.

А сейчас что для вас важнее?

Проголосовало 79 человек. Воздержалось 10 человек.

Если снова начать, ваш выбор?

Проголосовало 75 человек. Воздержалось 13 человек.

Что вам наиболее интересно из нематериальной мотивации?

Проголосовало 75 человек. Воздержалось 11 человек.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332800/



Поиск сообщений в rss_rss_hh_new
Страницы: 1437 ... 1046 1045 [1044] 1043 1042 ..
.. 1 Календарь