Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
Грибные блоки - красочная головоломка, в которой вам предстоит передвигать блоки и заполнять ряды, чтобы собирать грибочки в корзину! Попробуйте продержаться как можно дольше!

Грибные блоки

Головоломки, Расслабляющая, Пазлы

Играть

Топ прошлой недели

  • AlexKud AlexKud 38 постов
  • SergeyKorsun SergeyKorsun 12 постов
  • SupportHuaport SupportHuaport 5 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня

PHP + YouTube

С этим тегом используют

Программирование Программист IT Javascript HTML Web-программирование Разработка Музыка Юмор Вертикальное видео Политика Игры Фильмы Песня Все
10 постов сначала свежее
14
dimitrioniks
dimitrioniks
1 год назад
ChatGPT
Серия О программировании не от программиста ( нейросети)

Продолжение поста «Запустил дома нейросеть для программирования ( 60 языков!!)»⁠⁠1

Кто-то наверняка хотел увидеть чем пригодились нейросети и какого уровня код может делать..
Но перед этим скажу, что к сожалению одной сетью Сodestral восхваляемой в предыдущем посте не обошлось.. В итоге использовал по некоторым мелким вопросам ( для уточнений скорей)- Copilot, также https://chat.deepseek.com/coder ( выпустили на днях- тоже довольно хороша для программирования). И даже немного поюзал вышедший чуть ли не вчера ( тоже улучшенный- но не специально для кода)- Claude 3.5 Sonnet, модель которая превосходит GPT-4 почти на всех тестах ( в том числе в программировании)

Claude 3.5 Sonnet уже доступна бесплатно для всех пользователей. ( я регился через sms-activate) за 10р ( конечно нужен VPN)
по факту же- основной код из https://chat.deepseek.com/coder... почему так говорю- потому что уже сам не помню- дня три долбил разные сети)) наверное с 15й попытки сделал рабочий вариант. Штука в том, что пару раз наблюдал за тем, как разные сети начинали глючить..то код не допишут, то еще чего. Я в программировании почти ноль ( на php знаю 2-3 команды и то со словарём..). Хотя кое-какие задачи для себя решаю, пишу технические задания.. И вот ниже тех.задание которое я запихивал в нейросеть- нужное для моих целей.

Ниже также будет опубликован рабочий код. Так что и программисты и любители могут оценить..поругать..или поудивляться что может нейросеть..или оценить свои перспективы.

Итак- вот такое было тех.задание:

Напиши программу на php, которая обрабатывает файл prices.csv, при запуске проверяет существование файлов ostatki.txt и pusto.txt, если эти файлы не существуют, создаёт их. Если файлы существуют, очищает их содержимое. Также если не существует, то создается база sqlite ostatki.db с с двумя таблицами: таблица ostatki с полями artikul ( число), tovar (текстовое), qty ( числовое)  и таблица pusto с полями artikul (число), tovar (числовое), qty (текстовое) . Также добавь вывод ошибок php в начале файла.

Если скрипт запускается первый раз ( это можно проверить по отсутствию базы ostatki.db)- если файла базы нет ostatki.db, она создается как написано выше и запуск считается первым, в этом случае идет обработка файла prices.csv по таким правилам:
файл prices.csv содержит разделители ; ( точка с запятой)

обработка файла prices.csv начинается со второй строки.

