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

Башня

Аркады, Строительство, На ловкость

Играть

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

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

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

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

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

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

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

Programming

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

Программирование Все
964 поста сначала свежее
anetto1502
anetto1502
2 месяца назад
Лига программистов

Нельзя использовать goto⁠⁠

Часто говорят, что goto плох. А собственно, почему?

В ассемблерном коде на машинном уровне все управляющие конструкции (if, while, for и другие) преобразуются в набор команд с безусловным переходом jmp (UPD: как правильно заметили, с безусловным или условным переходом, но по указанному адресу, то есть куда угодно). А такой переход — самый настоящий goto. То есть ты весь такой изящный во фраке пишешь циклы, а наглый компилятор/интерпретатор выкидывает всю красоту и делает goto.

Так почему же сам goto является признаком плохого кода, если он на самом деле везде?

Ответ кроется в умении сохранять контекст. Человек может в голове держать 5-9 сущностей, больше не получается. Поэтому придумали функции, и придумали держать их небольшими — для снижения когнитивной сложности. Конструкция if переведёт тебя в одну из веток ниже, циклы for и while выполнят тело цикла или выбросят за его пределы. Команда goto сложность привносит — прыжок может быть куда угодно. А повышение сложности всегда приводит к росту числа ошибок.

Нельзя использовать goto Программирование, IT, Goto, Хороший код

Ну а ещё из-за goto может напасть велоцираптор

[моё] Программирование IT Goto Хороший код
26
13
zserhio
zserhio
2 месяца назад
Программирование на python

Простая пинговалка с графиком на Python⁠⁠

Простая пинговалка с графиком на Python Программирование, Python, Длиннопост

https://www.online-python.com/HRuJIQPs3E

import tkinter as tk

from icmplib import ping

from datetime import datetime

from collections import deque

import matplotlib.pyplot as plt

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

import configparser

import matplotlib.dates as mdates

import threading


UPDATETIME = 20

INI_FILE = 'hosts.ini'

COLUMN = 2

GRAHP_WIDTH = 600

GRAHP_HEIGHT = 300

GUI_GEOMETRY = "1220x650"

PING_COUNT = 2

PING_INTERVAL = 2

DATA_LIMIT = 3000

class Host:

def __init__(self, ip, name, width_pixels, height_pixels, log_callback):

self.ip = ip

self.name = name

self.ping_data = deque(maxlen=DATA_LIMIT)

self.time = deque(maxlen=DATA_LIMIT)

self.log_callback = log_callback


dpi = 100

width_inches = width_pixels / dpi

height_inches = height_pixels / dpi


self.fig, self.ax = plt.subplots(figsize=(width_inches, height_inches), dpi=dpi)

self.line, = self.ax.plot([], [], label=f'{ip} {name} ms', color='darkgreen', linestyle='-', linewidth=2)

self.ax.legend()


self.ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))

self.ax.xaxis.set_major_locator(mdates.MinuteLocator(interval=30))


self.fig.autofmt_xdate()


def ping_host(self, ip, count=PING_COUNT, interval=PING_INTERVAL):

return ping(ip, count=count, interval=interval)


def update_ping(self):

try:

response = self.ping_host(self.ip)

current_time = datetime.now()

self.time.append(current_time)


if response.is_alive:

self.ping_data.append(response.avg_rtt)

else:

self.ping_data.append(0)

self.log_callback(f"{current_time.year}.{current_time.month}.{current_time.day} {current_time.hour}:{current_time.minute} : {self.name} ({self.ip}) недоступен\n")


self.line.set_data(self.time, self.ping_data)


self.ax.relim()

self.ax.autoscale_view()

self.fig.tight_layout()

self.canvas.draw()

except Exception as e:

print(f"Error pinging {self.ip}: {e}")


class App:

def __init__(self, GUI, ini_file):

self.gui = GUI

self.gui.title("Монитор Доступности оборудования")

self.gui.geometry(GUI_GEOMETRY)


self.hosts = self.load_hosts_from_ini(ini_file)


self.log_text = tk.Text(self.gui, height=10, width=80, wrap='none', state='disabled')

self.log_text.grid(row=0, column=0, padx=10, pady=10, sticky="nsew")


self.log_scrollbar = tk.Scrollbar(self.gui, orient="vertical", command=self.log_text.yview)

self.log_scrollbar.grid(row=0, column=1, sticky="ns")

self.log_text['yscrollcommand'] = self.log_scrollbar.set


