• Как вернуть мотивацию к обучению?

    При повторной потере мотивации алгоритм следующий:
    1) Идем высыпаемся. По-нормальному так, без будильников. Чтоб глаза вообще больше не закрывались.
    2) Если мотивация не вернулась (возвращается в 70% случаев) - берем велик (хотя можно и пешком) - и на улицу. Если есть приличный парк в городе - находим пару нестандартных физ. упражнений (можно боевых), пытаемся выполнить. Работа с телом и физические нагрузки - это совершенно другая часть вашего сознания, про нее нужно не забывать.
    3) Если мотивация не вернулась (уже где-то 85% случаев) - берем случайную книгу (не техническую), в идеале - из жанра который вам нравится. Читаем. Спокойно, страницы не считаем.
    4) Если не вернулась, повторить с п. 1 до пяти раз, не думая о времени и выполняя только самые важные дела (срочные задачи по учебе, работа, если есть), можно даже попросить родных/знакомых помочь по дому и бытовым делам, чтобы себя разгрузить.
    5) Если не помогло после 5 раз, задаем новый вопрос на тостере, подробно описываем что делали).

    Хотя бы один из п. 1-3 выполняем для профилактики каждый выходной.
    P.S. в принципе плохо сравнивать себя с кем-то - для "сравнения" на свете есть всякие соревнования и состязания, где есть правила и контекст. В жизни правил нет, один учится в MIT, другой учится в колледже в России - какие могут быть сравнения? Вы думаете тут большинство людей за один год все узнало и всего добилось? Вы глубоко заблуждаетесь) PHP-шники-выскочки не в счет, у них искаженное представление о реальности.
    Ответ написан
    11 комментариев
  • Есть ли книга по Python НЕ для новичков?

    abs0lut
    @abs0lut
    Может, что то из этого подойдет:
    раз
    два
    три
    четыре
    пять
    Ответ написан
    Комментировать
  • Стоит ли переходить с CodeIgniter на современные фреймворки?

    evnuh
    @evnuh
    Поиск Гугл помог мне, впусти и ты его в свой дом
    Автору вопроса советую внимательно прочитать все ответы и найти хоть один объективный минус CI (не субъективный) из названных. (в том числе спросить их у вашего советчика, который вам посоветовал уйти с CI)

    - "В Модели тупо пишешь методы работы с базой"? Вы серьезно? И всё? А, простите, вы как хотели? Хотели автоматический биндинг на поля из базы? Сомневаюсь, что найдётся приложение, которое бы не нуждалось в фильтрации / преобразовании полей и правильного разворачивания связей между таблиц без ручного кода. Покажите мне модели в Yii для среднего размера сайта, там костылей на фильтрацию и преобразование полей для базы ещё больше, чем бы вы в CI ручного кода написали.

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

    CI предельно прост, он и есть тот самый "фреймворк", который не додумывает за тебя, а позволяют самому всё реализовать. Отсюда его скорость, легкость в освоении и предельно понятный код.

    Ну и плюсом ко всему - он абсолютно не устарел. Недели две назад релизнулась 3 версия, коммиты каждый день. Или вас так пугает отсутствие неймспейсов и PSR?
    Ответ написан
    2 комментария
  • Как в Django css подключать изображения?

    pavel_salauyou
    @pavel_salauyou
    Symfony2 & Angular разработчик
    указывайте относительный путь к картинкам
    Ответ написан
    Комментировать
  • Golang: как работает тип func?

    Tyranron
    @Tyranron
    Во втором варианте вроде как так. Чтобы объявить тело функции, нужно использовать ключевое слово func и никак иначе, что разумно по своим причинам. Как минимум, Вам не нужно помнить и держать в голове какая сигнатура кроется за каким типом, когда Вы смотрите на тело функции, то есть для каждого тела функции видно явно что оно должно принимать и возвращать. К тому же, дополнительная гибкость (в данном случае: объявление функции через алиасы типов, а не ключевое слово func) - это всегда удар по производительности, в данном случае - вероятное повышении времени компиляции, а для разработчиков языка это один из главных факторов, потому они очень и очень придирчиво относятся ко всем введениям и возможностям компилятора. Вон, от них даже дженериков никак допроситься не могут. Более того, выгода от возможности объявлять тело функции через алиасы типов (type aliases), а не ключевое слово func, крайне сомнительна, Вам так не кажется? К тому же не стоит путать объявление типа и объявление функции. Логично, что всегда сначала должен быть объявлен тип, а потом уже сама функция/переменная/структура, просто синтаксис языка позволяет сократить писанину. А Вы в данной ситуации хотите обойтись только созданием типа. А как тогда будете именовать входные параметры функции при её объявлении, если таковы имеются?

    Выгода же абсолютно такая же, как и при других вариантах применения алиасов типов. В первую очередь - это возможность дополнительного контроля типов.
    Например: Вы разрабатываете библиотеку (свой package) и Вам нужно, чтобы какая-то функция получала на вход только те функции, которые определены у Вас в библиотеке и никакие другие. Тогда Вы создаете алиас типа на сигнатуру функции и делаете его невидимым для внешних потребителей (объявляете с маленькой буквы).
    package mylib
    
    type someFunc func() bool
    
    var (
    	Apple someFunc = func() bool {
    		return true
    	}
    	Dog someFunc = func() bool {
    		return false
    	}
    )
    
    func Consume(f someFunc) {
    	f()
    }

    После этого внешний потребитель не сможет вызвать функцию Consume() передав туда какую угодно функцию, а только те функции, которые Вы ему приоткрыли.
    package main
    
    import "mylib"
    
    func main() {
    	externalFunc := func() bool {
    		return true
    	}
    	
    	mylib.Consume(externalFunc) 	// fail
    	var extF mylib.someFunc		// fail
    	
    	mylib.Consume(mylib.Apple)	// success
    }

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

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Вот пара линков полезных: citforum.ru/programming/unix/sockets/ и allasm.ru/set_12.php
    В целом логика под виндой и никсами одинаковая. Самое «сложное» в веб сервере — работа с сокетами. Работает примерно так:
    1. Инициализируем сокеты;
    2. Создаем (socket) — ОС выдаст нам новый сокет;
    3. Настраиваем сокет (setsockopt);
    4. Ассоциируем (bind) этот сокет с айпи и портом;
    5. Начинаем «слушать»(listen) сокет — вообще, слушает ОС, а мы только обрабатываем данные;
    6. В цикле принимаем (accept) соединения — accept возвращает управление и новый сокет как только появится запрос на указанные ранее порт и айпи (иначе INVALID_SOCKET вернет);
    7. Начинаем асинхронный(для проверки/тестов все можно и в одном потоке делать) прием данных (recv) из полученного сокета;
    8. Обрабатываем принятые данные.
    9. Отправляем ответ (send);
    10. После окончания приема закрываем сокет;
    11. Возвращаемся в начало цикла — пункт 6.
    Само собой при асинхронной обработке цикл будет только получать новые сокеты и отдавать их «воркерам» — рабочим потокам.
    В скобках — вызовы апи сокетов, под линуксом почти все то же самое.
    Под виндой все сокеты в Ws2_32.dll.
    Если что непонятно — отвечу в меру своих знаний 8)
    Ответ написан
    1 комментарий