четверг, 6 октября 2016 г.

Уже лучше

Весь вечер изучал английский, писал задачки на C и читал книжку по программированию (на Паскале =__= ). Когда уже этот Паскаль закончится и начнётся, наконец, C...

Изучение английского по-прежнему идёт неторопливо. На последнем уроке проходили причастия (ing-овые формы глаголов).
Так как записи IT-подкастов прослушиваю очень быстро, то скачал себе аудио-курс английского "по методу доктора Пимслера" - будет, что слушать в те моменты, когда мозги свободны, а видео смотреть нельзя (в дороге или когда занят физическим трудом).
Ещё хочу закачать себе в плеер каких-нибудь детских или адаптированных для изучающих английский язык аудио-книжек. Хорошо, если к аудио-книжкам будут прилагаться их печатные версии.
Заметил такую интересную вещь про изучение английского языка: есть много разных курсов, но ни одного отзыва о том, что кто-то смог выучить по ним английский. Интересно, я смогу стать первым в этом? ))

Все из 20 задачек на C решил. Правда, без заморочек с проверкой вводимых данных, как на углублённых курсах по C. Сначала хочу просто научиться нормально писать код, чтобы не "спотыкаться" на элементарных вещах вроде использования правильных типов данных.
Ну, вроде уже неплохо получается. Компилятор с флагом -Wall уже редко выдает предупреждения или сообщает об ошибках. Да и те совершаю, скорее, по невнимательности при copy-paste кода из одной части программы в другую и быстро нахожу и исправляю.
Так что берегись, молодёжь! Скоро (через пару лет, надеюсь) на рынок труда выйдет дядя Миша.

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

До        После

среда, 5 октября 2016 г.

Свет решает всё

Вчера в середине рабочего дня до вечера отключили электричество у всего нашего микрорайона. И "жизнь" в нашем офисе замерла. Сегодня придётся выполнить двойную норму по забиванию букв в электронные документы. ))

Особых новостей по учёбе нет. Вчера нагло отложил на потом все курсы и книжку и решил догнать участников курса "Научное мышление". Этот курс идёт с сентября 2016 года по январь 2017 года. И я отставал в его освоении на 1 месяц. Вчера всех догнал. Теперь смогу в спокойном режиме изучать этот курс по выходным в качестве "разгрузки" для мозга.

Вечером буду решать задачи по программированию на C из нового курса, изучать английский и читать книжку по программированию (снова этот Паскаль...).

А к тестовой задаче я всё-таки когда-нибудь вернусь... ))

До        После

вторник, 4 октября 2016 г.

Баба с возу

В общем, попробовал я вчера и так и эдак тестовую задачу порешать, и снова ничего у меня не вышло. Вот мой последний вариант:
#include <stdio.h>
#include <math.h>

int main ()
{
unsigned long long int tn, n;
int kаka;
if (scanf ("%llu%*c%d", &tn, &kaka) !=1) return 0; //по условиям задачи при ошибке должен возвращаться 0
if (tn > 0 && tn <= 9223372036854775807) unsigned long long int n = (sqrt(1+8*tn)-1)/2;
if ((n*(n+1)/2) == tn) printf ("%llu\n", n); //последняя проверка (на всякий пожарный)
    return 0;
}
И почему-то дальше 3 теста (а всего их 12) задача не прошла. На третьем тесте вместо номера треугольного числа программа почему-то выдает всякие непонятные числа (в основном, дробные). Даже в том случае, когда на вход ей подают "правильное" треугольное число, а не всякий мусор.
В комментариях к задаче многие писали, что в этом случае их спасало декларирование long double n. Я попробовал. Не получилось. Понял, что у меня проблема с типами используемых переменных. Что ж, будем изучать основы дальше.))
А от курса "Углублённое программирование на языке C" я отписался. Либо не время мне ещё этим курсом заниматься по причине недостаточности знаний, либо курс построен не совсем правильно, так как тестовое задание не соответствует предшествовавшему ему лекционному материалу. В любом случае, на нынешнем этапе моего обучения этот курс не даёт мне новых знаний и отнимает немало времени.
Что ж, как говорится: баба с возу - кобыле легче.

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

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

До        После

понедельник, 3 октября 2016 г.

Информация

Выходные прошли в "информационном угаре". Помимо новых лекций по программированию на языке C изучал также основы работы с Visual Studio Code в режиме: скачать-установить-запустить-настроить. Вроде бы всё получилось установить, настроить и даже подключить к git (правда, непонятно пока, когда мне этот git пригодится). Осталось научиться с ней работать ))

Продолжаю думать над решением тестовой задачи. От идеи передачи программе числа как аргумента решил отказаться.
Писать очередной вариант решения задачи пока не берусь, т.к. всё ещё есть парочка вопросов, на которые пока не знаю ответа. Как только получу знания, достаточные, чтобы ответить на все свои вопросы, то обязательно допишу решение. Для этого нужно более основательно изучить работу функции scanf(). В частности, как она реагирует на то, что ей пытаются "скормить" больше символов, чем она способна принять.
Например, мне нужно, чтобы она принимала строку не более, чем из 10 символов. Но что, если ей подсовывают 11 или больше? Как я узнал, лишние символы scanf() оставит для следующего ввода. Но непонятно пока, просигнализирует ли она о том, что на вход ей подали больше, чем нужно, или нет.
 Хотя... можно попробовать обойти этот момент так: сказать  scanf(), что можно принять до 12 символов, а потом самому проверить: если поступило больше 10, то была попытка ввода большего числа символов, чем нужно. Попробую сегодня что-нибудь написать на эту тему, а то если ничего не писать, то так и "квалификацию" потерять недолго.))

Немного огорчает книжка, которую читаю. В ней автор всё больше и больше "закапывается" в Паскаль и при этом сам не перестаёт напоминать, что Паскаль - это не тот инструмент, который нужно изучать для профессиональной разработки, и, что скоро автор перейдёт к описанию языка C. У меня тогда вопросы:
- зачем были нужны 200 страниц текста о программировании на Паскале?
- почему бы сразу было не перейти к программированию на C и не показывать все примеры на нём?
Так что пока "продираюсь" в книжке через Паскаль к C. ))

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

До        После

пятница, 30 сентября 2016 г.

Взгляд в "будущее"

Как много можно узнать, "заглянув в будущее"?
Можно, например, узнать, что есть такая функция, как strlen(), которая поможет мне точно и без лишних заморочек ответить на вопрос, сколько элементов в массиве символов.
Осталось только разобраться, что там происходит с символом конца строки (учитывается ли он при подсчёте или нет), и можно сказать, что ещё один шаг в решении задачи пройден.
Ура, что ли? ))

До        После

Учимся

Вчера вечером меня осенила "гениальная" идея по поводу решения тестовой задачи. Еле сдержался, чтобы не бросить учёбу и не продолжить решать задачу.
И правильно сделал. Потому что сегодня утром до меня, наконец, дошло, что это решение было неправильным.
Всё-таки, наступив пару раз на "грабли", я хоть чему-то, да научился. ))

Краткий отчёт по учёбе:
По языку C - последняя лекция оказалась сложной. Было много новой информации, вызвавшей много новых вопросов, и мало времени над всем этим подумать. Нужно будет повторить её ещё раз.
По английскому языку - продолжаем изучать способы образования прилагательных. Здесь по-прежнему пока всё идёт ровно и без особого напряжения.
Книжка по программированию - "завяз" в районе 300-х страниц. Автор начал приводить много примеров на языке Паскаль. Приходится разбираться и прикидывать, как всё это могло быть сделано на языке C. Что интересно, некоторые из примеров в книге можно использовать для решения моей злополучной тестовой задачи, но только на языке Паскаль, т.к. в языке C таких команд нет. ))

Хм... Меня только что снова осенила "гениальная" идея по поводу решения тестовой задачи.
Сегодня вечером нужно будет её проверить. В следующем сообщении обязательно напишу, что у меня получилось.

До        После

четверг, 29 сентября 2016 г.

Ещё раз на те же грабли

Несмотря на то, что я два дня назад "попрощался" с тестовой задачей до лучших времён, вчера вечером снова за неё взялся. На этот раз решил передавать треугольное число в функцию main() в качестве символьного параметра (второго в скобках):
int main (int argc, char * argv)
"Бился" над этим способом до 00:00 часов. "Разбился" о непонимание  того, как подсчитать в переданном массиве символов число его элементов. Наугад попробовал разными методами через sizeof и деление, но ничего не вышло. Либо компилятор выдавал ошибку, либо  программа считала, что есть только один элемент в переданном массиве символов.

Итог "битвы" такой: 2:0 - в пользу задачи, плюс пропущенные по одному уроку программирования на C и английского языка. ))
На выходных придётся снова поднажать с учёбой.

Ещё сегодня полазил по сайту "Лаборатории Касперского". У них, оказывается, есть интернатура (стажировка) для студентов 3 - 4 курсов. Очень расстроился, когда узнал, что это работает только в г.Москве и у меня не получится курсе на 3 - 4 постажироваться удалённо.
Ну, ничего. Думаю, через пару-тройку лет обязательно найду себе место для стажировки.

До        После

среда, 28 сентября 2016 г.

Идём дальше

Итак, первое фиаско позади. Идём дальше.
От "медленного" курса по C осталась одна лекция и начнём изучать "быстрый" курс по C.
По английскому сейчас изучаем местоимения и читаем детские стишки для отработки правильности чтения.

Вчера мне позвонил одноклассник с необычной просьбой. Ему пришёл из Китая новый смартфон и он не может установить в него сим-карту. Точнее, её есть куда вставить, но смартфон её не "видит". Попросил меня помочь. ))
В чём вопрос? Что не сделаешь для лучшего друга? Привози!
Поглядим, что там за чудо китайской техники такое, в которое сим-карту можно вставить как-то неправильно. )) Заодно угощу товарища домашним салом (много его что-то скопилось).

Ещё "новость" в тему смартфонов: в день выхода iphone 7  у жены сломался старенький iphone 4S (не работает wi-fi). Вот, теряюсь в догадках, что это может быть: желание жены купить новый iphone, желание Apple, чтобы моя жена купила новый iphone или всё-таки желание iphone 4S уйти "на покой"?
Моя Королева вроде как вне подозрений, так как новый смартфон она хочет не от Apple.
Для Apple такие "шутки" nj;t вроде как не совсем характерны и мелковаты. Раньше за ними такой прямолинейности не замечал. В основном, с выходом каждого обновления iOS iphone 4S просто начинал больше тормозить. В итоге, к последнему обновлению от той скорости работы, из-за которой он в своё время покупался, осталась только "тень отца Гамлета" (сплошные "тормоза"). ))

Сейчас много читаю в Интернете статей и новостей на тему IT и пополняю по ссылкам из них свою коллекцию книг. Когда я всё это буду читать? Ничего, прорвёмся. У нас, ведь, ещё "1000 лет на Земле". )) Возможно, какие-то из книг войдут в мой так называемый "долг знаний".

До        После

вторник, 27 сентября 2016 г.

Фиаско №1

Почему №1? Потому что уверен, что их будет ещё очень много. ))

Вчера вечером занялся решением первой тестовой задачи на продвинутых (углублённых) курсах программирования на C. Задание было такое: написать программу, которая находит номер введенного целого положительного треугольного числа в диапазоне от 1 до 9'223'372'036'854'775'807.

Написал целых три программы.
Как решал:
1. Определил, что числа в диапазоне от 1 в 9'223'372'036'854'775'807 входят в множество long long int чисел.
2. Поверхностно изучил функции scanf() и sqrt().
3. Поверхностно изучил операторы цикла for, while и ветвления if - else.
4. Почитал, что такое треугольные числа и как они рассчитываются.
5. Написал первую программу, которая в цикле while требовала ввести правильное треугольное число, проверяла его на соответствие диапазону исходных данных и вычисляло его номер.
6. Подумав, решил от цикла while отказаться - его, ведь, не было в условиях задачи. Написал программу без цикла, с диалогами на английском:

#include <stdio.h>
#include <math.h>

void checkNumber (const long long int * const ptr)
{
     int n = (sqrt(1+8* (*ptr))-1)/2;

     if (*ptr > 0 && *ptr <= 9223372036854775807 && (n%1) == 0 && (n*(n+1)/2) == *ptr)
        {
          printf ("The number of this triangular number is: %d\n", n);
        }  else
        {
          printf ("It's not valid number.\n");
        }

      return;
}

int main (void)
{
     long long int triangularNumber;
     long long int *triangularNumberPtr = &triangularNumber;
     printf ("Input positive triangular number: ");
     scanf ("%lli", &triangularNumber);
     checkNumber (triangularNumberPtr);

     return 0;
}

Использовал в программе указатели, чтоб было вроде как "правильнее".
7. Отправил программу на проверку и дальше третьего теста она не прошла.
Уж не помню, какие там ошибки автотест выдавал, но смысл был в том, что диалоги в программе не нужны.
8. Убрал диалоги, указатели и прочие "красивости":

#include <stdio.h>
#include <math.h>

int main (void)
{
     long long int tn;

     scanf ("%lli", &tn);
     long double n = (sqrt(1+8*tn)-1)/2;

     if (tn > 0 && tn <= 9223372036854775807 && (n*(n+1)/2) == tn) 
    {
         printf ("%Lg\n", n);
    }

      return 0;

}

Для переменной n использовал тип long double, так как дальше 5 теста пройти не смог, а в комментариях к задаче другие программисты написали, что тесты не проходит в том числе если тип этой переменной будет не long double. Короче, сделал сам точно не знаю, что и программа всё равно в тестах далеко не ушла.

В консоли работает нормально, если вводить в неё более-менее нормальные данные. Такие "числа" как 1.5,  21/5, 41,5, 23a программа принимает как валидные и первые цифры таких чисел (1, 21, 41, 23) определяет для себя как введенное число, которое нужно проверить на "треугольность" и вычислить его номер.

Погуглил на тему проверки валидности вводимых данных, но все решения были или на непонятном мне C++ или представляли собой тупой посимвольный перебор по алфавиту.

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

В связи с этим немного удивляет содержание той части курса "углублённого" программирования на C, которая предшествовала задаче (массивы, указатели и организация работы с памятью).

Ситуация очень напоминает оставленную кем-то в комментариях к задаче шутку:
"Обожаю наши методички по лабам C++!
Это винтик, это отвертка, винтик можно крутить отверткой. Это всякие железяки, их можно соединять винтиками, закрутив отверткой. Еще бывают гайки и шестеренки.
Задание: Постройте синхрофазотрон".

Ну, что ж, изучать мне ещё "методички" и изучать.))

Развлекусь пока созерцанием скриншота своего рабочего стола:



До        После

понедельник, 26 сентября 2016 г.

Традиция

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

Мне кажется, что, единственным достоинством "медленного" курса по программированию на языке C является низкий "порог вхождения" - подробно объясняется, как и с чего начать. Возможно, после того, как этот "порог" был пройден, мне нужно было переходить на "быстрый" курс. Уже, глядишь и прошёл бы все необходимые операторы.
Ну, ничего.  От "медленного" курса осталось всего два урока и начну проходить "быстрые" курсы с более академическим подходом в преподавании. Начну сначала. Заодно, повторю уже пройденное на "медленных" курсах. ))

Сегодня попробую написать тестовую программу из продвинутого курса. Посмотрим, что у меня получится, и, сколько это займёт времени.))
Сильно торопиться не буду, так как, в любом случае, продвинутый курс начался 23 августа, а я к нему присоединился только 23 сентября. Хотя, мой азарт может победить здравый смысл и заставить вступить в "соревнование" с самим собой. ))

На английском всё идет ровно. Изучили местоимения. Этот курс пока что не отнимает у меня много умственных сил, так как в ответ на получаемые на каждом уроке знания у меня в памяти "всплывает" воспоминание о том, что я это уже изучал когда-то раньше. А вспоминать мне всегда было гораздо легче, чем изучать с нуля.

В первом томе книги А.В. Столярова "Программирование: введение в профессию" я уже где-то в районе 280 - 300 страницы. В этом месте в книге автор рассказывает про язык программирования Паскаль, приводит примеры решения на нём некоторых задач. Синтаксис этого языка я не стараюсь запомнить наизусть. Мне достаточно простого понимания того, что делает написанная на нём программа. До Паскаля автор кратко прошёлся по основным командам bash и клавиатурным сочетаниям текстовых редакторов vim и nano. 
Ещё раз повторюсь, книга очень интересная и информативная и, в отличие от книги Дж.Сомнеза "Путь программиста", полностью соответствует своему названию.

По итогам результатов своих экспериментов с Window Managers, я решил пока что оставить себе Openbox. В нём достаточно много работы для клавиатуры и есть возможность в случае чего "пощёлкать" мышкой.  Теперь мой рабочий стол выглядит пустой экран с курсором - ни обоев, ни иконок, ни панелек, ни виджетов. Осталось только настроить запуск терминала одной кнопкой. Займусь этим после того, как напишу тестовую программу для продвинутых курсов по C.
В качестве менеджера файлов поставил gnome commander. В нём также можно работать с клавиатуры или мышкой. Понравилось, что в  gnome commander для файлов можно открывать контекстное меню ("открыть с помощью" и другие подобные функции) и переименовывать файлы привычным нажатием клавиши "F2".
Как-нибудь выложу здесь снимок рабочего стола.

До        После