2ая колонка в prices.csv это переменная artikul (артикул товара), 3я колонка это name (название товара), 14ая колонка это qty ( количество), считываем все данные из prices.csv построчно, для ускорения процесса используем массив, записываем данные в базу данных ostatki.db в таблицу ostatki по соответствующим названиям полей и переменных ( artikul в artikul и так далее, при условии что в 14й колонке содержится любое число, если в 14й  колонке пусто, тогда данные artikul, tovar записываются в таблицу pusto, а в поле qty этой таблицы pusto записывается текстовое значение zero.

Происходит запись лог файлов ostatki.txt и pusto.txt по таким правилам:

в файл ostatki.txt идет построчная запись товаров с нулевыми остатками, то есть из таблицы ostatki берется товар где qty=0 и в этом случае формируется запись: Товар artikul name закончился, проверьте остатки! И так до тех пор, пока будут проверены все нулевые значения таблицы ostatki в поле qty в базе ostatki.db

в файл pusto.txt построчно записываются значения из таблицы pusto в таком формате Товар artikul name не был заведён по каким-то причинам. После первого запуска идет отправка данных с помощью функции

maillogfile, ее описание в конце текста. И после запуска этой функции maillogfile идет остановка программы, она считается завершенной.
.

При повторном запуске программы ( повторным считается запуск если существует база ostatki.db)

идет проверка на изменение данных в базе данных при сравнении с файлом prices.csv по таким правилам ( начиная со второй строки):

Если в файле prices.csv где 2ая колонка в prices.csv это переменная artikul (артикул товара), 3я колонка это name (название товара), 14ая колонка это qty ( количество), считываем все данные из prices.csv построчно ( ускоряем процесс с помощью массива), если определяется что qty=0 нужно проверить совпадение в базе данных ostatki.db в таблице ostatki по артикулу ( artikul), если в таблице также в qty находится 0, то ничего не делаем, и запись в лог файл ostatki.txt  не производим. Если в таблице prices.csv qty=0 ( это 14ая колонка), а в базе данных ostatki.db в таблице ostatki значение qty больше нуля, тогда делаем запись в лог файл ostatki.txt в формате Товар artikul name закончился, проверьте остатки!

Если при сравнении prices.csv и таблицы ostatki в базе данных ostatki.db при совпадении artikul число qty отличается от нуля ( не пустая строка и не отсутствие значения), и qty в prices.csv отличается от qty в таблице ostatki то делаем перезапись значения qty в базе данных.. Если artikul в prices.csv не находится в ostatki.db в таблице ostatki, при втором  и последующих запусках программы, значит данного товара еще не было и создается новая строка с данными  artikul, tovar, qty и также идёт запись в ostatki.txt такого вида: Добавлен товар artikul name с остатком qty.

Также проверяем проходя 2, 3, 14 колонку файла prices.csv и таблицу pusto в базе данных, если artikul содержит qty от 0 и выше, и при этом данный artikul содержится в таблице pusto, то удаляем эту строку из базы данных из таблицы pusto.

Также идёт проверка таблицы pusto, если в файле prices.csv есть пустые значения в qty ( 14ая колонка), то есть это не 0 и не число, и такое же точно значение уже есть в таблице pusto по значению artikul, и в qty находится zero, то в файл pusto.txt ничего не пишем и проверяем дальше. В итоге после всех проверок

Запускается функция для отправки  maillogfile, ее описание ниже.

Функция maillogfile содержит отправку по заданному адресу с другого заданного адреса  с использованием библиотеки Phpmailer ( она находится в папке PHPMailer/src/, адрес куда отправлять берет из файла email.txt, откуда отправлять и другие настройки берет из файла email.cfg в формате json, пример содержимого email.cfg с соответствующими настройками, чтобы ты знал как создать функцию maillogfile с использованием данных файлов в виде настроек приведены ниже в кавычках {}

{

"smtp_host": "smtp.mail.ru",

"smtp_auth": true,

"smtp_username": "de--@Mail.ru",

"smtp_password": "H--—9H",

"smtp_secure": "ssl",

"smtp_port": 465
“Name”: ”Dimitriy”

}

Здесь Name это имя отправителя, все остальные данные совпадают с переменными..

Эта функция при запуске отправляет во вложении файлы ostatki.txt и pusto.txt, также тексты добавляются из файлов в тело письма, , при условии что в данных файлах содержится текст, если файлы пустые, не содержат текст,  то письмо не отправляется.

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


Если лог файлы ostatki.txt и pusto.txt пустые- выводится - Ничего не изменилось, поэтому письмо не отправлено. Также проследи чтобы не было проблем с кодировкой при отправке писем, чтобы заголовки и сам текст был в одной кодировке. Также учти чтобы при чтении файла prices.csv не было проблем с кодировкой ( текст внутри этого файла prices.csv в кодировке  windows-1251), следует при записи в базу данных и обработке делать преобразование в utf-8 текстовых данных.

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

Также проверь время выполнения файла и выведи в конце подробную информацию- сколько времени было выполнение файла.

А вот такой вышел код: ( реально рабочий- через Cron на хостинге запускаю каждые полчаса- но как говорится и в этом есть нюансы)- но в итоге работает.

<?php

ini_set('display_errors', 1);

ini_set('display_startup_errors', 1);

error_reporting(E_ALL);

function maillogfile($to, $from, $fromName, $smtpSettings) {

require 'PHPMailer/src/PHPMailer.php';

require 'PHPMailer/src/SMTP.php';

require 'PHPMailer/src/Exception.php';

$mail = new PHPMailer\PHPMailer\PHPMailer();

$mail->isSMTP();

$mail->Host = $smtpSettings['smtp_host'];

$mail->SMTPAuth = $smtpSettings['smtp_auth'];

$mail->Username = $smtpSettings['smtp_username'];

$mail->Password = $smtpSettings['smtp_password'];

$mail->SMTPSecure = $smtpSettings['smtp_secure'];

$mail->Port = $smtpSettings['smtp_port'];

$mail->CharSet = 'UTF-8';

$mail->setFrom($from, $fromName);

$mail->addAddress($to);

$mail->Subject = 'Остатки товаров';

$ostatkiContent = file_get_contents('ostatki.txt');

$pustoContent = file_get_contents('pusto.txt');

if (empty($ostatkiContent) && empty($pustoContent)) {

echo "Ничего не изменилось, поэтому письмо не отправлено.";

return;

}

if (!empty($ostatkiContent)) {

$mail->addAttachment('ostatki.txt');

$mail->Body .= $ostatkiContent;

}

if (!empty($pustoContent)) {

$mail->addAttachment('pusto.txt');

$mail->Body .= $pustoContent;

}

if (!$mail->send()) {

echo 'Ошибка, почта не была отправлена.';

echo 'Mailer Error: ' . $mail->ErrorInfo;

} else {

echo 'Почта с нулевыми остатками отправлена.';

}

}

$startTime = microtime(true);

$dbFile = 'ostatki.db';

$csvFile = 'prices.csv';

$ostatkiFile = 'ostatki.txt';

$pustoFile = 'pusto.txt';

$emailFile = 'email.txt';

$emailConfigFile = 'email.cfg';

if (!file_exists($ostatkiFile)) {

file_put_contents($ostatkiFile, '');

} else {

file_put_contents($ostatkiFile, '');

}

if (!file_exists($pustoFile)) {

file_put_contents($pustoFile, '');

} else {

file_put_contents($pustoFile, '');

}

$ostatkiBuffer = '';

$pustoBuffer = '';

if (!file_exists($dbFile)) {

$db = new SQLite3($dbFile);

$db->exec("CREATE TABLE ostatki (artikul INTEGER, tovar TEXT, qty INTEGER)");

$db->exec("CREATE TABLE pusto (artikul INTEGER, tovar TEXT, qty TEXT)");

$db->exec("CREATE INDEX idx_ostatki_artikul ON ostatki (artikul)");

$db->exec("CREATE INDEX idx_pusto_artikul ON pusto (artikul)");

$insertOstatki = $db->prepare("INSERT INTO ostatki (artikul, tovar, qty) VALUES (:artikul, :tovar, :qty)");

$insertPusto = $db->prepare("INSERT INTO pusto (artikul, tovar, qty) VALUES (:artikul, :tovar, 'zero')");

$csvData = [];

if (($handle = fopen($csvFile, "r")) !== FALSE) {

fgetcsv($handle, 0, ";"); // Skip header

while (($data = fgetcsv($handle, 0, ";")) !== FALSE) {

$csvData[] = $data;

}

fclose($handle);

}

$db->exec("BEGIN TRANSACTION");

foreach ($csvData as $data) {

$artikul = $data[1];

$tovar = mb_convert_encoding($data[2], 'UTF-8', 'Windows-1251');

$qty = $data[13];

if (is_numeric($qty)) {

$insertOstatki->bindValue(':artikul', $artikul, SQLITE3_INTEGER);

$insertOstatki->bindValue(':tovar', $tovar, SQLITE3_TEXT);

$insertOstatki->bindValue(':qty', $qty, SQLITE3_INTEGER);

$insertOstatki->execute();

} else {

$insertPusto->bindValue(':artikul', $artikul, SQLITE3_INTEGER);

$insertPusto->bindValue(':tovar', $tovar, SQLITE3_TEXT);

$insertPusto->execute();

}

}

$db->exec("COMMIT");

$ostatkiBuffer = '';

$pustoBuffer = '';

$result = $db->query("SELECT * FROM ostatki WHERE qty = 0");

while ($row = $result->fetchArray()) {

$ostatkiBuffer .= "Товар {$row['artikul']} {$row['tovar']} закончился, проверьте остатки!\n";

}

$result = $db->query("SELECT * FROM pusto");

while ($row = $result->fetchArray()) {

$pustoBuffer .= "Товар {$row['artikul']} {$row['tovar']} не был заведён по каким-то причинам.\n";

}

file_put_contents($ostatkiFile, $ostatkiBuffer);

file_put_contents($pustoFile, $pustoBuffer);

$email = file_get_contents($emailFile);

$emailConfig = json_decode(file_get_contents($emailConfigFile), true);

maillogfile($email, $emailConfig['smtp_username'], $emailConfig['Name'], $emailConfig);

} else {

$db = new SQLite3($dbFile);

$updateOstatki = $db->prepare("UPDATE ostatki SET qty = :qty WHERE artikul = :artikul");

$insertOstatki = $db->prepare("INSERT INTO ostatki (artikul, tovar, qty) VALUES (:artikul, :tovar, :qty)");

$deletePusto = $db->prepare("DELETE FROM pusto WHERE artikul = :artikul");

$insertPusto = $db->prepare("INSERT INTO pusto (artikul, tovar, qty) VALUES (:artikul, :tovar, 'zero')");

$csvData = [];

if (($handle = fopen($csvFile, "r")) !== FALSE) {

fgetcsv($handle, 0, ";"); // Skip header

while (($data = fgetcsv($handle, 0, ";")) !== FALSE) {

$csvData[] = $data;

}

fclose($handle);

}

$db->exec("BEGIN TRANSACTION");

foreach ($csvData as $data) {

$artikul = $data[1];

$tovar = mb_convert_encoding($data[2], 'UTF-8', 'Windows-1251');

$qty = $data[13];

if (is_numeric($qty)) {

$result = $db->querySingle("SELECT qty FROM ostatki WHERE artikul = '$artikul'", true);

if ($result) {

if ($result['qty'] != $qty) {

$updateOstatki->bindValue(':qty', $qty, SQLITE3_INTEGER);

$updateOstatki->bindValue(':artikul', $artikul, SQLITE3_INTEGER);

$updateOstatki->execute();

}

if ($qty == 0 && $result['qty'] > 0) {

$ostatkiBuffer .= "Товар {$artikul} {$tovar} закончился, проверьте остатки!\n";

}

} else {

$insertOstatki->bindValue(':artikul', $artikul, SQLITE3_INTEGER);

$insertOstatki->bindValue(':tovar', $tovar, SQLITE3_TEXT);

$insertOstatki->bindValue(':qty', $qty, SQLITE3_INTEGER);

$insertOstatki->execute();

$ostatkiBuffer .= "Добавлен товар {$artikul} {$tovar} с остатком {$qty}.\n";

}

$deletePusto->bindValue(':artikul', $artikul, SQLITE3_INTEGER);

$deletePusto->execute();

} else {

$result = $db->querySingle("SELECT qty FROM pusto WHERE artikul = '$artikul'", true);

if (!$result) {

$insertPusto->bindValue(':artikul', $artikul, SQLITE3_INTEGER);

$insertPusto->bindValue(':tovar', $tovar, SQLITE3_TEXT);

$insertPusto->execute();

}

}

}

$db->exec("COMMIT");

file_put_contents($ostatkiFile, $ostatkiBuffer);

file_put_contents($pustoFile, $pustoBuffer);

$email = file_get_contents($emailFile);

$emailConfig = json_decode(file_get_contents($emailConfigFile), true);

maillogfile($email, $emailConfig['smtp_username'], $emailConfig['Name'], $emailConfig);

}

$endTime = microtime(true);

$executionTime = $endTime - $startTime;

echo "Время выполнения скрипта: " . round($executionTime, 2) . " секунд";

?>

Сам бы я такое на написал даже после обучение в полгода-год как мне кажется.. по сути тут работы с нейросетью мне на полдня ( хотя в итоге было три попытки- часа по два каждый раз)
Еще стоит учесть что и тех.задание переписывал ( это уже вторая версия глобально). В первый раз почти все получилось- но что-то пошло не так..и на второй день уже снова делал с нуля..и новое тех.задание ( другими словами). Первые запуски были тормозные- секунд по 20.. было переформулировано- сделай быстрей... Нейросеть давала советы- как сделать лучше- переписывала код.. В итоге обработка файла где 1000 товаров- происходит примерно за секунду.
Так то можно даже чему-то научиться если читать советы:-)
Вот и смотрите теперь- как вам такое? Может ли быть полезно? Всякие обработки эксель файлов на ура с кучей условий ( мне практические такое требуется). В итоге конечно на практических примерах лучше тренироваться- тогда можно научиться чему-то.. а если теоретически- даже и не знаю что у этого железного мозга спрашивать:-)
Были нюансы- на хостинге через планировщик не запускалось- были ошибки- спросил в чем дело- оно тоже дало совет, варианты из-за чего могла быть проблема.. так что пользы много))

Показать полностью
[моё] YouTube Нейронные сети Программирование Чат-бот ChatGPT Гайд Ответ на пост Текст Длиннопост PHP Техническое задание Csv Microsoft Excel
9
1
Melodoser
1 год назад
Лига программистов

Прости меня, Spatie...⁠⁠

[моё] Программирование PHP Javascript IT Видео YouTube
0
469
monobogdan
monobogdan
2 года назад
TECHNO BROTHER

Сам себе экосистема: Как я адаптировал старый смартфон под современные реалии и написал клиенты нужных мне сервисов⁠⁠

Сам себе экосистема: Как я адаптировал старый смартфон под современные реалии и написал клиенты нужных мне сервисов Смартфон, Телефон, Идея, Рекомендации, Java, Android, PHP, Ретро, Гаджеты, ВКонтакте, YouTube, Моддинг, Покупка, Приложение, Мобильные телефоны, Сайт, Длиннопост

Время неумолимо бежит вперед: выходят новые гаджеты, постепенно заменяя старые, превращая их в тыкву или в лучшем случае, в «тапочек» для звонков. Сейчас смартфоны стали практически одинаковы во всем: дисплей на всю площадь передней панели, почти полное отсутствие аппаратных кнопок, беспроводная зарядка… Это всё, конечно, здорово, но ведь иногда так хочется взять в руки старый, но такой необычный в наше время QWERTY-смартфон и попытаться его использовать как основной, да и цены на них могут приятно удивить: БУ девайс можно купить за несколько сотен рублей (~5-10$). Одна проблема — клиенты приложений на версии Android 1.6-2.0 безбожно устарели и давно не работают. Но иногда желание воскресить старый девайс превыше потребительского качества и тут я пришёл к мысли… а почему бы не написать с нуля свои клиенты популярных приложений? ВК с музыкой, YouTube, трекинг посылок. Так я и сел писать необходимые в повседневной жизни приложения, с нуля, на голом API Android, без каких либо фреймворков (и даже AppCompat). Получилось ли у меня это? Узнаем в статье!

Мотивация


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

Сам себе экосистема: Как я адаптировал старый смартфон под современные реалии и написал клиенты нужных мне сервисов Смартфон, Телефон, Идея, Рекомендации, Java, Android, PHP, Ретро, Гаджеты, ВКонтакте, YouTube, Моддинг, Покупка, Приложение, Мобильные телефоны, Сайт, Длиннопост


Но до сегодняшнего дня мы с вами обходили прикладной уровень моддинга устройств: т. е. написание самых обычных, повседневных программ, без которых сложно представить жизнь современного человека. Ещё во времена выхода первого Galaxy S в 2010 году, многие из нас уже сутками красноглазили в Java версии «аськи», кто-то уже сидел в ВКонтакте, хоть и большинство не заглядывали в смартфон каждые пару минут для проверки нотификаций.
К 2012 году смартфонная жизнь уже стала похожа на ту, к которой мы привыкли сейчас — соц. сети, мессенджеры, пуши, потоковое видео — многие из нас успели привязаться к такой жизни и… к конкретно тем самым девайсам!

Сам себе экосистема: Как я адаптировал старый смартфон под современные реалии и написал клиенты нужных мне сервисов Смартфон, Телефон, Идея, Рекомендации, Java, Android, PHP, Ретро, Гаджеты, ВКонтакте, YouTube, Моддинг, Покупка, Приложение, Мобильные телефоны, Сайт, Длиннопост


2012 год давно миновал, тенденции в разработке приложений кардинально поменялись, а учитывая, что многие мои читатели не любят выбрасывать девайсы в мусорку (и правильно делают), наверняка кто-то регулярно заглядывает на полочку к своим пыльным «бывшим» гаджетам и рассматривает их с теплотой… но с сожалением понимает, что их время прошло. Или не прошло? :) Ну, тут как посмотреть. Если есть навыки и огромная мотивация, то программер может многое, в том числе и запилить все самые необходимые приложения сам!
Я давно лелеял эту идею, подумывая, как бы лучше её реализовать. Да и почти всю свою жизнь, я писал на C#, практически не «щупав» API Android и его UI фрейморк. В один день у меня очень сильно зачесались руки написать что-нибудь эдакое под него и причём сразу — весьма серьёзное!

Сам себе экосистема: Как я адаптировал старый смартфон под современные реалии и написал клиенты нужных мне сервисов Смартфон, Телефон, Идея, Рекомендации, Java, Android, PHP, Ретро, Гаджеты, ВКонтакте, YouTube, Моддинг, Покупка, Приложение, Мобильные телефоны, Сайт, Длиннопост


Всем этим устройствам более 10 лет. Самым молодым из них является реплика Lumia 1020, которую мы тоже успели замоддить!

Так и родилась идея написать клиент YouTube. А потом и ВК. Ну и трекинг в придачу. Ну а чего б и нет, на всё про всё я выделил себе неделю: за это время я должен успеть закончить пусть и сыроватые, но вполне юзабельные клиенты для моих любимых сервисов. И я начал думать…

Планирование

Сам себе экосистема: Как я адаптировал старый смартфон под современные реалии и написал клиенты нужных мне сервисов Смартфон, Телефон, Идея, Рекомендации, Java, Android, PHP, Ретро, Гаджеты, ВКонтакте, YouTube, Моддинг, Покупка, Приложение, Мобильные телефоны, Сайт, Длиннопост


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

  • В большинстве своём, на старых версиях Android работают одноядерные чипсеты, а значит, лимитированная многопоточность. Никакой работы в UI-потоке кроме обновления интерфейса, а поскольку в первых версиях этой системы интерфейс менее отзывчив, чем в более свежих — нужно сохранять баланс между функционалом, симпатичностью и скоростью работы. Мои приложения должны оптимально работать в следующих условиях: 256мб ОЗУ, из которых свободно в среднем 30-40мб (Сбер, привет тебе с вылетами на 2гб ОЗУ), 1 ядро ~600мгц, видео-ядро уровня Mali300-Malii400. Негусто? Ну, нам сойдет.

  • Вторым ограничением стало тотальное устаревание корневых сертификатов, а как многие из нас знают, просто так их на мобильных системах не обновить. Поэтому придётся идти на хаки — делать сервер-реле, который преобразует трафик из https в http там, где нельзя просто отключить проверку верификации SSL (это как раз кейс с API VK). Решено — отдельный сервер-реле, который отправляет запрос на сервер ВК и обратно возвращает нам обычный результат в JSON.

  • Ну а третьим ограничением стал сам Android. targetSDK = 5 (Android 1.5 Cupcake), никакого AppCompat (кушает драгоценное свободное место), никаких сервисов Google (их тут нет лет 5 уже). Всё на чистом API системы, почти в тех же условиях, в каких 13-14 лет назад писались первые приложения для Android.


    Если я его раздобуду когда-нибудь, то в лепешку расшибусь, но портирую на него свои приложения. Тогда я с гордостью скажу, что мои приложения работают на 100% Android устройств %)


    Полный энтузиазма я сел писать код. Основную часть статьи я решил поделить на каждое приложение отдельно с конкретными объяснениями: где, что и как я делал. Хочется заранее сказать — я не особо давно пишу под Android, зато много писал под WinForms, поэтому какие-то решения могут показаться странными. А некоторые решения обусловлены версией Android. Например, нотификации в первых версиях Android не было Notification.Builder, а сам Notification был больше похож на структуру. Приложения, конечно же, мы будем писать на Java.

ВКонтакте


Первым делом я начал писать клиент ВК и сразу определился со своими хотелками, которые были весьма скромными: возможность листать диалоги, читать сообщения и отправлять их (с полной поддержкой QWERTY-клавиатур, т. е. отправка на Enter), плюс возможность слушать музыку без ограничений. На ВК бочку ни в коем случае не гоню, просто публичного API совсем нет, даже с ограничениями, хотя было бы здорово…

Мне снова хотелось почувствовать те эмоции, которые я когда-то ощущал от прослушивания музыки будучи школяром со своим первым Android-смартфоном. В 2013 году я прилетал со школы и слушал плейлист на практически таком же девайсе с идентичным железом и версией Android. Я хорошо помню, как пользовался прелестями многозадачности Android на 2G интернете (3G чипсет просто не поддерживал): одну песню слушаешь, поставил вторую качаться, пока песня доиграет — уже и вторая скачалась. :)

Сам себе экосистема: Как я адаптировал старый смартфон под современные реалии и написал клиенты нужных мне сервисов Смартфон, Телефон, Идея, Рекомендации, Java, Android, PHP, Ретро, Гаджеты, ВКонтакте, YouTube, Моддинг, Покупка, Приложение, Мобильные телефоны, Сайт, Длиннопост


Итак, хотелки выбраны, пора начинать писать приложение. Для дебага у меня было 3 устройства: Galaxy S4 (Android 4.2 JB), китайский Galaxy S3 Mini I9300 (Android 2.2, на фото выше) и Samsung Galaxy S I9000 (Android 2.3), ну и конечно же эмулятор с 4.4 KitKat. Android Studio и сейчас умеет без проблем собирать приложения вплоть до версии Android 2.2 даже с последними Build Tools и Target SDK — главное выкинуть appcompat, androidx, и юнит тесты из build.gradle. Без каких-либо проблем он цепляет и сами устройства по adb. Даже отладчик без проблем работает.

Первым делом я начал писать активити (полноэкранная форма в терминологии Android, или «экран» приложения) с диалогами — он должен раз в n секунд подгружать данные и строить «морду» для всего этого. По сути, почти весь код клиента — это получение ответа от API ВК, разбор JSON на датасет и визуализация этого датасета на экран. Для этого я ввёл два объекта: VK, который делает асинхронные запросы на сервер, оборачивает работу с сервером-реле и парсит JSON и VKObjectProcessor (это скорее всего отрефакторится до VKDataSet чуть позже).

Сам себе экосистема: Как я адаптировал старый смартфон под современные реалии и написал клиенты нужных мне сервисов Смартфон, Телефон, Идея, Рекомендации, Java, Android, PHP, Ретро, Гаджеты, ВКонтакте, YouTube, Моддинг, Покупка, Приложение, Мобильные телефоны, Сайт, Длиннопост


Архитектура приложения получилось довольно простой и примитивной. При старте активити авторизации проверяет данные приложения (PersistStorage) на наличие API-токена и при его отсутствии запрашивает авторизацию. Как это уже стало классическим среди различных «самопальных» клиентов, мой клиент «прикидывается» официальным приложением ВК — для этого используется связка app_id и app_secret приложения ВКонтакте для Android.

После авторизации приложение перенаправляет нас на страницу диалогов. Поскольку у нас нет ни пушей, ни лонгполлинга, метод обновления остается один — в заданные интервалы. Для этого у нас есть Handler, который раз в 3.5сек берет список диалогов с сервера, проверяет, обновились ли данные и если да — обновляет датасет, отправляя сигнал обновления интерфейса (который построен на ListView). Кроме того, у нас есть кэш аватарок — точно так же распаралелленый на несколько потоков, а загруженные на данный момент превьюшки хранятся в хэшмапе.

Сам себе экосистема: Как я адаптировал старый смартфон под современные реалии и написал клиенты нужных мне сервисов Смартфон, Телефон, Идея, Рекомендации, Java, Android, PHP, Ретро, Гаджеты, ВКонтакте, YouTube, Моддинг, Покупка, Приложение, Мобильные телефоны, Сайт, Длиннопост


При этом сообщения реализованы схожим образом — на данный момент возможности горячей подгрузки сообщений «сверху» нет, поэтому обновляются последние 50 сообщений скопом и сразу. Шустро ли всё это работает? Вполне неплохо. Конечно, основное процессорное время уходит на разбор тяжелых JSON, но тут отчасти вина ВК — мало того, что кастрировали функционал getHistory в последних версиях API, так ещё и нет возможности возвращать только те поля, которые нужны.

Сам себе экосистема: Как я адаптировал старый смартфон под современные реалии и написал клиенты нужных мне сервисов Смартфон, Телефон, Идея, Рекомендации, Java, Android, PHP, Ретро, Гаджеты, ВКонтакте, YouTube, Моддинг, Покупка, Приложение, Мобильные телефоны, Сайт, Длиннопост


Как же я поступил с аудиозаписями? Музыка через API — настоящая заноза для разработчиков клиентов, с которой пришлось «подолбаться». Правда, недолго — раз у нас для основных запросов уже есть сервер-реле, то почему бы не сделать ещё и для музыки? Суть обхода простая: если сгенерировать специальный API-токен, то можно свободно обращаться к методам, связанным с музыкой без необходимости притворяться официальным клиентом и «подписывать» запросы md5 ключом. Примитивный PHP-скрипт как раз и предоставляет такую возможность, позволяя получить доступ к базе музыки ВК, однако ограничение типичное — у пользователя должны быть открыты аудиозаписи:

Тут был код на пхп, о его скушал пикабу!

По итогу у меня получился рабочий плеер с поиском музыки и добавленными треками. Опять же — производительность остаётся отличной! Ссориться с ребятами из ВК не хочу, поэтому добавлять возможность качать треки пока не стал — но вам стоило бы быть подружелюбнее к разработчикам кастомных клиентов! :)

Сам себе экосистема: Как я адаптировал старый смартфон под современные реалии и написал клиенты нужных мне сервисов Смартфон, Телефон, Идея, Рекомендации, Java, Android, PHP, Ретро, Гаджеты, ВКонтакте, YouTube, Моддинг, Покупка, Приложение, Мобильные телефоны, Сайт, Длиннопост


Что мы получили по итогу? Довольно простенький клиент ВК, который практически не потребляет ОЗУ и шустро работает. Да, здесь не хватает кучи различных фич — как минимум, прсомотра ленты и стены. Но ещё успеется — если проект будет интересен не только мне, то продолжим наращивать фишечки потихоньку! Уже ближе к релизу я слегка причесал клиент, добавив более «вкшный» дизайн и приделал анимированное боковое меню. Про Animation ещё кто-то помнит? :)

Сам себе экосистема: Как я адаптировал старый смартфон под современные реалии и написал клиенты нужных мне сервисов Смартфон, Телефон, Идея, Рекомендации, Java, Android, PHP, Ретро, Гаджеты, ВКонтакте, YouTube, Моддинг, Покупка, Приложение, Мобильные телефоны, Сайт, Длиннопост

YouTube


С разработкой клиента YouTube были свои особенности: во-первых, в отличии от клиента ВК, видео через реле просто так не загрузишь, слишком много трафика, а во-вторых, YouTube уже не «отдаёт» видео в форматах, которые поддерживают старые устройства — в основном, это h263 до 720p. К сожалению, потоковое видео с софтовым декодированием уложит на лопатки большинство «одноядерников» тех лет.

Сам себе экосистема: Как я адаптировал старый смартфон под современные реалии и написал клиенты нужных мне сервисов Смартфон, Телефон, Идея, Рекомендации, Java, Android, PHP, Ретро, Гаджеты, ВКонтакте, YouTube, Моддинг, Покупка, Приложение, Мобильные телефоны, Сайт, Длиннопост


Ситуация осложнялась тем, что ни VideoView, ни стандартные плееры всех смартфонов, на которых я отлаживал приложение, не умели игнорировать ошибки SSL и просто валились с ошибкой. Пришлось что-то придумывать: ведь видосики хочется смотреть на крутейшем AMOLED дисплее Galaxy S!

Сам себе экосистема: Как я адаптировал старый смартфон под современные реалии и написал клиенты нужных мне сервисов Смартфон, Телефон, Идея, Рекомендации, Java, Android, PHP, Ретро, Гаджеты, ВКонтакте, YouTube, Моддинг, Покупка, Приложение, Мобильные телефоны, Сайт, Длиннопост


Посидел я, подумал и придумал. Для поиска по базе YouTube, получения информации и прямых ссылок на видео я решил использовать альтернативный фронтэнд YouTube, который называется Invidous API — крутая штука со своим API, которая сама распределяет пул токенов самого ютуба и отдаёт ответы в виде JSON. Форматы запросов очень простые: <url инстанса Invidous>/api/v1/метод, например «search?q=test&region=RU&hl=ru» — выдаст нам результат поиска «test» в Российском регионе. Очень удобно, да? А ещё Invidous — не какой-то отдельный сервис, а целая сеть т. н. инстансов — какой хочешь, такой и юзай! Поскольку большинство инстансов «прячется» за свежими сертификатами, пришлось идти на довольно известный костыль с отключением верификации хостнеймов у HttpUrlConnection:

А туть был костыль на Java.

А поскольку у нас нет возможности воспроизводить потоковое видео онлайн, то я решил его просто предварительно загружать через собственный менеджер закачек, с возможностью последующей очистки кэша. Поскольку таким устройствам 2060p качество не нужно, я выбираю 240p-360p mp4 в avc кодеке, в среднем ролики по 30 минут весят около 30-40 мегабайт. При HSDPA+, загрузка подобного видео займет около минуты-двух — не так уж и много, можно и подождать. Закинул тестовую версию в беседу любителей ретро-мобилок — люди были в восторге. ;)

Сам себе экосистема: Как я адаптировал старый смартфон под современные реалии и написал клиенты нужных мне сервисов Смартфон, Телефон, Идея, Рекомендации, Java, Android, PHP, Ретро, Гаджеты, ВКонтакте, YouTube, Моддинг, Покупка, Приложение, Мобильные телефоны, Сайт, Длиннопост


Поскольку Invidous отчасти строится на анонимности — авторизации тут нет. Однако свою задачу посмотреть видосики он выполняет нормально — поэтому весь UI приложения я поделил на 4 вкладки: тренды, популярное, история и поиск. Подписки, как и историю можно реализовать на стороне клиента — для некоторых такой подход покажется плюсом, для кого-то — нет, однако минимальный задел для клиента уже есть — мы можем смотреть видео!

А где скачать?


Приложения и бэкэнд полностью открытые, исходный код доступен по лицензии GPLv3. Следить за статусом проекта можно на моём GitHub!
Последние версии можно скачать в релизах проекта.

Из текущих хотелось:

  • Портировать на Android 1.6. Несмотря на то, что приложение в целом имеет targetSDK = 5, на 2.1 оно работать отказывается. В Android, после 2.1, слегка поменялся бинарный формат xml разметок, из-за чего приложение на старых системах вылетает с исключением. Но это решаемо: eclipse adt в зубы, импортируем проект и вперед! ;)

  • Кроме того, я экспериментировал с попытками как можно сильнее уменьшить нагрузку как на сеть, так и на процессор путём облегчения датасетов. Если один JSON от ВК весит в среднем 30-60кб (который 1 ядерный чипсет частотой 600мгц может «долго» жевать, негативно сказываясь на UI), то примитивный KeyValue формат, который содержит только нужные поля умещается в 5-6-7кб в текстовом виде и благодаря своей примитивности (весь парсинг — два substring, один indexof и поиск ключа по хешмапе) совсем не «налегает» на процессор. Благодаря этим наработкам, я запилил и примитивный клиент ВКшечки для j2me.

    В целом, можно сделать единый формат датасетов для мессенджеров, а на бэкэнде реализовывать всё что угодно — Telegram, ВК, да хоть личные сообщения на хабре, а для платформ только делать «морды»: так можно завести современные мессенджеры и на Sailfish, и на J2ME, и на Symbian, и на WinMobile, практически без пота и крови :)

  • Полная адаптация под кнопочное управление. Сейчас с клиента можно без проблем писать сообщений с любой клавиатуры, в том числе и QWERTY. Однако основной интерфейс всё ещё не полностью адаптирован под кнопки и требует выполнения некоторых действий пальцем.

Заключение


Как по мне — получилось вполне неплохо. Да, приложения кое-где сыроваты и явно не дотягивают по функционалу до их больших версий. Но кое в чем они всё таки выигрывают: они лёгкие и быстрые, а самое главное — ещё могут продлить жизнь любимого девайса для кого-то. И я считаю — это классно! Среднее потребление ОЗУ обеими клиентами: 5-10мб. Вес APK: 30-50кб на момент выхода статьи. Вот что значит писать под голое API без модных фреймворков! ;)
Что до остального функционала — кое-что в Android продолжает неплохо работать и в наше время. Например, DLNA-стриминг в доме, E-Mail клиент или банкинг через смски. Я уверен, это покрывает 80% потребностей большинства пользователей — так разве после этого можно назвать старые смартфоны бесполезными?

Я писал эту статью с целью показать вам, что старые девайсы отнюдь не тыква, если есть щепотка энтузиазма в глазах и любовь к гаджетам, а заодно и поделиться с вами своими приложениями. Часто в комментариях мне пишут, что хотели бы пользоваться своими смартфонами и дальше, если бы не устаревающие версии Android. А вы как считаете? Жду ваше мнение в комментариях.

Статья подготовлена при поддержке компании TimeWeb Cloud. Подписывайтесь на меня и @Timeweb.Cloud, чтобы не пропускать новые статьи про девайсы каждую неделю! А ещё не забудьте проставить плюсик на хабре, если статья вам понравилась - это поможет с финансированием и выходом новых статей!

Показать полностью 13
[моё] Смартфон Телефон Идея Рекомендации Java Android PHP Ретро Гаджеты ВКонтакте YouTube Моддинг Покупка Приложение Мобильные телефоны Сайт Длиннопост
110
Партнёрский материал Реклама
specials
specials

Сколько нужно времени, чтобы уложить теплый пол?⁠⁠

Точно не скажем, но в нашем проекте с этим можно справиться буквально за минуту одной левой!

Попробовать

Ремонт Теплый пол Текст
22
TheTeaLover
TheTeaLover
2 года назад
Web-технологии
Серия Туториалы по бэкенд разработке

Продолжаю делать курс про PHP⁠⁠

Сегодня в программе куки, сессии и азы ООП

Показать полностью 5
[моё] IT PHP Туториал Ооп Видео YouTube Длиннопост
7
74
TheTeaLover
TheTeaLover
2 года назад
Серия Туториалы по бэкенд разработке

Делаю курс про PHP⁠⁠

Всем привет, ребята! Я тут пытаюсь развивать свой youtube канал про IT и потихонечку пилю курс по PHP для новичков. Может кому-то здесь пригодится.

Показать полностью 5
[моё] IT Программирование Туториал PHP Видео YouTube Длиннопост
25
Baskovsky
Baskovsky
2 года назад
Лига программистов
Серия Айтишники

PHP - выбор начинающего программиста⁠⁠

Ведущий Денис Басковский вместе с веб-программистом Дмитрием Горяевым обсуждают язык ПХП. Дмитрий - программист со стажем работы более 12 лет. Начиная свою карьеру веб-мастером, он с тех пор продолжает совершенствовать свои знания по языку PHP. В интервью вы узнаете положение дел в мире пхп, узнаете историю языка, подробнее узнаете про фреймворки Laravel, Yii и Symfony. В конце видео проведем небольшой блиц-опрос, где узнаем ответы на популярные вопросы в мире PHP-разработки.

[моё] YouTube Интервью IT Программирование PHP Программист Веб-разработка Yii Yii2 Laravel Видео
4
22
TheTeaLover
TheTeaLover
2 года назад
Web-технологии
Серия Туториалы по бэкенд разработке

Введение в бэкенд для чайников⁠⁠

Хочу сделать серию уроков по серверной разработке для новичков. Вот первый ролик

[моё] Web IT PHP Nginx Туториал Программирование Linux Видео YouTube
11

Продвиньте ваш пост

Перейти
Партнёрский материал Реклама
specials
specials

Нужно больше внимания к постам? Есть способ!⁠⁠

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

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

Продвинуть пост

Продвижение Посты на Пикабу Текст
nikitavas
2 года назад

Платформа для разработки ERP учетных систем (бесплатно)⁠⁠

Всем привет.

Делал в качестве хобби платформу для быстрой разработки учетных систем.

Кому надоело вести документацию в Excel или Access, а 1С еще дорого, но хочется для себя использовать полноценную базу данных.

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


Выбрал такое трехзвенное решение:

JS(JQuery) - Сервер приложений(Apache+PHP) - БД(MySQL или MariaDB)

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


В результате получилось решение, где можно по быстрому накидать таблиц, создать также быстро UI для них(однотипное) и далее сосредоточиться только на написании прикладного кода.

Готовые объекты для форм, таблиц, прикладного кода, отчетов. CRUD, фильтрация, сортировка из коробки. Для манипуляций с данными сделана надстройка в стиле Excel (устанавливаете нужные фильтры и работаете с таблицами). SQL учить особо не надо, только представлять какие данные в каких таблицах.


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

Есть готовые примеры, которые можно смотреть как сделано и делать наподобие, лишнее можно выпилить. На полноценную документацию сил не хватило, честно говоря уже выдохся. Весь код открыт, даже кое-где есть комментарии. Файл с описанием внутри архива (PDF).

Кодинг через веб есть, но это блажь, можно отключить и кодить в вашей любимой IDE, файлы объектов (форм, таблиц, классов, отчетов в отдельных каталогах).

Все весит 10Mb, без codemirror около 5Mb.

ЯП на фронте Javascript(JQuery), на сервере PHP в чистом виде практически. Это чтобы не зависеть от перехода на новые версии чего либо, т.к. вам нужно будет, чтобы работало как можно дольше без обновлений, такая специфика учетных систем.

Теоретически должно работать даже на Astra Linux, но я не пробовал.


Размещаю небольшие демонстрации на видео. Там же ссылка на скачивание (во втором видео demo2).

https://www.youtube.com/watch?v=ONOFC8kjtTU

https://www.youtube.com/watch?v=G34ZniBclsk

Показать полностью 2
[моё] Программирование Linux Разработка Erp Бесплатно PHP Javascript Web IT Видео YouTube Длиннопост Mysql
4
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии