• Об IT образовании. Образование глазами студента

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

    Преподаватели


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

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

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

    Читать дальше →
  • Greedy algorithms and proof of correctness (part 1)

    Это цикл статей о том, как распознавать задачи, решаемые жадными алгоритмами, писать строгие доказательства корректности этих алгоритмов, а также о том, как распознавать задачи для которых жадные алгоритмы не применимы.

    Вступление


    О жадных алгоритмах многие знают еще со школы с университета. В любом курсе по алгоритмам выделена хотя бы одна небольшая глава посвященная жадным алгоритмам. В частности, в книге Томаса Кормена «Алгоритмы. Построение и анализ» освящается эта тема.

    В данной статье будет одна задача, для которой будет приведено строгое доказательство на почти формальном математическом языке.
    Читать дальше →
  • OSPF, RIP и BGP простым языком. Часть 1. Протокол RIP

    Введение


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

    Маршрутизация


    Маршрутизация сама по себе — поиск маршрута доставки пакета между сетями через транзитные узлы — маршрутизаторы, которые позиционируют себя как многофункциональные устройства для разделения сетей. Вся сеть интернет разделена на крупные автономные системы (AS), которые связываются и узнают друг о друге с помощью внешних протоколов маршрутизации,
    Читать дальше →
  • Автоматическое переключение на резервный 3G средствами Windows

    Хочу поделиться своим опытом настройки автоматического перехода на резервный интернет 3G, когда основной пропадает, и возврата на основной, когда он заработает. Все это реализовано стандартными средствами Windows.

    Задача была — обеспечить постоянное наличие интернета на майнинг ферме. Усердное гугление ничего не дало. Интернет пропадает очень редко, потому покупать Mikrotik или другие железки желания не было.

    Имеем проводной интернет (или wi-fi) и 3G свисток.

    Вся настройка сводится к подключению 3G свистка и настройки коммутируемого подключения. Далее скрипт в .bat, который кладем в авто запуск.
    Читать дальше →
  • Вступление в архитектуру React Fiber

    Это перевод статьи Andrew Clark. Оригинальная статься здесь.


    Вступление


    React Fiber — прогрессивная реализация ключевого алгоритма React. Это кульминационное достижение двухгодичных исследований команды разработчиков React.


    Цель Fiber в увеличении производительности при разработке таких задач как анимация, организация элементов на странице и движение элементов. Ее главная особенность это инкрементный рендеринг: способность разделять работу рендера на единицы и распределять их между множественными фреймами.


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

    Читать дальше →
  • Предложение от ИТ сообщества к властям Российской Федерации

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

    Привет, читатель.

    Важно для прочтения!
    Если ты не против, то изучи ООП и Jav'y прежде, чем учить другие библиотеки. Ибо ты не будешь браться за физику, не выучив математику. Тут то же самое.

    Сегодня мы будем писать простейшего бота Telegram, который будет отвечать на команды. Такая статья была, но писали бота на Питоне.

    Почему я выбрал именно Jav'y
    Java в плане ботов, серверов, плагинов да и вообще программ будет удобнее для меня.

    1. Виртуальная машина хоть и долгая, но если обрабатывать события в несколько потоков, то будет работать быстро.(Вообще для многих серверов/мультиплеерных игр в одном потоке не всегда получится обрабатывать события, в Jav'e сделать это гораздо проще)

    2. Наличие хорошей документации и Javadoc'ов, которые можно сделать для всех библиотек(не только для системных)

    0. А что такое «бот»?

    Бот — это профиль в соцсети/мессенджере(в данном случае Telegram) который отвечает на команды.( В любом случае все действия буду происходить после выполнения команды)

    Тип чата с ботом — это переписка 1 на 1.

    1.С чего же начинать?

    Здесь качать библиотеку Telegram(обязательно with-dependiciens)

    IDE можно выбрать любую, я бы порекомендовал eclipse.

    Импотрируем библиотеку Телеграма и приступаем.
    Читать дальше →
  • Передача массива в функцию, подсчет длины массива по указателю

    В С++ существует несколько возможностей передачи массива в функцию.


    1. В С++ массивы можно инициализировать следующим образом:

      int arr[] = {p1, p2, p3, ...}; // длина массива определяется 
      после инициализации

      Как следствие, его можно передать в функцию таким же способом:

      void func(int arr[]){
      //your code
      }
    2. Еще один вариант — передать массив по указателю. Например:

      void func(int* arr){
      //your code
      }
      int arr[5] = {1, 2, 3, 4, 5};

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

      int main(){ 
         int arr[5] = {1, 2, 3, 4, 5};
         cout << arr << endl; //в данном случае мы увидим адрес начала массива 
          return 0; //его мы и передаем в массив
      }

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

    void func(int* arr, int length){
    //your code
    }

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

    int len(int* arr){
        int count = 0;
        while(*x++ < ?) count++;
        return count;
    }
    

    Крайне важно понять критерий по которому мы будем оценивать содержимое. В противном случае, можно получить не совсем то, что ожидалось.
    Читать дальше →
  • Криптовалюта и интернет-магазин. История подлючения и немного 54-ФЗ

    Здравствуйте, дорогие хабрачитатели!

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

    Основная задача одностраничных приложений (SPA) – это коммуникация с сервером, а зачастую и с многочисленными серверами по средствам XHR. Но большинство данных достаточно загрузить один раз. Как это сделать красиво? Способов много. Однако, мы рассмотрим только один, с помощью обещаний Promises.
    Читать дальше →
  • Элегантное решение задачи о спичках [спортивное программирование]

    В этой статье будет описан способ решения одной не очень известной задачи спортивного программирования. Решение требует всего несколько строк кода и очень эффективно, однако требует объяснения.
    Читать дальше →
  • Изменение синтаксиса Free Pascal при помощи макросов

    Речь в статье пойдет о составных операторах begin-end, форматировании кода и синтаксисе языка Pascal. А начнем мы с цитаты из книги Стива Макконнелла «Совершенный код».


    «Большинство споров по поводу форматирования возникает из-за несовершенства большинства популярных языков программирования. Хорошо спроектированный
    язык имеет явную структуру блоков, которая приводит к естественному стилю отступов.»
    Читать дальше →
  • Because of the complexity или кроссплатформенная работа с фискальным принтером Posnet Temo HS FV Ej

    История началась с того, что наша маленькая, но гордая компания решила создать приложение для собственных логистических нужд. Обсудив нюансы работы и обозначив конкретные цели, я приступил к реализации. Спустя некоторое время была написана первая версия java приложения и отдана на растерзание тестирование логистам и сотрудникам склада. Более года все шло хорошо, баги успешно создавались и фиксились, функционал приложения постоянно расширялся и совершенствовался, автоматизируя все больше процессов, пока мы не столкнулись с необходимостью использования фискального принтера Posnet Temo HS FV Ej.
    Читать дальше →
  • Алгоритм подсчета кол-ва расстановок n ферзей со сложностью меньше чем O(n!)

    Пронумеруем строки и столбцы доски размером nxn номерами от 0 до n-1. Номер клетки будет иметь вид (i,j), где i – номер строки, j – номер столбца. Координаты ферзей будут иметь вид (i,p(i)).

    Пускай у нас уже расставлены k ферзей в строках от 0 до k-1.

    Тогда ферзь с координатами (i,p(i)), где i<k, может бить клетки в строке k с координатами (k,p(i)), (k,p(i)-(k-i)) и (k,p(i)+(k-i)), при этом нас интересуют только клетки с номерами столбцов от 0 до n-1.

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

    SV(k)=Sum(i=0..k-1,2^p(i))
    SD1(k)=Sum(i=0..k-1,2^p(i) shr (k-i))
    Если p(i)-(k-i)<0, то 2^p(i) shr (k-i)=0.
    SD2(k)=Sum(i=0..k-1,2^p(i) shl (k-i)) and (2^n-1)
    Если p(i)+(k-i)>=n, то 2^p(i) shl (k-i) будет отброшено при помощи and (2^n-1).
    S(k)=SV(k) or SD1(k) or SD2(k)

    где ^ – возведение в степень, or – побитовое или, and – побитовое и, shl – сдвиг влево, shr – сдвиг вправо.

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

    Если записать рекуррентно, то получится

    SV(0)=0
    SD1(0)=0
    SD2(0)=0
    SV(k+1)=SV(k) or 2^p(k)
    SD1(k+1)=(SD1(k) or 2^p(k)) shr 1
    SD2(k+1)=((SD2(k) or 2^p(k)) shl 1) and (2^n-1)
    Читать дальше →
  • Iodine: улучшенный язык Java

    Это рассказ о новой разработке RemObjects — компании, которая начинала с компонентов для Delphi, а сейчас выпускает целый набор компиляторов Elements для всех популярных платформ: Windows, .NET, JVM, Android, iOS, Cocoa. В набор входят компиляторы с языков Oxygene (клон Паскаля-Delphi), C#, Swift (бесплатный), на любом из которых можно писать для любой указанной выше платформы. И вот теперь в этот список добавляется новый язык — Java. Чем не повод для статьи на Habrahabr?
    Читать дальше →
  • Если не срабатывает свойство translate при css анимации в мобильном Safari

    То, что Safari стал для верстальщиков новым IE6 ни для кого не новость. Сегодня столкнулся с очередным багом, решение которого банально до невозможности, но отняло у меня час рабочего времени.

    Итак, имеем блок, который должен непрерывно плавать вверх-вниз. Сходу пишем стандартный для такой анимации код:

    .block {
    	animation-name: floating;
    	-webkit-animation-name: floating;
    	animation-duration: 3.0s;	
    	-webkit-animation-duration: 3.0s;
    	animation-iteration-count: infinite;
    	-webkit-animation-iteration-count: infinite;	
    	animation-timing-function: ease-in-out;	
    	-webkit-animation-timing-function: ease-in-out;
    }
    
    @keyframes floating {
    	0% {transform: translateY(0%);}
    	50% {transform: translateY(8%);}	
    	100% {transform: translateY(0%);}			
    }
    
    @-webkit-keyframes floating {
    	0% {-webkit-transform: translateY(0%);}
    	50% {-webkit-transform: translateY(8%); }	
    	100% {-webkit-transform: translateY(0%); }			
    }
    
    

    Тестируем и видим, что данный код работает во всех популярных браузерах, кроме мобильного Safari. Причём согласно спецификации он должен поддерживать этот код. Далее замечаем ещё одну особенность. Если перейти в другое приложение или по какой-то ссылке и вернуться назад, то анимация начинает работать. Очень странное поведение Safari. То есть сам код ему понятен, но при обновлении страницы анимация сразу не хочет проигрываться.

    Долгие поиски по различным форумам ни к чему не привели, поэтому решение было найдено методом «научного тыка».
    Читать дальше →
  • ROSA и ОСь репозитории CentOS 7

    Всем привет.

    Хочу с Вами поделиться информацией как к «российским» ОС прикрутить репозитории CentOS и заменить установленные пакеты.

    Всё началось, когда нашу организацию обязали перейти на «российское» ПО. В первую очередь начал искать серверные ОС. Как оказалось наши разработчики предлагают ОС на базе Linux, а в организации 100% windows платформа. Организация не маленькая, примерно 150 серверов только в одном округе.

    После изучения рынка «российских» ОС выбор пал на ROSA и ОСь. ROSA это платная ОС и стоит не маленьких денег, но так как не очень уж хочется платить за воздух я остановился на ОС ОСь. Далее начинается самое интересное далее. У ОСи добавлен репозиторий от РосТех и в версии пакетов добавлена как правило одна буква:

    1. Пакет от ОСи — openssh-6.6.1p1-33z3.el7.x86_64
    2. Стандартный пакет CentOS — openssh-6.6.1p1-33.el7.x86_64

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

    Все действия я делал на ОС ОСь minimal.

    В общем решение этой проблемы следующее:

    1. Необходимо закоментировать существующие репозитории.
    2. Создать новый файл с CentOS'совскими репозиториями.

    vi /etc/yum.repos.d/centos7.repo

    Вот сам файл centos7.repo
    Читать дальше →
  • ЭВМ

    Россия, Иркутск, 1990 год, ДК «Юный техник»

    Каждый вечер мальчишки с нашего района собирались в ДК «Юный техник», который находился на первом этаже обычной пятиэтажки и слушали лекции Виктора Анатольевича, записывали самое важное и зарисовывали схемы, а после с пионерским рвением выпаивали резисторы и транзисторы со старых плат, и раскладывали их по специальным деревянным коробочкам. Все шло своим чередом, уже скоро мне, ученику первого класса, разрешат паять первые простенькие схемы.
    Читать дальше →
  • Торговые боты как биосистема

    Я написал своего бота для торгов на бирже bittrex через API с нуля. php+MySql. В части статей опишу сложности, с которыми столкнулся, как их решил, и что осталось нерешенным.

    2 бота реально торгуют. Еще 16 виртуально. В условиях без «катастроф» (типа валюта перестала существовать и теперь стоит 0, или биржа накрылась) и при той волатильности что есть сейчас — прибыль около 0,05-0,25% в день.
    Читать дальше →
  • Вывод иерархических данных DataObjects в DevExpress GridControl

    Понадобилось нам выводить данные в виде дерева.
    Причем, надо выводить не одно поле, а несколько. Поэтому стандартный TreeView подходит плохо.
    В программе использовался WPF и компоненты DevExpress. Там есть навороченный GridControl, предоставляющий в числе прочего просмотр данных в виде дерева. То есть на первый взгляд проблема на полчаса.

    Читать дальше →