self.canvas = tk.Canvas(self.gui)

self.scrollbar = tk.Scrollbar(self.gui, orient="vertical", command=self.canvas.yview)

self.scrollable_frame = tk.Frame(self.canvas)


self.scrollable_frame.bind(

"<Configure>",

lambda e: self.canvas.configure(scrollregion=self.canvas.bbox("all"))

)


self.canvas.create_window((0, 0), window=self.scrollable_frame, anchor="nw")

self.canvas.configure(yscrollcommand=self.scrollbar.set)


for i, host in enumerate(self.hosts):

canvas = FigureCanvasTkAgg(host.fig, master=self.scrollable_frame)

canvas.get_tk_widget().grid(row=i//COLUMN, column=i%COLUMN, padx=5, pady=5)

host.canvas = canvas


self.canvas.grid(row=1, column=0, sticky="nsew")

self.scrollbar.grid(row=1, column=1, sticky="ns")


self.gui.grid_rowconfigure(1, weight=1)

self.gui.grid_columnconfigure(0, weight=1)


self.start_ping()


def load_hosts_from_ini(self, ini_file):

config = configparser.ConfigParser()

config.read(ini_file)

return [Host(ip, hostname, width_pixels=GRAHP_WIDTH, height_pixels=GRAHP_HEIGHT, log_callback=self.log_message) for section in config.sections() for hostname, ip in config.items(section)]


def log_message(self, message):

self.log_text.config(state='normal')

self.log_text.insert("1.0", message)

self.log_text.config(state='disabled')


def start_ping(self):

for host in self.hosts:

thread = threading.Thread(target=host.update_ping)

thread.start()

self.gui.after(UPDATETIME * 1000, self.start_ping)


GUI = tk.Tk()

app = App(GUI, INI_FILE)

GUI.mainloop()

https://www.online-python.com/HRuJIQPs3E

формат ини-файла

[DNS]

google1 = 8.8.8.8

google2 = 8.8.4.4

cloudflare1 = 1.1.1.1

Quad9 = 9.9.9.9

Показать полностью
[моё] Программирование Python Длиннопост
10
185
Mixerrr3
2 месяца назад
Android

Ответ на пост «RuStore - 2»⁠⁠2

Автор все смешал в одном посте: майнер, прослушка, вирусное ПО, разделение программы на две части. Я немного знаю о программировании, писал ПО для Windows, пользуюсь андроидом давно и есть, что ответить. Давайте по порядку.

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

После ресета (еле нашёл это сочетание клавиш) всё поднялось и тут же вывалилась куча уведомлений от рустора - доступно 16 обновлений.

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

Стоит разнести данные, которые могут вообще ежесекундно обновляться (СУБД например) и сама программная часть, которая должна обновляться как можно реже

С разделением ПО на СУБД и локальную часть звучит очень странно. Появление новых функции в серверной части, потребует так же изменений в локальной версии. Да и трафик приложение будут потреблять еще больше, а время запуска увеличится. Автор явно не знает основ объектно-ориентрованного программирования. То, что работает, как правило, стараются не трогать, а вот новые баги появляются при внесении новых функций и попытке прикрутить их к старому.

Весь современный говнософт пишется по принципу "хуяк-хуяк и в продакшен!"

Проблемы с софтом, это результат маркетинга (да, автор прав насчет быстрее разработка, меньше тестов), но не только в этом.

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

Вторая проблема - это эффект "Nero Burning Rom", кто работает с компами давно, помнит программу для записи на диски. Сначала это была легкая программа, с удачным интерфейсом и возможностями. Но со временем туда воткнули кучу "плюшек", сделали свой плеер, редактор всего подряд и в результате программа стала тяжелая и никому не нужная. Подобное встречается в приложениях интернет-магазинов, клиентов банков, клиентов мобильных операторов (привет Мегафон с приложением более 200 Мб с рекламой и играми) и т.д.

Мобильные приложения - это какой то особый филиал ада. Неспроста новые версии андроида не ставятся на уже старые телефоны (чего блять? ему всего год!) Поэтому нехрен там обновлять и сам софт.

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

Итого у нас есть:

  1. Разработчики операционной системы (Адроид в данном случае) с своими требованиям безопасности и новыми функциями.

  2. Производители "железа", которые пытаются сделать что-то свое из урезанного бюджета, но при этом с максимальным функционалом.

  3. Разработчики оптимизированной ОС именно на телефон (тот же MIUI по сути надстройка над андроидом от Сяоми), которые хотят сделать ОС под себя, что бы было красиво, функционально, добавить своё ПО и часто рекламу.

  4. Разработчики ПО, работающие по тех. заданию, пытающиеся сделать ПО для разного зоопарка телефонов и оболочек.

  5. Маркетинг отделы, в каждом из 4-х пунктах выше, цель которых максимизация прибыли.

  6. Законодательство РФ - теперь в телефонах необходимо предустановленное российское ПО.

Рустор это всего лишь альтернатива гугл плей, если из-за него что-то виснет, напишите разработкам о проблеме, укажите модель телефона и проблему, не поверите, но они действительно заинтересованы, чтобы телефон не вис.

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

Показать полностью
[моё] Личный опыт Android IT Мысли Программирование Мат Текст Ответ на пост
14
87
moose.kazan
moose.kazan
2 месяца назад

Ответ на пост «RuStore - 2»⁠⁠2

Кидать говном в разработчиков мобильных приложений вообще последнее дело. У разработчиков самих яйки в тисках. Тот же Google регулярно предлагает выбор: либо разработчик публикует обновление с поддержкой нового SDK или гугл удаляет приложение. И в итоге разработчик даже если ничего не планировал обновлять раз в год вынужден тупо пересобирать приложение под новый SDK и публиковать его.

Причём публиковать обновления к существующим приложениям это ещё ладно. Тут требования мягче. А вот чтобы опубликовать новое приложение надо соответствовать ещё более жёстким требованиям. Желающие могут почитать хотя бы тут.

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

Хотя если смотреть глубже то КМК самая идея мобильных приложений порочна. Многие приложения появились как результат неумения сверстать сайт так, чтобы он нормально отображался на смартфонах. Всякие интернет-магазины, пиццерии и проч. Вполне достаточно PWA. Но это уже совсем другая боль.

Личный опыт Android IT Мысли Программирование Мат Текст Ответ на пост
18
79
tproger.official
tproger.official
2 месяца назад
Типичный программист

Берегите детей от айтишки⁠⁠

Берегите детей от айтишки
IT IT юмор Программирование Программист Дети Скриншот
16
1
YellowClub
YellowClub
2 месяца назад

На прошлой неделе Николай Оберемко провел второй митап в Краснодаре⁠⁠

1/3

Несмотря на то, что из-за дождя город встал в одной большой пробке, участники прошли этот челлендж и добрались до места назначения ✔️

Спикеры показали отличные доклады, которые расширили кругозор и смотивировали на освоение новых направлений.

✔️ Доклад Романа Чумадина про мобильные приложения напомнил Николаю его опыт работы с мобильными технологиями 1С. Это, действительно, удобно и полезно.

✔️ Доклад Владимира Пилипенко показал, как можно в 1С выстраивать невероятные интеграции на примере решения CAD задач в 1С в рамках отраслевого решения.

Презентации спикеров и фото уже в чате Желтого клуба Краснодара. Вступайте, чтобы посмотреть материалы и не пропустить следующие митапы: https://t.me/+11qT3JDBcKFhMzgy

Показать полностью 3
1С Программирование 1с:предприятие 8 Telegram (ссылка)
8
732
Dimonbee
2 месяца назад

RuStore - 2⁠⁠2

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

РУСТОР - ВРЕДОНОСНОЕ ПО!!!

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

Ну и пояснительная бригада к предыдущему моему посту, почему частое обновление программ - вообще не ок! Стоит разнести данные, которые могут вообще ежесекундно обновляться (СУБД например) и сама программная часть, которая должна обновляться как можно реже - не чаще, чем раз в полгода. Потому что не трожь то, что работает!

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

Я давно живу на этом свете, компы появились при мне. Но не настолько давно, чтобы меня начала подводить моя память :) Типовой жизненный цикл программного продукта:

разработка > рост популярности, при этом активная ловля багов, работа с фидбеком от пользователей > потом попытка в монетизацию > забытье. Поэтому некоторые старые ещё бесплатные версии работают по сей день назло автору.

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

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

Мне минусы кидают те, кто кормится на этом блядстве чтоли? Вы и есть те самые говнокодеры, которые из индусских фреймворков собирают свои глюкавые поделия?

Показать полностью
[моё] Личный опыт Android IT Мысли Программирование Мат Текст
371
7
CodePanda
CodePanda
2 месяца назад
Лига программистов
Серия LOL Engine

Девлог LOLEngine 0⁠⁠

Привет, игроделы!

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

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

На сегодня успелось только собрать базу на гит и вызывать окошко. Обо всем по порядку:

Завел проект на гите и стянул его на машину. Далее создал вот такую структуру папок:

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

Код движка расположился в папке LOLEngine, и собираться он будет в виде статической библиотеки. Точка входа int main() тоже будет расположена здесь.

Код проекта будет в папке Game, сборка - в исполняемый файл.

Ну и все сторонние библиотеки будут складываться в папку ThirdParty.

Начну с подключения сабмодулей к своему репозиторию. Мне понадобятся: сейчас - glfw, потом - glm (сильно потом сюда будут спиханы все json, imgui и прочее)

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

Сабмодули подключил, обновил, проверил наличие в папке ThirdParty. Далее - прежде чем открывать папку репозитория в VS Code, следует сразу создать файл .gitignore (чтобы в комит не шло то, что не должно туда идти) и файл CMakeLists.txt в корне репозитория, и по одному CMakeLists.txt в папках LOLEngine и Game

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

Открываю папку в VS Code и создаю файл main.cpp в LOLEngine/Internal и пустой GameSettings.cpp в Game/Sources (в каждый проект надо добавить как минимум один файл исходного кода, чтобы CMake не ругался)

Далее перехожу в корневой CMakeLists и пишу следующее:

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

CMAKE_SUPPRESS_REGENERATION добавил, чтобы при сборке в IDE не создавался таргет для теста сборки

Движок и исполняемый проект подключаю через add_subdirectory. CMake найдет файлы CMakeLists в соответствующих папках.

CMakeLists.txt проекта Game выглядит так:

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

В туториалах часто видел, как все добавляемые файлы прописывают вручную в add_executable или add_library.

Здесь я использую file(GLOB_RECURSE) чтобы рекурсивно пройти по папкам и найти все файлы, сохранить их в переменную GAME_SOURCES и GAME_HEADERS и дальше добавить в проект. Для сборки достаточно добавить только cpp и c файлы, но чтобы hpp, h были видны в IDE если кто-то соберет под Visual Studio или XCode, добавляю и их.

source_group(TREE) сохранит структуру каталогов при сборке под IDE

Далее на очереди CMakeLists движка:

Нахожу OpenGL, аналогично Game, прохожусь рекурсивно по папкам в поисках исходников, подключаю в статическую библиотеку.

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

Далее папку с внутренними заголовками подключаю как PRIVATE, а папку Include и загаловки glm, glfw - как PUBLIC, чтобы они были видны в Game

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

Ну и заканчиваю подключением библиотек. Если в папке сабмодуля есть CMakeLists.txt высокая вероятность, что ее можно подключить через add_subdirectory и не париться вообще (Imgui потом придется собирать самим)

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

С этим закончили. Теперь если в main.cpp написать простой int main(), то все запустится.

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост
Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

Заработало

Теперь проекту нужно передать размер и название окна в движок (позднее и некоторые другие данные). Для этого в LOLEngine/Include/Engine/Core создаю файл AppSettings.hpp и объявляю простую структурку.

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

Pikabu! Сделай форматирование кода в тексте! задолбался все картинками ставить!

Все внешние функции и методы я сложу в файле LOLEngine/Include/Engine/ExternalSettings.hpp где пока будет объявлена одна extern функция GetApplicationSettings()

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

В папке Game/Sources/ создаю файл GameSettings.cpp и пишу реализацию функции GetApplicationSettings();

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

Возвращаюсь в движок - в main.cpp и получаю первые настройки из исполняемого модуля Game.

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост
Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

Запускаю и радуюсь окошку.

Девлог LOLEngine 0 Разработка, Программирование, Gamedev, Инди, Длиннопост

На сегодня это все. Успел мало, но надеюсь разогнаться на днях. Спасибо тем, кто подписался и @AABVGD, за идею написать под веб-сборку. В следующем посте постараюсь подключить OpenGL, glad и emscripten для сборки цветного окошка под desktop и web. Ссылка на репо

Ставьте плюсы/минусы, пишите в комментах что я сделал так, а что не так.

PS: Если кто знает как вставлять код с форматированием на Pikabu, расскажите

Показать полностью 17
[моё] Разработка Программирование Gamedev Инди Длиннопост
7
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии