IWasHere: релиз, диплом и мысли

Всем привет! Что ж, в предыдущей записи я постарался вложить все 2,5 месяца дневников разработчика в одну запись. Что мне, в принципе, удалось. Ну… хотя бы потому что в конце апреля-начале мая была сессия и дипломом я мало занимался. Мало, но всё-таки занимался. Сегодня мы обсудим релиз проекта, защиту диплома и еще некоторые мысли перед финальным подведением итогов последних четырех лет.

Релиз проекта
Релиз состоялся 12 июня на сайте http://iwshere.xyz(кстати, я тут вчера немного довёл до более подходящего состояния главную страницу сайта, ну почти довёл). Приложение было собрано и подписано релизным ключом, и выложено на сайте для скачивания. Регистрация в приложении доступна абсолютно всем, бесплатно и т.д. и т.п. Разве что некоторые ошибки могут встречаться о них можно сообщать мне на адрес email, который я вчера опубликовал на моём канале в Telegram.

Защита и что после неё
Защита у меня была 14 июня. В целом, она прошла неплохо. Ну, если не считать мандражки перед самим выступлением. А выступал я аж 6-м по счету. Так что да, мандражка была долгая. Впрочем, за это время я таки успел выучить речь(да, я написал речь заранее!) и озвучить её даже без единого подглядывания в телефон.
В целом же комиссия на защите не свирепствовала. Не, вопросы конечно задавали разные, и заковыристые тоже, но большинству поставили пятерки и поздравили всех с защитой. Ну а после того, как защитилась вся группа были посиделки с чаем на кафедре, а затем посиделки в ресторане с друзьями, после которых моя маман чуть не унюхала от меня запах кальяна. Ну или хотя бы тех новомодных сигарет с ягодным вкусом, что мне как-то по акции впихнули в одном магазине вместе с зажигалкой. Слава тебе, Великий Дарвин, что ни то, ни другое она не пробовала и ей не с чем было сравнить запах. В общем да, ехать в тот же вечер к родным было не очень хорошей идеей. Хотя… после них я таки поехал домой. Ах да, еще забыл сказать, что 14-го я таки успел заценить премьеру «Суперсемейки-2». В целом мульт мне понравился, несмотря на то, что я так и не опубликовал по нему мнение в Телеге.

Что дальше?
Это философский вопрос. Хороший вопрос. Смотря о чем вы говорите. Ну ладно, проект IWasHere вышел и сейчас вполне себе работает. И будет работать, пока у меня не закончится срок регистрации домена и/или хостинга. А пока что… можно успешно закрывать проект в связи с тем, что свою задачу он выполнил. Впрочем, к нему можно будет и вернуться в случае появления такой необходимости.
Что же до меня? 29-го у нас выпускной и после него я пожалуй пойду искать себе подходящее местечко для работы. Из вариантов куда я мог бы устроиться может быть, пожалуй, так и Java-программирование(включая разработку мобильных приложений для Android), так и программирование на PHP(ну или просто Web). В OdinAss 1C-сферу я не хочу идти чисто по личным соображениям, а С-подобные языки я знаю не настолько хорошо, чтобы ими заниматься и тратить своё время на то, чтобы с ними мучиться(а в том же C++ есть с чем помучиться, вроде ссылок, указателей и вообще работы с памятью).
Что же до моего блога? Ну… завтра будет еще одна запись, потом отпуск до 12 июля, в который не будет выходить каких-либо записей здесь или в VK(в телеге может что-то и будет, если уж совсем приспичит). А там посмотрим, ибо до 31 августа все записи в рубриках выходят по особому расписанию, которое выходит в Telegram. Ну и еще есть смысл взяться за некоторые улучшения для блога, наверное. Поэтому каких-либо серьёзных изменений в рубриках до конца года не ждите. Скорее всего, список рубрик сохранится таким, какой он есть сейчас.

Так, ладно, а пока можно посмотреть что-нибудь на ноутбуке. Я бы и онлайн рад, но… у меня дома интернет от Яйца выдаёт стабильный EDGE, поэтому о просмотре видео можно забыть. Сколько я ему там баллов за качество связи в рейтинге поставил? 6? Многовато будет.
Так ладно, чё у меня там по торрентам? И когда я вообще добрую половину всего этого контента скачивал? А главное — зачем? Ладно, ладно, пойду досматривать эту вашу Ледижук что ли.
До скорого.

IWasHere: дневник разработчика. Апрель-Июнь

Всем привет! Что ж, в прошлый четверг был крайне важный день — защита диплома. В целом защита прошла нормально и защитился я аж на «отлично». В принципе, думаю, мой проект этого заслуживает. Вызвало особое недовольство у меня разве что излишние требования к внешнему виду защищающихся. Я вам уже говорил, как сильно НЕНАВИЖУ все эти пиджаки, брюки и галстуки?
Так ладно, раз сегодня нет обещанной рубрики «ОХ*ЕЛИ!», ибо у меня простуда, то выйдет уже, пожалуй, долгожданная запись по моему дипломному проекту. Итак, встречайте дневник разработчика за июнь, релиз и объявление о завершении проекта. Всё в одной записи. Ну или почти в одной. Поехали!

Дневник разработчика. Апрель-Июнь.
Вообще, я когда-то обещал, что буду выпускать дневники разработчика раз в месяц, но последняя такая запись была в конце марта. Ну… Лысый вон тоже обещал не повышать пенсионный возраст, пока он президент, и что? А чем я спрашивается, хуже него? Хотя сейчас он уже скорее Царь, чем Президент, а значит ничего не нарушал. Впрочем, забудьте, ибо в апреле мой блог бОльшую часть времени лежал из-за атак ботов, которые, кстати, не прекращаются до сих пор. В конце мая мне уже было некогда, ибо сроки поджимали, а сейчас уже релиз состоялся. Точнее, он состоялся 13 июня в первом часу ночи 12 июня в 19:29 по МСК, как и было мною обещано [хитрая_улыбка.jpg]. Ну и давайте попробую вкратце описать некоторые функции.
1. Список друзей. Полностью был реализован одним из последних. Возможность просматривать своих друзей в отдельной вкладке, друзей выбранного юзера на странице его профиля. Во вкладке «Друзья» также можно искать других юзеров по их фамилии, имени и адресу Email.
2. Профиль пользователя. Делался ближе к защите преддипломной практики, то есть в конце мая. Суть тоже проста — возможность юзера поменять свои ФИО и номер телефона на специальной страничке. Адрес Email при этом изменить нельзя.
3. Закрытие сессий. После входа в систему приложение хранит сессию очень долго. По умолчанию — 10 лет. Делается это для того, чтобы один пользователь смог идентифицироваться на устройстве и больше этого не делать. Разумеется, бывают случаи, когда необходимо отвязать устройство от аккаунта. Для этого есть функция «Выход», которая удаляет ключ сессии с сервера, удаляет открытый ключ устройства пользователя и закрывает сессию для текущего устройства. Обратная функция «Выйти везде» делает то же самое для всех остальных сессий и ключей, кроме текущей, в которой был отправлен запрос. При прерывании сессии таким образом первый же запрос к серверу на других устройствах выдаст ошибку 401 и пользователь будет перенаправлен на страницу аутентификации.
4. Личные сообщения. Получив напутственный пинок от научрука рекомендацию заняться чем-то важным, нежели редактированием профиля, например картами в геосети, я таки решил реализовать личные сообщения. Ибо через них я таки реализую и отображение метки на карте. С личными сообщениями, конечно, пришлось повозиться. Причём, весьма сильно. Во-первых, их дизайн было решено стырить позаимствовать из VK и Telegram. То есть сначала открывается список собеседников с последним сообщениям от/для них, а по клику пользователь открывает чат, начиная с последнего сообщения. В чате же можно написать новое сообщение и тут же его отправить, либо перейти в профиль собеседника. Фишка в том, что собеседником может быть группа. Сама модель объекта Message была мною хитровыбоена так, что одно сообщение может быть доставлено множеству получателей-юзеров, либо одной группе. Несмотря на всю сложность реализации просмотра всего этого, мне удалось справиться. Затем была реализована отправка сообщений со страницы профиля пользователя. Сразу после мне пришлось повозиться с возможностью поделиться меткой среди друзей или групп. Как уже было сказано, юзер может выбрать кому отправить метку — друзьям или группе. Если первым, то отправитель выбирает всех «взаимных» друзей чекбоксами, добавляет текстовое сообщение и отправляет метку. Если же он хочет отправить группе, то просто выбирает нужную. Вообще, вместо кучи пользователей-друзей для распространения меток лучше использовать именно группы. По основному авторскому видению проекта. Но о них позже.
5. Карты. Собственно, при получении новой метки в окне чата, пользователь кликает на ссылочку и открывает местоположение этой метки на карте. Отдельных мук у меня вызвал интерфейс, а точнее необходимость сделать так, чтобы ничего не выскакивало и не уезжало куда не положено. А поля ввода текста уж очень любят это дело. В общем, карта замещает собой все сообщения в окне чата пока юзер не нажмет кнопочку «закрыть». На этом функционал карт заканчивается. Использовались в данном случае Яндекс. Карты, ибо бесплатно и весьма мягкие ограничения — 25000 запросов в день.
6. Группы. Делалось в самую последнюю очередь, буквально за несколько часов до релиза, поэтому возможны некоторые неявные недоделки. Вроде весьма малофункционального интерфейса. Но в целом добавление и изменение групп реализовано. Плюс еще различные операции с участниками и администраторами.
7. Сквозное шифрование. Прям таки моя гордость. Как уже было сказано, метка может быть зашифрованной и на сервере её текст хранится в виде 16-ричной строки, а на клиенте она расшифровывается при наличии ключа. Вопрос — как можно поделиться ключом так, чтобы метка осталась зашифрованной и сервер не имел доступа к секретным ключам? Ответ прост — RSA. Ключ зашифровывается на всех открытых ключах всех получателей и все шифр-тексты попадают на сервер и затем уже на клиенте приложение находит нужный ключ и с помощью секретного ключа RSA расшифровывает ключ AES от метки. Делается это в классе, отвечающем за отображение сообщений в окне чата. В реализации были некоторые подводные камни, но их решение я тоже нашел с помощью гугла, StackOverflow и еще пары других способов.

Так ладно, продолжим мы обсуждать мой проект завтра, там как раз осталось обсудить релиз и саму защиту, а пока что можно прерваться. Время уже позднее.
Кстати, что у меня там на ноуте посмотреть есть? Ледибаг? Хм…
До скорого.

IWasHere, боты и эмиграция

Всем привет! В этой записи перед началом уже «рейтинга сотовых операторов»(который будет завтра вечером) я хочу прояснить некоторые моменты. Но обо всем по порядку.

IWasHere. В начале мая должен был выйти «дневник разработчика», где я бы рассказал, что я такого интересного сделал за прошлый месяц. На самом деле, там мало чего интересного. Исправление ошибок, некоторые дизайновые улучшения, ворох новых ошибок и другое. Так уж получилось, что в понедельник у нас уже предзащита, соответственно, мне сказали по-быстрому пилить самую неинтересную и формальную часть диплома — текстовую. Энтузиазма у меня на это мало, но делать что-то да надо, поэтому я вчера таки осилил написать 7 страниц по введению и первой главе. В ней, кстати, надо бы еще побольше текста накидать. Наверное. В общем, защита у меня 14 июня, примерно к этому сроку будет релиз. А в конце мая, может быть, выйдут и «дневники». Посмотрим.

Атаки ботов. Вообще, я удивляюсь, как много разных IPшников пытаются взломать сайт. Зачем? Тем более, что теперь меры безопасности усилены(я скачал пару полезных плагинов) и это бесполезно. Впрочем, пусть развлекаются. Главное, чтоб мне не мешали.
А заниматься мне тут, кстати, есть чем. После диплома и отпуска я хотел начать разрабатывать т.н. «Project Darkside» — обновление моего блога, повышающее приватность и защиту. Но об этом позже.

Эмиграция. Наверное, самый сложный на данный момент вопрос. Решение уехать из этой страны было принято еще месяца 2 назад, помнится я об этом писал, по-моему даже в «Идеологии власти». Однако, принятое решение не значит наличие хоть какого-то плана действий. Желание есть, вон на днях в телеге даже поставил срок в 2 года, которого должно хватить на подготовку. По моим подсчетам. За это время я успею оформить загранпаспорт, как-нибудь освоить тот же Fucking English(ибо международный язык все-таки), найти денег и подходящее место. Среди основных вариантов — учеба и/или работа за границей. Однако, не так-то уж просто с имеющимися начальными данными найти подходящий вариант. На самый экстренный случай есть еще возможность запросить политическое убежище в странах Загнивающего Запада или хотя бы Гейропы. Но это уже совсем если прижмёт. Оставаться в этой стране при подавляющем большинстве тупого и поцреотически агрессивного стада мне не хочется. Как там было… «не нравится в России — вали в США». По-жа-луй-ста! С вас билет в один конец, немного денег для получения визы, оформления загранника(5000, между прочим!) и запроса политического убежища и прочих первоначальных расходов.  В таком случае с превеликим удовольствием свалю отсюда. Что? Никто не хочет оплачивать мне билет в один конец? Даже так искренне ненавидящие агентов Госдепа поцреоты? Впрочем, другого ждать и не следовало.

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

IWasHere: дневники разработки. Март

Всем привет! Итак, как вы уже помните, я сейчас занимаюсь работой над собственным проектом. Ну… как занимаюсь… вспоминаю иногда. Подробности о нём вы можете прочитать, например, вот здесь — IWasHere: мизантропичная геосоциальная сеть. А здесь находится предыдущая запись по дневникам разработки. Что ж, с тех пор аж месяц прошел, за это время я, правда, успел пару раз упомянуть некоторые фишки проекта(например, модное на фоне конфликта Telegram с гэбней сквозное шифрование), но всё-таки до полноценных «дневников разработчика» это не дотягивает. Ах да, теперь эта небольшая рубрика будет выходить раз в месяц.

1. Концепция MVP. Собственно, основная концепция при разработке проекта и презентации его первой версии(которая будет во второй половине мая). Название подсказал мне мой научрук в универе, но основной смысл был понятен мне и до этого — для начала реализуется базовый функционал, достаточный для презентации основной идеи проекта. В нашем случае, это будет сама возможность добавления меток, отправки сообщений и создания групп. В данном виде выпускается первая готовая версия приложения и анализируется спрос на него. В случае успеха допиливаются различные свистелки и перделки(«extended version»). В случае фейла проект успешно забывается, ибо потери невелики.

2. Определение местоположения(включая точность). Достаточно много времени пришлось потратить на непосредственно определение координат и улучшение их точности. Был создан класс GPSLocation, реализующий паттерн Singleton, в котором определяется местоположение устройства пользователя. В единственном экземпляре данного класса хранятся и сами координаты, и точность определения местоположения(в метрах).
Использование всех доступных провайдеров местоположения позволяет снизить время определения координат(то есть, время неактивности приложения с момента запуска, ибо первым делом у нас идёт именно определение местоположения) до минимально возможного. При переключении между различными компонентами приложения координаты сохраняются. Также приложение умеет работать в фоне и определять местоположение там.
Определив координаты и точность, приложение отправляет их на сервер, который возвращает все доступные метки, находящиеся в окружности радиуса точности с центром в указанной координатами точке.

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

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

5. Добавление, изменение и удаление метки. Тут всё просто  — заполняешь поле текста, по желанию щелкаешь две галочки(анонимность и шифрование), и метка добавлена. Автор метки может изменить или удалить её, если нужно. Изменению подлежат только текст, а также опции «Анонимность» и «Шифрование». Изменить метку можно в течение часа после её добавления. Удалить — в течение 24 часов. Это сделано ради предотвращения возможных спекуляций. При таком раскладе на одной точке может скопиться огромное множество меток, но и этого можно избежать с помощью небольшой доработки проекта. В будущем.

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

IWasHere: дневники разработки. Февраль

Знаете, а я тут ВНЕЗАПНО вспомнил, что мне надо пилить диплом. А точнее говоря, дипломный проект. Сия внезапность меня настигла вчера ночью, поэтому подкрепившись знатной дозой кофе, я таки до 8 утра просидел за Android Studio. И да, меня до сих пор бесят его вечные тормоза, если что. Впрочем, сам диплом для меня сейчас вовсе не в приоритете, ибо еще конец прошлого года показал, что важным фактором защиты диплома является скорее куча ненужной бумаги и красивые речи, плюс еще люто ненавидимый мной деловой внешний вид. Не, я конечно знаю, что «встречают по одежке», но всё же… Как вы уже догадались, на первое место в приоритетах выходит сам проект. Поэтому в качестве некой систематизации рабочего процесса где-нибудь, скажем, раз в месяц я буду публиковать отчеты о ходе разработки. И нет, это не постоянная рубрика, просто небольшой эксперимент. Может быть, он мне не понравится и продолжать публикацию записи я и не буду. Кто знает.

И раз записи будут выходить примерно раз в месяц, то сегодня я хочу рассказать о том, что я сделал в феврале. Напомню, что на начало февраля у меня был готов сервер(написанный на PHP+Yii2, в качестве базы данных используется MySQL) и даже интерфейс для взаимодействия с ним на клиентской стороне(это делалось с помощью библиотеки Retrofit).
1. Аутентификация. Разумеется, самой первой функцией приложения, которую необходимо было реализовать, стала аутентификация. Как я уже рассказывал, вместо привычной и уже немного устаревающей связки «логин-пароль» я выбрал «email-одноразовый пароль». Причем, одноразовый пароль высылается на адрес email. В будущем возможно применение OAuth, в частности, использование аккаунтов Google, которые есть почти на всех устройствах Android.
Однако, главным принципом любого современного приложения является не только удобная аутентификация, но и возможность хранить сессию сколь угодно долго. Мобильные устройства чаще всего принадлежат одному владельцу и процедура прерывания сессии здесь нужна не так часто, как, например, в браузере. В конце концов, приложение может закрываться системой или юзером много раз, но каждый раз начинать аутентификацию заново в таком случае — просто бред. При этом, сервер должен быть уверен в том, что получает информацию от нужного пользователя и выполняет запросы от имени того, кто этот запрос отправил. Проще говоря, если Б отправил от имени А запрос на сервер по выполнению какого-либо действия, то этот запрос должен быть отклонен. Проще говоря, при каждом запросе клиента сервер должен авторизовать запрос. Для этого используются Cookie. При успешной аутентификации сервер передает клиенту файл Cookie, содержащий уникальный идентификатор и ключ сессии. Ключ случайно генерируется из символов латинского алфавита(строчных и прописных) и цифр. Длина ключа составляет 32 символа. Хеш ключа хранится в базе данных в объекте сессии. В каждом запросе клиент предоставляет файлы Cookie, а сервер, перед тем как этот запрос выполнить, проверяет, соответствует ли переданный пользователем ключ данному хешу.
2. Регистрация. Тут всё гораздо проще — пользователь заполняет 4 поля и регистрируется в системе. Приложение сразу определяет заполнение полей(пока что только сам факт заполнения, о корректности как-нибудь потом поговорим) и отправляет запрос. Сервер отвечает и в случае успеха юзер сразу перенаправляется на страницу аутентификации.
3. Выдвижное боковое меню. Плюшка, сделанная ради интереса. Использовалась библиотека MaterialDrawer. Выглядит неплохо, по крайней мере, на девайсах с 6-м андроидом и выше. На планшете с 5.1, увы, не работает. Надо пилить отдельные костыли
4. Сервер. Периодически дописываются различные методы для сервера. Ибо сначала их было примерно 15, к концу практики их уже стало около 20, а теперь я еще хочу парочку добавить. Соответственно, будет обновляться и интерфейс сетевого взаимодействия в клиентском приложении.

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

По сути, где-то через месяца три уже должна быть защита. А времени не так уж и много, я вам скажу. Впрочем, в сроки я укладываюсь. Наверное. А после защиты… Что делать после защиты? Кто-нибудь знает? Не, в июне-июле я, может быть, отпуск себе организую. А потом ведь надо будет искать, чем заняться. С одной стороны, я давно хотел заняться бизнесом. Особенно было бы хорошо, если в сфере информационных или телекоммуникационных технологий. Ну, той же связи, например. Эта сфера мне интересна(особенно, если мобильную связь вспомнить). Но… бизнес и Россия — вещи мало совместимые. Отдельно хотелось бы продолжить изучение хомо и общества, применить уже навыки управления людьми на куда более широкой аудитории… Хм… мысли вслух, не более.
До скорого.