Как безболезненно перейти с Python на Rust?
1) Python медленный
2) В python нет адекватного управления памятью
3) В python мне приходится испльзовать кучу мегабайт библиотек (я чувствую себя тупым и бесполезным при импортировании библеотек)
4) Python кажется игрушечным языком
5) Python не подходит род микроконтроллеры (micropython - просто игрушка)
6) Проблемы из-за GIL'а
Есть ли сейчас смысл в оттачивании чистого PHPЯзык всегда первичен. Да.
если мне +- хватает понимания, как работает та же Ларавел?Ты серьезно думаешь, что у тебя "хватает понимания", как работает фреймворк? Больше не повторяй вслух эти слова. Никогда. Особенно на собеседовании. Иначе собеседующие тебя похоронят за плинтусом.
Может, при возможности стоит обратить внимание на другой язык(Го, шарп, нода)?Сегодня разговаривал с HR-ом, дословно: php-шников и фронтов много. Больше остальных. Спрос на другие языки - go и питон - там низкая конкуренция. Не могу ей не поверить, т.к. php существует более 20 лет и за это время в отрасль вкатилась куча людей. Откровенно говоря, очень скоро значительный % пхп-макак пойдет в такси, включая меня. Конкуренция, судя по собеседованиям - адовая. Спрашивают сам язык и ещё 250 сопутствующих технологий.
не рискую пока идти на собеседования потому что хочу закрыть чеклист: несколько проектов в портфолио на чистом PHP, laravel; подучить JS с Аяксом; Добить тестирование, а также чуть разобраться с докером, линуксом и теоретической частью этих ваших интернетов.мертвому припарка. Ты никогда в "домашних условиях" не получишь боевой опыт. Лучше иди работай за "ничего", больше пользы будет.
Хотел узнать, настолько ли это плохой способ натяжки?
global
лучше объявить глобальный объект и спрятать flag
в него:class PortScanner:
def __init__(self):
self.flag = 0
def animate_menu_up(self):
print("\n")
...
self.flag = 1
__init__()
глобального объекта. И основной цикл вынести в отдельный метод, например, run()
. Тогда на нижнем уровне у нас останется что-то вроде:import ...
class PortScanner:
...
if __name__ == '__main__':
main_obj = PortScanner()
main_obj.run()
def animate_menu_up():
""" Создание красивого меню (вверх). """
while True:
в select_mode()
,MF_INITIAL = 0
MF_MENU_CENTER = 1
MF_MENU_DOWN = 2
MF_SELECT = 3
SCREEN_WIDTH = 50
ALL_PORTS = [22, 80, 7777, 2516]
SOCK_TIMEOUT = 0.5
ANIM_SYMBOL = '~'
ANIM_DELAY = 0.02
except RuntimeError:
continue
если вы действительно хотите продолжить выполнение программы после такой ошибки (что в обычных обстоятельствах бессмысленно и опасно), то позаботьтесь хотя бы о правильной индикации:import traceback
...
except RuntimeError:
traceback.print_exc(file=sys.stdout)
continue
while True:
try:
{
MF_MENU_CENTER: th_three.start,
MF_MENU_DOWN: th_two.start,
MF_SELECT: select_mode,
}[flag]()
except RuntimeError:
traceback.print_exc(file=sys.stdout)
continue
Такой наивный подход выводит много шелухи на экран, но это не важно. Важно то, что такой код проще читать и дорабатывать, чем цепочку if...elif...else
.def animate_menu_center():
""" Создание анимации центрального меню. """
# настройки для анимации
output_strings = [
'[1] scan all ports',
'[2] scan enter port',
'[3] exit',
'SCANNER V1.0',
]
# анимация названия
for output_string in output_strings:
print('\r\t\t', end='')
for ch in output_string:
print(ch, end='')
time.sleep(ANIM_DELAY)
# last string?
if output_string != output_strings[-1]:
# new line
print()
print('', flush=True)
flag = MF_MENU_DOWN
(Я убрал цвета для простоты.)# TODO: реализовать режим '2' (скан произвольного списка портов)
Это однозначно плюс − показывает, что вы умеете работать в команде и пользоваться системами контроля версий.class Category
{
private $children = null;
public function __get($property)
{
if ($property === 'children') {
if ($this->children !== null) return $this->children;
else {
$this->children = $this->getChildren();
return $this->children;
}
} else {
throw 'Undefined property';
}
}
private function getChildren()
{
// TODO: запрос к базе и получение результата
}
}
$category = new Category();
someAction($category->children); // в первый раз будет запрос
showSubCategories($category->children); // второй и послудеющий раз возьмёт уже из приватного поля
$var1=1;
$var2=2;
foreach(['var1','var2'] as $name) echo $$name;
В Firestore у вас должны храниться посты, желательно, чтобы у постов было поле likes: [...userId]
, чтобы пользователь не мог лайкать пост бесконечно.
likes
есть id
пользователя, то блокируете кнопку лайка.like
action - если запрос на лайк резолвнулся успехом, обновляете state постов локально.