Ключевые моменты:
- инвалидировать все сессии на логаут или смену пароля: разлогинивать на всех девайсах;
- методы авторизации осуществляются через фасад Auth::(attempt/login/logout);
- авторизация проверяется guard'ом, который можно создавать, а provider определяет, откуда доставать креденшалы из постоянного хранилища для сверки;
- роуты можно защищать, передав через middleware название guard'а: auth:[guard_name];
- в браузере пользователь авторизовывается примемущественно (но необязательно) через сессии, а для API создается stateless авторизация по токену (она может быть как для веб-сервиса, так и для авторизации в браузере).
Фреймворк предоставляет множество вариантов авторизации, собрал несколько:
- Laravel native auth (like php artisan make:auth);
- Laravel Sanctum;
- Laravel Jetstream;
- laravel breeze;
- Laravel Fortify;
- Laravel Socialite;
- Laravel JWT (package).
Завтра дочитаю материал по авторизации, сессии и JWT. В следующие дни буду разбирать каждый вариант из списка выше по отдельности.
Спокойно, братишк. С твоими 16 часовыми забегами тебе даже тульпа не даст
Ключевые моменты:
- в Auth::attempt можно передавать не только крденшалы, но и дополниельные поля на проверку или даже queryBuilder через функцию-замыкание;
- в Auth::attemt можно передавать определнный guard;
- можно создавать долгоживущие сессии через "remember me" (почитаю отдельно потом);
- инстанс модели можно задавать как авторизованного пользователя через Auth::login, но при этом модель должна обязательно имплементировать интерфейс Authenticatable;
- на Auth::login так же можно задавать guard;
- можно использовать primary key для авторизации Auth::loginUsingId;
- через Auth::once можно авторизовать на один запрос, при этом ни сессия ни куки не будут установлены;
- можно удобно использовать auth.basic middleware как аналог express-basic-auth на Ноде - оч. полезно -, по умолчанию используется email и pass из провайдера, хорошй аналог для примитивной формы авторизации;
- чтобы определить свой driver для guard'а, его нужно зарегистрировать в serviceProvider через Auth::extend, при чем возвращаемый тип из функции-замыкания должен имплементировать контракт Guard;
- можно использновать Auth::viaRequest для простой авторизации из запроса, реализация буквально в одну строчку и при этом не нужен провайдер, так как возвращаемый инстанс модели будет установлен как авторизированный пользователь;
- помимо регистрации driver'а для guard'а можно так же регистрировать provider через Auth::provider, при этом тип return из fn должен имплементировать контракт UserProvider;
- полезно было узнать, что на события реистрации, логина, логаута, восстановления пароля и проч. Ларавел пораждает Event (на которые можно подписаться).
Контракты UserProvider и Authenticatable:
interface UserProvider
{
public function retrieveById($identifier);
public function retrieveByToken($identifier, $token);
public function updateRememberToken(Authenticatable $user, $token);
public function retrieveByCredentials(array $credentials);
public function validateCredentials(Authenticatable $user, array $credentials);
public function rehashPasswordIfRequired(Authenticatable $user, array $credentials, bool $force = false);
}
interface Authenticatable
{
public function getAuthIdentifierName();
public function getAuthIdentifier();
public function getAuthPasswordName();
public function getAuthPassword();
public function getRememberToken();
public function setRememberToken($value);
public function getRememberTokenName();
}
Нужно будет потом попробовать написать свой guard's driver и provider для закрепления материала.
Информации сегодня много, да и время кончилось - поэтому хватит. Для себя определил, что лучше писать свою систему авторизации, чем использовать готовые пакеты, которые крайне неудобны и принудительно используют ненужные технологии (Livewire/Inertia у Breeze со Vue, например). Но вдруг в работе над уже готовым проектом придется работать с чем-то эдаким, только поэтому буду изучать каждый пакет по отдельности - а так бы не стал. Хотя, может потом поменяю своё мнение.
Ключевые моменты:
- в Auth::attempt можно передавать не только крденшалы, но и дополниельные поля на проверку или даже queryBuilder через функцию-замыкание;
- в Auth::attemt можно передавать определнный guard;
- можно создавать долгоживущие сессии через "remember me" (почитаю отдельно потом);
- инстанс модели можно задавать как авторизованного пользователя через Auth::login, но при этом модель должна обязательно имплементировать интерфейс Authenticatable;
- на Auth::login так же можно задавать guard;
- можно использовать primary key для авторизации Auth::loginUsingId;
- через Auth::once можно авторизовать на один запрос, при этом ни сессия ни куки не будут установлены;
- можно удобно использовать auth.basic middleware как аналог express-basic-auth на Ноде - оч. полезно -, по умолчанию используется email и pass из провайдера, хорошй аналог для примитивной формы авторизации;
- чтобы определить свой driver для guard'а, его нужно зарегистрировать в serviceProvider через Auth::extend, при чем возвращаемый тип из функции-замыкания должен имплементировать контракт Guard;
- можно использновать Auth::viaRequest для простой авторизации из запроса, реализация буквально в одну строчку и при этом не нужен провайдер, так как возвращаемый инстанс модели будет установлен как авторизированный пользователь;
- помимо регистрации driver'а для guard'а можно так же регистрировать provider через Auth::provider, при этом тип return из fn должен имплементировать контракт UserProvider;
- полезно было узнать, что на события реистрации, логина, логаута, восстановления пароля и проч. Ларавел пораждает Event (на которые можно подписаться).
Контракты UserProvider и Authenticatable:
interface UserProvider
{
public function retrieveById($identifier);
public function retrieveByToken($identifier, $token);
public function updateRememberToken(Authenticatable $user, $token);
public function retrieveByCredentials(array $credentials);
public function validateCredentials(Authenticatable $user, array $credentials);
public function rehashPasswordIfRequired(Authenticatable $user, array $credentials, bool $force = false);
}
interface Authenticatable
{
public function getAuthIdentifierName();
public function getAuthIdentifier();
public function getAuthPasswordName();
public function getAuthPassword();
public function getRememberToken();
public function setRememberToken($value);
public function getRememberTokenName();
}
Нужно будет потом попробовать написать свой guard's driver и provider для закрепления материала.
Информации сегодня много, да и время кончилось - поэтому хватит. Для себя определил, что лучше писать свою систему авторизации, чем использовать готовые пакеты, которые крайне неудобны и принудительно используют ненужные технологии (Livewire/Inertia у Breeze со Vue, например). Но вдруг в работе над уже готовым проектом придется работать с чем-то эдаким, только поэтому буду изучать каждый пакет по отдельности - а так бы не стал. Хотя, может потом поменяю своё мнение.
Скорее давать будешь ты... и джаве, а не тянкам
>Для себя определил, что лучше писать свою систему авторизации, чем использовать готовые пакеты, которые крайне неудобны
Не изобретай колесо. Есть простой Sanctum который может и по токену аутентифицировать и по кукис.
Ключевые моменты:
- basic auth - не просто фича, которую я подключал иногда пакетом на Ноде, чтобы закрыть приватные доки, а стандарт описанный RFC;
- basic auth можно забрутфорсить, специальных проверок на сервере предусмотренных стандартом нет;
- сессии - механизм идентификации пользователя в контексте нескольких запросов;
- на клиенте сессия линкуется у пользователя в куке типа "PHPSESID=...";
- сессии хранятся в куках, файлами на диске или в перстент сторадже, которое можно выбрать в Ларавел;
- примечательно, что сессии можно хранить в куках на клиенте в закодированном виде: это как использовать localStorage - т.е на сервере данные вообще не хранятся, что экономит место;
- максимальный размер куков 4kb - мало: 1 символ - ~1byte (китайские иерогифы могут быть по 4 байта, а кириллица по 2 байта) = ~4k символов в лучшем случае;
- переред тем как использовать Редис в Ларавель, нужно Композером установить пакет predis/predis;
- класть и извлекать данные в сессии через глобальную функцию-хелпер - get = session('key', 'default'), set = session(['key' => 'value']);
- использовать данные в сессии на один запрос (+ 1) - session()->flash(...), (полезно с редиректом, наверно), а на один (текущий) - now();
- session()->regenerate() - просто генерирует новый айдишник, а session()->invalidate() вдобавок удаляет все данные;
- сессии нужно локать (что-то типа мьютекса), потому что возникает конкаренси на два параллельных запроса с одной сессией и данные могут перезаписаться - нужно будет почитать об этом позже;
- по контракту в Ларавель можно создать свой драйвер для сессий;
- узнал про ещё одну уязвимость - session fixation - айди сессии следует регулярно обновлять (это как с remember и access токенами): если кто-то получит SESSID (через XSS, сниффинг траффика или соц.инженерию), он получит полный доступ к аккаунту пользователя;
- по умолчанию Ларавел автоматически инвалидирует сессию (т.е удаляет все данные по айдишке и саму айдшку) через 120 минут, значение можно менять;
- когда мы не задаем (omit) флаги для куки expires и max-age - это автоматически делает куку сессионной и в Ларавел можно установить 'expire_on_close' => true, тем самым кука PHPSESID будет удаляться на закрытие браузера, что автоматически разлинкует пользователя, но при этом данные по сессии, которые хранятся в выбранном хранилише, не сразу удалятся, а только когда Session Garbage Collector отработает в Ларавел (похоже, он запускается лотерейно [2, 100] - т.е, как я понял, с вероятностью 2% на запрос).
На сегодня всё. Хочу в будущем попробовать поставить SESSION_DRIVER=cookie и посмотреть, что там в барузере будет. Записал в блокнотик.
Ключевые моменты:
- basic auth - не просто фича, которую я подключал иногда пакетом на Ноде, чтобы закрыть приватные доки, а стандарт описанный RFC;
- basic auth можно забрутфорсить, специальных проверок на сервере предусмотренных стандартом нет;
- сессии - механизм идентификации пользователя в контексте нескольких запросов;
- на клиенте сессия линкуется у пользователя в куке типа "PHPSESID=...";
- сессии хранятся в куках, файлами на диске или в перстент сторадже, которое можно выбрать в Ларавел;
- примечательно, что сессии можно хранить в куках на клиенте в закодированном виде: это как использовать localStorage - т.е на сервере данные вообще не хранятся, что экономит место;
- максимальный размер куков 4kb - мало: 1 символ - ~1byte (китайские иерогифы могут быть по 4 байта, а кириллица по 2 байта) = ~4k символов в лучшем случае;
- переред тем как использовать Редис в Ларавель, нужно Композером установить пакет predis/predis;
- класть и извлекать данные в сессии через глобальную функцию-хелпер - get = session('key', 'default'), set = session(['key' => 'value']);
- использовать данные в сессии на один запрос (+ 1) - session()->flash(...), (полезно с редиректом, наверно), а на один (текущий) - now();
- session()->regenerate() - просто генерирует новый айдишник, а session()->invalidate() вдобавок удаляет все данные;
- сессии нужно локать (что-то типа мьютекса), потому что возникает конкаренси на два параллельных запроса с одной сессией и данные могут перезаписаться - нужно будет почитать об этом позже;
- по контракту в Ларавель можно создать свой драйвер для сессий;
- узнал про ещё одну уязвимость - session fixation - айди сессии следует регулярно обновлять (это как с remember и access токенами): если кто-то получит SESSID (через XSS, сниффинг траффика или соц.инженерию), он получит полный доступ к аккаунту пользователя;
- по умолчанию Ларавел автоматически инвалидирует сессию (т.е удаляет все данные по айдишке и саму айдшку) через 120 минут, значение можно менять;
- когда мы не задаем (omit) флаги для куки expires и max-age - это автоматически делает куку сессионной и в Ларавел можно установить 'expire_on_close' => true, тем самым кука PHPSESID будет удаляться на закрытие браузера, что автоматически разлинкует пользователя, но при этом данные по сессии, которые хранятся в выбранном хранилише, не сразу удалятся, а только когда Session Garbage Collector отработает в Ларавел (похоже, он запускается лотерейно [2, 100] - т.е, как я понял, с вероятностью 2% на запрос).
На сегодня всё. Хочу в будущем попробовать поставить SESSION_DRIVER=cookie и посмотреть, что там в барузере будет. Записал в блокнотик.
Ключевые моменты:
- в пхп есть нативные сессии, но Ларавел их не использует;
- кажется, разобрался с тем как работает "remember me" в Ларавел: при логине генерируется токен и пишется в БД пользователя, вместе с тем создается кука и с этого момента аутентификация пользователя осуществляется через эту куку, а не через сессии, но при этом кука SESSID живет параллельно (и перевыпускается, в отличии от токена), нужно будет проверить это - записал в блокнот;
- через session->restore() сессию можно откратить в контексте одного и того же реквеста;
- с "remember me" аутентификация остается, но при этом сессия вместе со всеми данными протухает и происходит рассинхронизация, что может запутать и привести к ошибкам, если в неё что-нибудь чувствительное прописать - непривычно;
- Auth::attemt выполяет две функции в одной (что странно и опять-таки мня запутало, ведь Ларавел весь такой SOLID и т.д), он оказывается не только выполнят проверку креденшелов, возвращая bool (true/false), но ещё сайд-эффектом логинет юзера - т.е сам выполняет логику Auth::login;
- JWT в этом смысле более продуманный формат "persistent сессий в payload", которые синхронизированны с авторизацией пользователя (да ещё и на клиенте доступны) и так же инвалидируются - вообще сессии в Ларавел ощущается как нечто деприкейтед и от чего следовало бы отказываться (тем более, что используется абстракция, а не нативные PHP-сессии), заявляя об этом в документации (в 11-то версии!), но при этом оставить обратную совместимость для старых приложений (это не экспертное мнение, а первое ощущение, которое, вероятно, поменяется после использования);
- JWT появились в ~2015 году и описываются стандартом RFC;
- JWT имеет следующую структуру - base64(header).base64(payload).(signature = HS256(header + '.' + payload, secret));
- помимо многоразового JWT (с exp в payload) выпускается одноразовый RT, время жизни которого больше и при помощи которого можно инвалидировать эту пару токенов и выпустить новые;
- RT нужен, чтобы инвалидировать JWT без необходимости вводить каждый раз логин и пароль;
- если воришка получит доступ к RT и перевыпустит токен, то RT реального пользователя станет невалидным и его выкинет из системы, когда время жизни JWT (у пользователя) кончится и будет произведена попытка регенерации - тогда пользователь введет логин и пароль, тем самым RT токен воришки (новый) станет недоступен;
- в любом случае воришка получает доступ к аккаунту пользователя как максимум на время жизни JWT.
Топ-топ-топ помаленечку. Завтра нужно будет почитать про OAuth и стандарт PHP, называется PSR - это как PEP для Питона.
Ключевые моменты:
- в пхп есть нативные сессии, но Ларавел их не использует;
- кажется, разобрался с тем как работает "remember me" в Ларавел: при логине генерируется токен и пишется в БД пользователя, вместе с тем создается кука и с этого момента аутентификация пользователя осуществляется через эту куку, а не через сессии, но при этом кука SESSID живет параллельно (и перевыпускается, в отличии от токена), нужно будет проверить это - записал в блокнот;
- через session->restore() сессию можно откратить в контексте одного и того же реквеста;
- с "remember me" аутентификация остается, но при этом сессия вместе со всеми данными протухает и происходит рассинхронизация, что может запутать и привести к ошибкам, если в неё что-нибудь чувствительное прописать - непривычно;
- Auth::attemt выполяет две функции в одной (что странно и опять-таки мня запутало, ведь Ларавел весь такой SOLID и т.д), он оказывается не только выполнят проверку креденшелов, возвращая bool (true/false), но ещё сайд-эффектом логинет юзера - т.е сам выполняет логику Auth::login;
- JWT в этом смысле более продуманный формат "persistent сессий в payload", которые синхронизированны с авторизацией пользователя (да ещё и на клиенте доступны) и так же инвалидируются - вообще сессии в Ларавел ощущается как нечто деприкейтед и от чего следовало бы отказываться (тем более, что используется абстракция, а не нативные PHP-сессии), заявляя об этом в документации (в 11-то версии!), но при этом оставить обратную совместимость для старых приложений (это не экспертное мнение, а первое ощущение, которое, вероятно, поменяется после использования);
- JWT появились в ~2015 году и описываются стандартом RFC;
- JWT имеет следующую структуру - base64(header).base64(payload).(signature = HS256(header + '.' + payload, secret));
- помимо многоразового JWT (с exp в payload) выпускается одноразовый RT, время жизни которого больше и при помощи которого можно инвалидировать эту пару токенов и выпустить новые;
- RT нужен, чтобы инвалидировать JWT без необходимости вводить каждый раз логин и пароль;
- если воришка получит доступ к RT и перевыпустит токен, то RT реального пользователя станет невалидным и его выкинет из системы, когда время жизни JWT (у пользователя) кончится и будет произведена попытка регенерации - тогда пользователь введет логин и пароль, тем самым RT токен воришки (новый) станет недоступен;
- в любом случае воришка получает доступ к аккаунту пользователя как максимум на время жизни JWT.
Топ-топ-топ помаленечку. Завтра нужно будет почитать про OAuth и стандарт PHP, называется PSR - это как PEP для Питона.
Поправочка: JWT не инвалидируется, а протухает. Выпыскатсяновая ПАРА, но инвалидируется при этом только RT (если запросили новую пару раньше времени жизни JWT, то старый JWT будет ещё жить).
Ключевые моменты:
- по традиции отмечу, что OAuth(2) стандарт RFC, а не просто рекомендации;
- OAuth решает задачу доступка к приватным ресурсам от сервиса А для сервиса Б, при этом делает это так, чтобы пользователь не делился с сервисом Б своими данными (логин/пароль) от сервиса А;
- происходит это так: в сервисе Б встроен, например, фрейм с сервисом А, который просит подтвердить дать доступ к определенным ресурсам для сервиса Б, после этого с сервиса А на сервис Б посылается веб-хук с токеном пользоватля, этот токен сервис Б может использовать для взаимодействия с ограниченным API сервиса А от имени пользователя (вместо фрейма и вебхука может быть редирект);
- доступ предоставляется только для тех данных, которые пользователь разрешил дать;
- в частности формат был создан не потому что вдруг сервис Б ненадежный
и украдет данные, а если кто-то взломает сервис Б, то он получит так же доступ к сервису А;
- "Войти через ..." и есть этот смый OAuth;
- отличе OAuth от OAuth2, как я понял, является в основном в упрощении (скращении кол-во действий для получения прав), добавления SSL и наличием двух токенов (AT, RT);
- подытожу алгоритм: 1. запросить у пользователя права -> 2. достать из queryString после редиректа токен_1 -> 3. отправить этот токен на авторизациооный сервер (сервиса, доступ к которому получае) -> 4. получить токен_2 (тот самый желанный с доступами от пользователя).
Сегодня тема получилась простая. Надо будет прочитать про OpenID и SSL теперь. Это будет следующий шаг, затем PHP и потом, недеюсь, вернусь к авторизации Ларавел, если ничего нового по пути не попадётся. А в обозримых планах, помимо работы, хотелось бы освоить Гит и научиться контрибьтить в опен-сорс проекты (со всеми мёрджами, ребейзами, ремоутами, ветками, ишусами, пулл-реквестами и разрешениями конфликтов). И ещё хотелось бы увеличить время занятий до 3 часов, но это в перспективе.
К слову - зачем я затеял перестановку. Хочу обустроить себе рабочее место в пристройке к комнате (180x180, типа кладовки), обшив аккустическим поролоном полностью. Это создат комфортую и рабочую атмосферу, а так же позволит работать даже ранним утром или ночью, никого не разбудив клацаньем по клавишам. Уютный кабинетик.
Ключевые моменты:
- по традиции отмечу, что OAuth(2) стандарт RFC, а не просто рекомендации;
- OAuth решает задачу доступка к приватным ресурсам от сервиса А для сервиса Б, при этом делает это так, чтобы пользователь не делился с сервисом Б своими данными (логин/пароль) от сервиса А;
- происходит это так: в сервисе Б встроен, например, фрейм с сервисом А, который просит подтвердить дать доступ к определенным ресурсам для сервиса Б, после этого с сервиса А на сервис Б посылается веб-хук с токеном пользоватля, этот токен сервис Б может использовать для взаимодействия с ограниченным API сервиса А от имени пользователя (вместо фрейма и вебхука может быть редирект);
- доступ предоставляется только для тех данных, которые пользователь разрешил дать;
- в частности формат был создан не потому что вдруг сервис Б ненадежный
и украдет данные, а если кто-то взломает сервис Б, то он получит так же доступ к сервису А;
- "Войти через ..." и есть этот смый OAuth;
- отличе OAuth от OAuth2, как я понял, является в основном в упрощении (скращении кол-во действий для получения прав), добавления SSL и наличием двух токенов (AT, RT);
- подытожу алгоритм: 1. запросить у пользователя права -> 2. достать из queryString после редиректа токен_1 -> 3. отправить этот токен на авторизациооный сервер (сервиса, доступ к которому получае) -> 4. получить токен_2 (тот самый желанный с доступами от пользователя).
Сегодня тема получилась простая. Надо будет прочитать про OpenID и SSL теперь. Это будет следующий шаг, затем PHP и потом, недеюсь, вернусь к авторизации Ларавел, если ничего нового по пути не попадётся. А в обозримых планах, помимо работы, хотелось бы освоить Гит и научиться контрибьтить в опен-сорс проекты (со всеми мёрджами, ребейзами, ремоутами, ветками, ишусами, пулл-реквестами и разрешениями конфликтов). И ещё хотелось бы увеличить время занятий до 3 часов, но это в перспективе.
К слову - зачем я затеял перестановку. Хочу обустроить себе рабочее место в пристройке к комнате (180x180, типа кладовки), обшив аккустическим поролоном полностью. Это создат комфортую и рабочую атмосферу, а так же позволит работать даже ранним утром или ночью, никого не разбудив клацаньем по клавишам. Уютный кабинетик.
Какие у меня проблемы:
1. У меня нет формального образования - даже 11 классов не окончил; а для работодателя это важно.
2. У меня нет пластиковой карточки, только онлайн кошельки.
3. На кошельках у меня суммарно ~20 рублей.
4. Я полностью социально неадоптирован: не выходил из дома после 9 класса.
5. Общий долг по коммунальным платежам на квартиру в которой я долевой собственник (1/3 доли) - ~160 т.р (приставы арестовывают деньги, есл завести карту типа Сбербанка).
6. Последний раз выходил из дома несколько лет назад.
7. Некроноут и некросмартфон.
8. Несуразный невербальный контакт, что-то вроде аутизма.
9. Речь и риторика умственно отсталого.
10. Плохое зрение.
Какие у меня козыри:
1. Я владею навыками разработки ПО и у меня всё время был с этого нестабильный доход.
2. У меня есть небольшая база клиентов и аккаунт с 15 положительными отзывами на бирже фриланса, отрицательных отзывов 0.
3. Я зарегистрирован в налоговой системе как самозанятый.
4. Мне нечего терять.
Какой у меня план:
1. Перехать в ближайший миллионник (Новосибирск).
2. Снять койко-место/однокомнатную квартиру до 18 т.р в мес.
3. Найти на первое время стабильную работу, чтобы хотя бы покрывать аренду, проезд и еду.
4. Адаптироваться, научиться жить самостоятельно, скопить немного денег и двигаться дальше - в СПБ.
5. Покрыть долг по коммунальным платежам (он даже не весь мой, но мать с сестрой точно платить не будут, а мне приставы будут арестовывать счета в любом случае).
5.1 Заказным письмом предложить матери с сестрой выкуипть мою долю, так как у них по закону приортетное право покупки, а затем, если в установленный законом срок они не ответят, слить свою долю за лоупрайс, чтобы покрыть расходы на гашение долгов по коммунальным платежам.
6. Устроиться разработчиком ПО.
6.1 Накопить на первоночальный взнос и попробовать взять ипотеку (если ключевая ставка будет адекватной).
6.2 Либо переехать в Юго-Восточную Азию и работать удаленно, откладывая деньги.
Что мне нужно:
1. Накопить ~100 т.р для переезда за 2 недели.
2. Заказать пластиковую карту непримечательного для приставов банка с курьерской доставкой.
3. Заказать на всякий случай ценным письмом пластиковую карту Юмани банка за 300 рублей.
4. Договориться с матерью сходить в салон сотовой связи и переоформить номер на себя (она давно покупала эту симку).
5. Собрать сумку для переезда и купить билет (поезд/автобус).
Как я буду собирать деньги:
1. Сегодня после скандала я сам написал постоянному клиенту, спросив, есть ли работёнка (первый раз так делаю, вот что творит чудодейственный коктейль стресса и отчаяния). Будем делать приложение небольшое (10-15 т.р заимею). Завтра отправит предоплату несколько тысяч - с них я закажу себе пластик Юмани за 300 рублей.
2. Закажу карту МТС банка с курьерской доставкой, ибо в моей "деревушке" нет офиса этого банка, и попробую взять кредит на "учёбу" в размере 60 т.р на 4-5 лет, чтобы ежемесячная сумма платежа была в районе 1 т.р. Закрывать кредит планирую досрочно.
3. У меня есть заблокированная карта Озон банка (за подозрительные переводы от клиентов, которые я не смог обосновать в поддержке, так как работал без ИП и самозанятости) на балансе которой 11 т.р, эти деньги я смогу вывести только закрыв счет в этом банке, остаток они как раз отправят на МТС банк.
4. Спамить откликами на все проекты, которые я буду в силах закрыть за неделю, на фриланс площадке.
5. Продать на Авито системный блок, который оценивается где-то в 10 т.р.
Итого гарантированный минимум у меня будет 30-35 т.р., а если одобрят потребительский кредит, соберу необходимые 100 т.р. Если что, двину с минималкой в любом сучае.
Что мне нужно купить:
1. Билет до Новосибирска - ~ 2 т.р.
2. Павербанк 10000 мА*ч - ~ 2 т.р.
3. Тариф с мобильным интернетом - 500 р.
Итого по приезду в город уменя минимум останется 25 т.р.
Хостел + проезд метро/автобус/тролейбус + еда в день = 1000р.
Я смогу прожить 25 дней. До этого момента мне нужнно выйти на доход больше 1000 р. и затем перебираться в съемную однушку.
На всё про всё есть две недели. Испытываю стресс, пишу сумбурно.
Если по приезду в миллионник у меня ничего не получится и я израсходую все свои деньги, подпишу контракт с армией РФ и отправлюсь на СВО (лучше чем подыхать бомжом, авось на третей линии обороны отсижусь и к тому же конфликт уже к логическому завершению подходит после победы Трампа).
Вообще любые рекомендации от опытных людей привествуются.
А я всего лишь хотел обустроить кабинетик и уютненько учиться...
Какие у меня проблемы:
1. У меня нет формального образования - даже 11 классов не окончил; а для работодателя это важно.
2. У меня нет пластиковой карточки, только онлайн кошельки.
3. На кошельках у меня суммарно ~20 рублей.
4. Я полностью социально неадоптирован: не выходил из дома после 9 класса.
5. Общий долг по коммунальным платежам на квартиру в которой я долевой собственник (1/3 доли) - ~160 т.р (приставы арестовывают деньги, есл завести карту типа Сбербанка).
6. Последний раз выходил из дома несколько лет назад.
7. Некроноут и некросмартфон.
8. Несуразный невербальный контакт, что-то вроде аутизма.
9. Речь и риторика умственно отсталого.
10. Плохое зрение.
Какие у меня козыри:
1. Я владею навыками разработки ПО и у меня всё время был с этого нестабильный доход.
2. У меня есть небольшая база клиентов и аккаунт с 15 положительными отзывами на бирже фриланса, отрицательных отзывов 0.
3. Я зарегистрирован в налоговой системе как самозанятый.
4. Мне нечего терять.
Какой у меня план:
1. Перехать в ближайший миллионник (Новосибирск).
2. Снять койко-место/однокомнатную квартиру до 18 т.р в мес.
3. Найти на первое время стабильную работу, чтобы хотя бы покрывать аренду, проезд и еду.
4. Адаптироваться, научиться жить самостоятельно, скопить немного денег и двигаться дальше - в СПБ.
5. Покрыть долг по коммунальным платежам (он даже не весь мой, но мать с сестрой точно платить не будут, а мне приставы будут арестовывать счета в любом случае).
5.1 Заказным письмом предложить матери с сестрой выкуипть мою долю, так как у них по закону приортетное право покупки, а затем, если в установленный законом срок они не ответят, слить свою долю за лоупрайс, чтобы покрыть расходы на гашение долгов по коммунальным платежам.
6. Устроиться разработчиком ПО.
6.1 Накопить на первоночальный взнос и попробовать взять ипотеку (если ключевая ставка будет адекватной).
6.2 Либо переехать в Юго-Восточную Азию и работать удаленно, откладывая деньги.
Что мне нужно:
1. Накопить ~100 т.р для переезда за 2 недели.
2. Заказать пластиковую карту непримечательного для приставов банка с курьерской доставкой.
3. Заказать на всякий случай ценным письмом пластиковую карту Юмани банка за 300 рублей.
4. Договориться с матерью сходить в салон сотовой связи и переоформить номер на себя (она давно покупала эту симку).
5. Собрать сумку для переезда и купить билет (поезд/автобус).
Как я буду собирать деньги:
1. Сегодня после скандала я сам написал постоянному клиенту, спросив, есть ли работёнка (первый раз так делаю, вот что творит чудодейственный коктейль стресса и отчаяния). Будем делать приложение небольшое (10-15 т.р заимею). Завтра отправит предоплату несколько тысяч - с них я закажу себе пластик Юмани за 300 рублей.
2. Закажу карту МТС банка с курьерской доставкой, ибо в моей "деревушке" нет офиса этого банка, и попробую взять кредит на "учёбу" в размере 60 т.р на 4-5 лет, чтобы ежемесячная сумма платежа была в районе 1 т.р. Закрывать кредит планирую досрочно.
3. У меня есть заблокированная карта Озон банка (за подозрительные переводы от клиентов, которые я не смог обосновать в поддержке, так как работал без ИП и самозанятости) на балансе которой 11 т.р, эти деньги я смогу вывести только закрыв счет в этом банке, остаток они как раз отправят на МТС банк.
4. Спамить откликами на все проекты, которые я буду в силах закрыть за неделю, на фриланс площадке.
5. Продать на Авито системный блок, который оценивается где-то в 10 т.р.
Итого гарантированный минимум у меня будет 30-35 т.р., а если одобрят потребительский кредит, соберу необходимые 100 т.р. Если что, двину с минималкой в любом сучае.
Что мне нужно купить:
1. Билет до Новосибирска - ~ 2 т.р.
2. Павербанк 10000 мА*ч - ~ 2 т.р.
3. Тариф с мобильным интернетом - 500 р.
Итого по приезду в город уменя минимум останется 25 т.р.
Хостел + проезд метро/автобус/тролейбус + еда в день = 1000р.
Я смогу прожить 25 дней. До этого момента мне нужнно выйти на доход больше 1000 р. и затем перебираться в съемную однушку.
На всё про всё есть две недели. Испытываю стресс, пишу сумбурно.
Если по приезду в миллионник у меня ничего не получится и я израсходую все свои деньги, подпишу контракт с армией РФ и отправлюсь на СВО (лучше чем подыхать бомжом, авось на третей линии обороны отсижусь и к тому же конфликт уже к логическому завершению подходит после победы Трампа).
Вообще любые рекомендации от опытных людей привествуются.
А я всего лишь хотел обустроить кабинетик и уютненько учиться...
Мне кажется слишком далеко ты настроил планов. 99% на каком-то пункте, все пойдет по пизде и получишь дизмораль из ничего.
Я бы не заглядывал так далеко.
Живу в четырёх стенах тринадцатый год, как домашнее животное. Личностно никак не развиваюсь, ещё морально давят домашние. Так нельзя.
Режим выживания активирован.
Сегодня утром мониторил фриланс-площадку и нашел работёнку за 1к (после вычета комиссии площадки). Сделал за пару часов и сдал заказ. Господи, неужели мне придётся курьером столько же за целые сутки зарабатывать на морозе... Погода для переезда ещё гадкая. Ладно, первая тыща в копилку.
Если ты будешь работать именно целый день курьером в дс2, то 3-4к вполне реально зарабатывать. Но нужна карточка банка и самозанятость. В дностависте за наличные наверное действительно 1к будет.
Лучше езжай сразу в ДС, раз планируешь жить в хостеле. Тут всё намного более развитое, зарплаты выше. Цена за хостел - 3,5к неделя. Билеты посмотри сколько стоят, около 5-6к наверное обойдется. Можешь устроиться хоть продавцом за 80к или официантом, они тоже зарабатывают. Есть где погулять и тд. Единственное, иногда в транспорте много людей, но я с этим не сталкивался, я в другую сторону еду всегда, но на другом направлении смотрю толкучка, люди прям в ком превращаются
Что ж, план действительно наполеоновский, такое написать- реально устанешь!
У меня было много эпических провалов насчет планирования, я знаю о чем говорю. Да и у знакомых то же самое постоянно, когда планируют детально.
Лучше не планировать ничего скурпулезно, - легко словить дизмораль и выпасть надолго, - а просто держать в голове основную идею, зачем и менять подход в сложных случаях, тогда все получится.
Тебе 27 , ты в какой-то странной жопе. Со странной матерью.
Хотя умеешь в разработку и умеешь ею деньги какие-то зарабатывать.
Просто иди на собесы и говори, что за 30к будешь работать. По 500 откликов на hh делай, впиши весь свой опыт и можешь даже припиздеть чуть.
Возможно проблема, что ты по характеру лох и 2 слова связать не можешь. Ну тогда тебе только интеллектом брать и вообще я тебя не завидую.
Я сам в 30 вкатился в тестирование. Я вообще нихуя не знаю, просто откликался и ходил по собесам.
До сих пор не пойму че такое API, а зп 70 тыс.
Бля да даже закончил топовую московскую магистратуру эконома и нихуя не понял. Просто с преподами за жизнь попиздеть любил. На бюджет из-за этого тоже взяли.
Короче я убеждён, что соц скиллы важнее. И если ты хочешь брать умом, то тебе нужно быть очень умным и исполнительным. А учитывая, что тебе 27 и ты проебался во всём, то вряд ли прям гений. Бери настойчивостью, а то как в соседнем треде про типа который пхп 2 или 3 года учит. В отличии он него , у тебя уже есть опыт работы. Действуй, у тебя всё получится, отвечаю.
С мамой помирился, но съезжать всё равно планирую, хоть и чуть позже.
За эти дни я заработал ~25_000 руб.:
- 1_200 руб. (скрипт - python/selenium);
- 15_000 руб (веб-сервис - typescript/puppeteer/anigate/rabbitmq/swagger[openapi]/redis/docker);
- 100$ криптой (веб-приложение - javascript/webpack/vue3/vuetify/tailwind/extensionapi).
Всё это время работал, сильно устал. Во время работы гонял на репите аудиокнигу "Хватит быть славным парнем" (она 6 часов идёт, уже три-четыре раза прослушал) - слушаю, узнаю в описываемом типе себя, злюсь и, кажется, ментально меняюсь. Полностью сфокусироваться на прослушивании не удается, так как почти весь когнитивный ресурс занимает работа; только во время рутины фрагментарно улавливаю - поэтому гоняю по кругу.
Работа до конца не доделана, два дня ещё займёт где-то. С заработанных денег заказал пластиковую карточку (300 рублей), должна прийти на днях ценным письмом. Нужно будет топать до почтового отделения (первый раз придётся выйти на улицу за хрен знает сколько лет, а у меня только одни штаны - и те летние).
К слову о деньгах. Вчера решил их приумножить, сделал депозит на БК. Сначала разогнал баланс до 60_000 руб., но потом всё проиграл (скрин). Из заработанных денег на кошельке осталось 300 рублей. Эх. Больше на эти грабли не наступлю.
Я вообще не хотел сюда писать больше, думал никого нет тут.
>- 1_200 руб. (скрипт - python/selenium);
>- 15_000 руб (веб-сервис - typescript/puppeteer/anigate/rabbitmq/swagger[openapi]/redis/docker);
>- 100$ криптой (веб-приложение - javascript/webpack/vue3/vuetify/tailwind/extensionapi).
Да ты уже можешь на работу устраиваться.
>Просто иди на собесы
Двачую, тем более, что оп умеет кодить. Непонятно зачем сидеть и разбираться в кишках одного конкретного фреймворка, никто не будет на собеседованиях задавать вопросы в духе "какой метод какого класса надо использовать, чтобы залогинить пользователя".
> Эх. Больше на эти грабли не наступлю.
> ставки
Возможно ты уже на крючке. Мысли о быстром заработке, могут вновь загнать туда.
>К слову о деньгах. Вчера решил их приумножить, сделал депозит на БК. Сначала разогнал баланс до 60_000 руб., но потом всё проиграл (скрин). Из заработанных денег на кошельке осталось 300 рублей. Эх. Больше на эти грабли не наступлю.
Гипотеза эффективного рынка, чел. Делая ставку ты утверждаешь что твоя аналитика лучше всей аналитики которую собрал букмекер выставляя коэффициенты. То есть шанс проебать деньги на ставочках приближаться к 100%
https://www.reading.ac.uk/web/files/economics/emdp201910.pdf
> At the overall market level, we found no statistically significant evidence which could reject an efficient market hypothesis for the online betting market for English football match results. The
odds offered by bookmakers were generally not biased towards any particular result outcome, nor did they feature the favourite-longshot bias, which has been documented in other betting markets. But individual bookmaker-specific markets were not efficient, since they failed to use the information contained in their competitors’ odds, though these effects were very small.
Кажется всё устаканилось, но при этом я всё ещё живу на пороховой бочке. Продолжу учиться и параллельно копить деньги - это лучший вариант на данный момент.
Работу по предыдущим проектам закончил. Один из заказчиков готовит новое ТЗ - посмотрим.
Ответы
В дневнике мне предлагали ходить по собесам и пытаться устроиться на работу. Проясню ситуацию.
Причины, по которым я не смогу устроиться:
1. Я более двенадцати лет ни с кем не коммуницировал (кроме как текстом). Да и до этого был тихоня, но хотя бы пару реплик в день выдавал в школе. Область мозга, ответственная за эту задачу, атрофировалась за ненадобностью.
2. Я не умею врать.
3. Я не умею себя презентовать/продавать: рассказывать в красках даже о своих реальных способностях.
4. Для этого нужно составлять резюме (формальное образование 9 классов, нет списка компаний на которые могу сослаться в качестве опыта работы).
5. Высокая конкуренция - не пропихнуться.
6. Нужно купить оборудование: микрофон и веб-камеру.
Причины, по которым я не хочу устраиваться:
1. Я перестану развиваться.
1.1. Вероятно, погрязну в рутине и бесполезных созвонах/планёрках.
1.2. Вероятно, придётся работать с легаси.
1.3. Вероятно, буду выполнять одну функцию: стану винтиком.
2. У меня резко снизится количество свободного времени, которое на данный момент я хочу уделить учёбе.
3. Вероятно, это меня расслабит.
4. Нет никакой мотивации устраиваться на джуниора и проходить бесконечные тестовые за 30т.р/мес. - как мой сосед по дневникам.
5. Я не получу никакой пользы, кроме небольшого стабильного дохода и непримечательной строчки в резюме.
В моём случае мне нужно, чтобы работодатель сам на меня выходил: а это либо зарекомендовать себя на фрилансе, либо развивать профиль на Гитхаб, куда будет писать HR с жирными оферами.
Отмечу, что интересоваться программированием начал в 8 классе - да-да, вот такой вот я тормоз. Первые пять лет мой кругозор на выходил за пределы тривиальных скриптов на JS: это было время, когда ES6 ещё не появился и код везде писался на прототипом наследовании через функции-конструкторы (лямбда/стрелочных функций тоже ещё не появилось). Работу ещё в школе искал на форумах за копейки - в основном всякие боты.
На чем следует сосредоточиться
Во-первых, я хочу выйти на зарубежный_фриланс/удалёнку_за_USDT. Поэтому мне следует каждый день совершенствовать свой английский.
Во-вторых, я хочу стать не просто рядовым разработчиком, а инженером, поэтому мне следует каждый день по чуть-чуть заниматься математикой. Начну с повторения элементарной математики по учебникам с углублённым уровнем. К тому же, мне нужно освоить на высоком уровне ML (для своих проектов): я уже подключал обученные модели с Huggingface на Pytorch, и создавал когда-то давно свой перцептрон по книге Тарика Рашида, но это совсем не тот уровень - хочу уметь обучать свои модели и понимать статьи на arXiv.
В-третьих, совершенствовать свои навыки в технологиях, которыми я уже владею и регулярно пользуюсь, до уровня максимального профессионализма. Каждый день.
Итого ежедневный обязательный список задач "по чуть-чуть, но систематически": математика, английский, технологии. Буквально по 30-60 минут в день на каждую тему. Остальное время буду заниматься рандомными темами по настроению или фрилансом, когда он есть.
Сегодняшний день
Поступило предложение доработать ПО на Laravel + Nuxt3 (возможно откажусь). Сегодня в планах быстро ознакомиться с Nuxt3.
Конспект:
- Nuxt3 написан поверх Vue3;
- Nuxt3 нужен для Server Side Rendering (SSR);
- SSR улучшает SEO-оптимизацию (индексация поисковыми роботами);
- с SSR первая загрузка страницы быстрее (пользователь быстрее получает свои данные, без дополнительного лоадера);
- Nuxt3 после первой загрузки продолжает работать как SPA;
- в Nuxt3 роутинг вычисляется автоматически от каталога /pages + название файлов;
- можно вкладывать каталоги и тогда рутинг будет принимать имя каталога (аналогично для вложенных файлов/каталогов);
- "index.vue" - файл с базовым роутом для каталога;
- параметры передаются так же через название файла: "[param_name].vue";
- параметры достаются через хук useRoute().params;
- ссылки создавать через компонент <NuxtLink to="">;
- к активной ссылке добавляются классы: "active" и "exact-active";
- автоматически к компонентам из /pages применяется layout /layouts/default.vue;
- layout задается через definePageMeta({ layout });
- в Nuxt3 tailwind, typescript, axios and etc... подключается модулями в defineNuxtConfig({ modules });
- запросы к API создаются через хук useFetch() - подгружает данные один раз или $fetch();
- в useFetch обязательно передавать ('', { key: unique });
- Nuxt3 автоматически подтягивает компоненты из каталга /components;
- можно выбрасывать ошибку через throw createError({ status, message }) и подхватывать error.vue;
- можно добавлять заполнять head в config.app.head;
- серверные роуты создаются по тому же принципу но в каталоге /server и с фалйами .js;
- в runtimeConfig можно пробросить .env (как на клиента так и на сервер через public: {...});
- Nuxt3 автоматически разбивает код на чанки при загрузке;
- обнаружил, что с 18 версии в Ноде наконец-то поддерживается из коробки fetch().
Почти на четвёртом десятке пришла в голову мудрость, что в жизни лучше ни с кем не ругаться и не спорить, оставив своё мнение при себе и ничего не доказывая.
Сегодня подтянулся на турнике 9 раз за один подход (последние два раза еле-еле). Небольшой прогресс.
Кажется всё устаканилось, но при этом я всё ещё живу на пороховой бочке. Продолжу учиться и параллельно копить деньги - это лучший вариант на данный момент.
Работу по предыдущим проектам закончил. Один из заказчиков готовит новое ТЗ - посмотрим.
Ответы
В дневнике мне предлагали ходить по собесам и пытаться устроиться на работу. Проясню ситуацию.
Причины, по которым я не смогу устроиться:
1. Я более двенадцати лет ни с кем не коммуницировал (кроме как текстом). Да и до этого был тихоня, но хотя бы пару реплик в день выдавал в школе. Область мозга, ответственная за эту задачу, атрофировалась за ненадобностью.
2. Я не умею врать.
3. Я не умею себя презентовать/продавать: рассказывать в красках даже о своих реальных способностях.
4. Для этого нужно составлять резюме (формальное образование 9 классов, нет списка компаний на которые могу сослаться в качестве опыта работы).
5. Высокая конкуренция - не пропихнуться.
6. Нужно купить оборудование: микрофон и веб-камеру.
Причины, по которым я не хочу устраиваться:
1. Я перестану развиваться.
1.1. Вероятно, погрязну в рутине и бесполезных созвонах/планёрках.
1.2. Вероятно, придётся работать с легаси.
1.3. Вероятно, буду выполнять одну функцию: стану винтиком.
2. У меня резко снизится количество свободного времени, которое на данный момент я хочу уделить учёбе.
3. Вероятно, это меня расслабит.
4. Нет никакой мотивации устраиваться на джуниора и проходить бесконечные тестовые за 30т.р/мес. - как мой сосед по дневникам.
5. Я не получу никакой пользы, кроме небольшого стабильного дохода и непримечательной строчки в резюме.
В моём случае мне нужно, чтобы работодатель сам на меня выходил: а это либо зарекомендовать себя на фрилансе, либо развивать профиль на Гитхаб, куда будет писать HR с жирными оферами.
Отмечу, что интересоваться программированием начал в 8 классе - да-да, вот такой вот я тормоз. Первые пять лет мой кругозор на выходил за пределы тривиальных скриптов на JS: это было время, когда ES6 ещё не появился и код везде писался на прототипом наследовании через функции-конструкторы (лямбда/стрелочных функций тоже ещё не появилось). Работу ещё в школе искал на форумах за копейки - в основном всякие боты.
На чем следует сосредоточиться
Во-первых, я хочу выйти на зарубежный_фриланс/удалёнку_за_USDT. Поэтому мне следует каждый день совершенствовать свой английский.
Во-вторых, я хочу стать не просто рядовым разработчиком, а инженером, поэтому мне следует каждый день по чуть-чуть заниматься математикой. Начну с повторения элементарной математики по учебникам с углублённым уровнем. К тому же, мне нужно освоить на высоком уровне ML (для своих проектов): я уже подключал обученные модели с Huggingface на Pytorch, и создавал когда-то давно свой перцептрон по книге Тарика Рашида, но это совсем не тот уровень - хочу уметь обучать свои модели и понимать статьи на arXiv.
В-третьих, совершенствовать свои навыки в технологиях, которыми я уже владею и регулярно пользуюсь, до уровня максимального профессионализма. Каждый день.
Итого ежедневный обязательный список задач "по чуть-чуть, но систематически": математика, английский, технологии. Буквально по 30-60 минут в день на каждую тему. Остальное время буду заниматься рандомными темами по настроению или фрилансом, когда он есть.
Сегодняшний день
Поступило предложение доработать ПО на Laravel + Nuxt3 (возможно откажусь). Сегодня в планах быстро ознакомиться с Nuxt3.
Конспект:
- Nuxt3 написан поверх Vue3;
- Nuxt3 нужен для Server Side Rendering (SSR);
- SSR улучшает SEO-оптимизацию (индексация поисковыми роботами);
- с SSR первая загрузка страницы быстрее (пользователь быстрее получает свои данные, без дополнительного лоадера);
- Nuxt3 после первой загрузки продолжает работать как SPA;
- в Nuxt3 роутинг вычисляется автоматически от каталога /pages + название файлов;
- можно вкладывать каталоги и тогда рутинг будет принимать имя каталога (аналогично для вложенных файлов/каталогов);
- "index.vue" - файл с базовым роутом для каталога;
- параметры передаются так же через название файла: "[param_name].vue";
- параметры достаются через хук useRoute().params;
- ссылки создавать через компонент <NuxtLink to="">;
- к активной ссылке добавляются классы: "active" и "exact-active";
- автоматически к компонентам из /pages применяется layout /layouts/default.vue;
- layout задается через definePageMeta({ layout });
- в Nuxt3 tailwind, typescript, axios and etc... подключается модулями в defineNuxtConfig({ modules });
- запросы к API создаются через хук useFetch() - подгружает данные один раз или $fetch();
- в useFetch обязательно передавать ('', { key: unique });
- Nuxt3 автоматически подтягивает компоненты из каталга /components;
- можно выбрасывать ошибку через throw createError({ status, message }) и подхватывать error.vue;
- можно добавлять заполнять head в config.app.head;
- серверные роуты создаются по тому же принципу но в каталоге /server и с фалйами .js;
- в runtimeConfig можно пробросить .env (как на клиента так и на сервер через public: {...});
- Nuxt3 автоматически разбивает код на чанки при загрузке;
- обнаружил, что с 18 версии в Ноде наконец-то поддерживается из коробки fetch().
Почти на четвёртом десятке пришла в голову мудрость, что в жизни лучше ни с кем не ругаться и не спорить, оставив своё мнение при себе и ничего не доказывая.
Сегодня подтянулся на турнике 9 раз за один подход (последние два раза еле-еле). Небольшой прогресс.