1. PHP / Говнокод #26855

    0

    1. 001
    2. 002
    3. 003
    4. 004
    5. 005
    6. 006
    7. 007
    8. 008
    9. 009
    10. 010
    11. 011
    12. 012
    13. 013
    14. 014
    15. 015
    16. 016
    17. 017
    18. 018
    19. 019
    20. 020
    21. 021
    22. 022
    23. 023
    24. 024
    25. 025
    26. 026
    27. 027
    28. 028
    29. 029
    30. 030
    31. 031
    32. 032
    33. 033
    34. 034
    35. 035
    36. 036
    37. 037
    38. 038
    39. 039
    40. 040
    41. 041
    42. 042
    43. 043
    44. 044
    45. 045
    46. 046
    47. 047
    48. 048
    49. 049
    50. 050
    51. 051
    52. 052
    53. 053
    54. 054
    55. 055
    56. 056
    57. 057
    58. 058
    59. 059
    60. 060
    61. 061
    62. 062
    63. 063
    64. 064
    65. 065
    66. 066
    67. 067
    68. 068
    69. 069
    70. 070
    71. 071
    72. 072
    73. 073
    74. 074
    75. 075
    76. 076
    77. 077
    78. 078
    79. 079
    80. 080
    81. 081
    82. 082
    83. 083
    84. 084
    85. 085
    86. 086
    87. 087
    88. 088
    89. 089
    90. 090
    91. 091
    92. 092
    93. 093
    94. 094
    95. 095
    96. 096
    97. 097
    98. 098
    99. 099
    100. 100
    <?php
    /* -= Developed by [email protected] =- */
    // -= О П Ц И И =-
    require("config.php");
    // Технические настройки скрипта
    header('Content-Type: text/html; charset=utf-8');
    ini_set('memory_limit', '-1');
    // -=-=-=-=-=-=-=-
    
    // -= Функции инкапсуляции технических аспектов =-
    // Функция печати логов, добавляет "date n time now" и перенос строки
    function printLog($text) { echo sprintf("[%s] %s", date("Y-m-d H:i:s"), $text) . "\n"; }
    // Функция преобразования текста в ключ индекса, убирает пробелы, переводит в верхний регистр и добавляет префикс "_"
    function str2idx($str) { return "_" . strtoupper( str_replace(' ', '', (string)$str) ); }
    // Функция генерации ассоциативного массива индексов, использует str2idx
    function genIdxs($array, $val_key, $idx_keys, $filter_func=NULL) {
        $idxs = [];
        foreach ($array as $item) {
        	if ($filter_func && !$filter_func($item)) { continue; } 
        	if (is_string($idx_keys)){
        		foreach (preg_split("/\s?;\s?/", $item[$idx_keys]) as $idx) {
        			if ($idx) { $idxs[str2idx($idx)] = str2idx((string)$item[$val_key]); }
        		} unset($idx);
        	} else {
        		foreach ($idx_keys as $idx_key) {
        			foreach (preg_split("/\s?;\s?/", $item[$idx_key]) as $idx) {
        				if ($idx) { $idxs[str2idx($idx)] = str2idx((string)$item[$val_key]); }
        			}
        		} unset($idx_key);
        	}
        } unset($item);
        return $idxs;
    }
    // Функция сравнения изображений
    function compareImages($image1, $image2) {
        $compare_result = $image1->compareImages($image2, IMAGICK_METRIC);
        return (int)$compare_result[1] > THRESHOLD_SIMILARITY_VALUE;
    }
    // Функция исполнения SQL-запросов в БД, инкапсулирующая все ужасы взаимодействия с БД MySQL на PHP
    function execSQL($sql, $mode="fetch_assoc") {
        // Проверяем коннект к БД, в случае проблем - пытаемся переподключ
        if (!$GLOBALS["mysqli"] || $GLOBALS["mysqli"]->connect_errno) { 
        	$GLOBALS["mysqli"] = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); 
        	if ($GLOBALS["mysqli"]->connect_errno) {
        		throw new Exception("Can't connect to DB: (".$GLOBALS["mysqli"]->connect_errno.") ".$GLOBALS["mysqli"]->connect_error);
        	}
        	printf("default charset: %s\n", $GLOBALS["mysqli"]->character_set_name());
        	/* изменение набора символов на utf8 */
        	if (!$GLOBALS["mysqli"]->set_charset("utf8")) {
        		throw new Exception("set charset utf8 error: %s\n", $GLOBALS["mysqli"]->error);
        	} else { printf("current charset: %s\n", $GLOBALS["mysqli"]->character_set_name()); }
        }
        $_result = $GLOBALS["mysqli"]->query($sql);
        if (!$_result) { printLog("SQL ERROR: ". $GLOBALS["mysqli"]->error . "\n executable SQL: " . $sql . "\n\n"); }
        if (is_bool($_result)) { return $_result; }
        elseif ($mode==="num_rows") { return $_result->num_rows; }
        elseif ($mode==="fetch_assoc") {
        	$result = [];
        	while($row = $_result->fetch_assoc()) {
        		reset($row);
        		$key = str2idx($row[key($row)]);
        		$result[$key] = $row;
            } unset($row);
            return $result;
        }
        throw new Exception("Recieved unexpected mode (".$mode.") or query result by execute SQL: ".$sql );
    }
    // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    
    // -= Старт работы скрипта =-
    $start = microtime(true);
    printLog("Updater script started");
    // Инициализация глобальных переменных, счетчиков
    $GLOBALS["mysqli"] = NULL;
    $kingsilk_offers_count = 0;
    // Проверка хранилища фотографий
    if (!is_dir(IMAGES_PATH)) throw new Exception("ERROR: images path not found!");
    $IMAGES_FULL_PATH = IMAGES_PATH . IMAGE_PATH_PREFIX;
    if (!is_dir($IMAGES_FULL_PATH)) mkdir($IMAGES_FULL_PATH);
    // -=-=-=-=-=-=-=-=-=-=-=-=-=-
    
    // -= Получение YML-данных от поставщика Кингсилк, формирование индексов =-
    $yml_catalog = new SimpleXMLElement(
        file_get_contents(YML_URL_KINGSILK)
    );
    // Формирование индекса импортируемых категорий по id'шнику категории поставщика
    $GLOBALS['cats_outer_idxs'] = [];
    foreach ($yml_catalog->categories->category as $cat){
        $GLOBALS['cats_outer_idxs'][str2idx((string)$cat["id"])] = $cat;
    } unset($cat);
    // Группировка предложений поставщика по схожести картинок,
    // формирование древовидного индекса по md5 хэшу картинок
    $offers_groups_idxs = [];
    foreach ($yml_catalog->offers->offer as $offer) {
        // Отсеиваем не опубликованные товары
        if ((string)$offer["available"] != "true"){
        	continue;
        }
        $kingsilk_offers_count++;
        $hash = NULL;

    - = А ЧО ТУТ НЕЛЬЯ ПОСТИТЬ ПОЛНЫЙ КОД = - ???
    ===~ ТАМ ДОХРЕНА ЕЩЁ ~==

    P.S - вот как кодят питонисты на php
    продолжение: <a href="https://raw.githubusercontent.com/Siyet/goods-updater-oc3-php7/master/updater.php">Перейти</a>

    Запостил: vasily2808, 10 Августа 2020

    Комментарии (136) RSS

    • >opencart
      Ответить
      • Борманд?
        Ответить
        • Борманд привёл свою девушку на говнокод?
          Ответить
          • Вот HACTEHbKA расстроится, когда узнает...
            Ответить
          • Hestia is the virgin goddess of the hearth,

            не похоже, чтоб оно чья-то девушка
            Ответить
            • Да японцы всегда у каких-нибудь богов имена пиздят...

              Это ещё ладно, тут хотя бы в тему, а то встречается и Нива Лада.
              Ответить
            • А вдруг там платоническое
              Ответить
    • > // Функция исполнения SQL-запросов в БД, инкапсулирующая все ужасы взаимодействия с БД MySQL на PHP

      хахаха
      Ответить
    • Я же говорю, что дело в языке
      Может быть на питоне Целко писал и неплохо, но как только коснулся пыхомусора, так сразу

      if (!$GLOBALS["mysqli"]->set_charset("utf8")) {
      Ответить
      • Именно поэтому я за «PHP».
        Ответить
        • [url=https://sun9-59.userapi.com/qldYkWKAwPDeHarCkjouyKPyHnTlzsNYW2Xviw/OD_eh7Mv4aQ.jpg]Мы всегда поддержим друг друга![/url]
          Ответить
          • Здесь нет тега 'URI'. А вообще стоит прочитать мануал по тегам, которые поддерживает ГК. http://govnokod.ru/page/bbcode
            Ответить
      • В питоне тоже есть global, не пизди.
        Ответить
        • только ими никто не пользуется
          Ответить
          • Потому что у пыхи более жёсткие правила, там без global вообще глобалки не видно. А в питоне они вполне доступны без global, разве что писать нельзя.

            Вон, к слову, в том же flask'е параметры запроса через тред-локал глобалки передаются.
            Ответить
            • Именно поэтому я за «PHP».
              Ответить
            • > Вон, к слову, в том же flask'е параметры запроса через тред-локал глобалки передаются.
              Там же не совсем чистая глобалка, она в мудуль завёрнута — flask.request. Так что неявно ничего в глобальном неймспейсе не появляется.
              Ответить
              • Труъ глобального неймспейса в питоне вообще нету, и на том спасибо.

                Но глобалка не перестаёт быть глобалкой если к ней префикс приписать. Так то я и в няшной я могу написать flask_request и радоваться.
                Ответить
                • Так чтобы она вообще в твоём неймспейсе появилась — тебе её надо явно импортировать из мудуля. С тем же успехом её можно заменить на какой-нибудь вызов «flask.get_request()», разницы не будет.
                  Ответить
                  • А, я понял о чём ты. В пыхе глобалки настоящие, поэтому их прячут от программиста. А в питоне ты их сам себе в модуль натащил, поэтому проблемы с ними нет. Ок.
                    Ответить
                  • З.Ы. Но в любом случае, это глобальное состояние. Хоть ты его в синглтон засунь, хоть через DI прокинь.

                    Т.е. проблемы с реентерабельностью, внезапными побочными эффектами и т.п. никто не отменял.
                    Ответить
                  • Вот взять тот же ctypes.

                    Юзаю я, к примеру, ctypes.windll.user32.MessageBoxW. И хочу описать типы аргументов для него. Заафектит ли это соседние модули, которые тоже его юзают?
                    Ответить
                    • Не знаю, я с ним не работал. Нужно смотреть, что такое «windll.user32.MessageBoxW».
                      Ответить
                      • > я с ним не работал

                        А это неважно. Я думаю 99.9% питонистов, которые с этим работали, ничего ответить не смогут.
                        Ответить
                        • Проверил. Это глобальные пельменные, ctypes.windll.user32.MessageBoxW будет единой во всех мудулях.
                          # Libs/ctypes/__init__.py
                          windll = LibraryLoader(WinDLL)
                          ...
                          class LibraryLoader(object):
                              def __init__(self, dlltype):
                                  self._dlltype = dlltype
                          
                              def __getattr__(self, name):
                                  if name[0] == '_':
                                      raise AttributeError(name)
                                  dll = self._dlltype(name)
                                  setattr(self, name, dll)
                                  return dll
                          ...
                          class WinDLL(CDLL):
                                  """This class represents a dll exporting functions using the
                                  Windows stdcall calling convention.
                                  """
                                  _func_flags_ = _FUNCFLAG_STDCALL
                          ...
                          class CDLL(object):
                              ...
                              def __getattr__(self, name):
                                  if name.startswith('__') and name.endswith('__'):
                                      raise AttributeError(name)
                                  func = self.__getitem__(name)
                                  setattr(self, name, func)
                                  return func
                          Ответить
                      • The result is cached, so repeated attribute accesses return the same library each time.

                        Т.е. ctypes.windll.user32 возвращает один и тот же объект. Этот вариант не работает для линукса т.к. нужно полное имя so'шки.

                        При этом ctypes.WinDLL('user32.dll') всегда возвращает новый.

                        Functions exported by the shared library can be accessed as attributes or by index. Please note that accessing the function through an attribute caches the result and therefore accessing it repeatedly returns the same object each time. On the other hand, accessing it through an index returns a new object each time.

                        Т.е. user32.MessageBoxW всегда возвращает один и тот же объект.

                        Но user32['MessageBoxW'] вернёт отдельную копию, которую уже можно спокойно настраивать.

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

                        Какие тонкости )))
                        Ответить
                        • > ['MessageBoxW']
                          Ох уж эта перегрузка операторов… Нет бы взять и сделать нормальный, человеческий «user32.load_function('MessageBoxW')», обязательно надо выёбываться.
                          Ответить
                          • Ну типа лаконичность, питонисты же не любят читать лишние буковки.

                            И ещё везде эта любовь к кешированию в глобалках чтобы юзер уж точно наступил на грабли юзеру не пришлось писать свои переменные.
                            Ответить
                            • Мне ещё вот это нравится:
                              >>> On Windows, ctypes uses win32 structured exception handling to prevent crashes from general protection faults when functions are called with invalid argument values:
                              >>> windll.kernel32.GetModuleHandleA(32)  
                              Traceback (most recent call last):
                                File "<stdin>", line 1, in <module>
                              OSError: exception: access violation reading 0x00000020

                              >>> There are, however, enough ways to crash Python with ctypes, so you should be careful anyway. The faulthandler module can be helpful in debugging crashes (e.g. from segmentation faults produced by erroneous C library calls).

                              Как раз недавно обсуждали, что будет, если поток в процессе убить прямо во время выполнения. Тут та же самая картина, только ещё хуже: своим «OSError» они делают вид, что всё хорошо, когда на самом деле после AC внутри системного вызова можно только сложить лапки и тихонько помереть.
                              Ответить
                              • > только ещё хуже

                                Угу, это вообще уязвимость. Разрешили хакеру тыкаться в память, пока не повезёт. Даже meltdown можно реализовать!

                                SEH лучше вообще не обрабатывать. Как и соответствующие сигналы на линухе.
                                Ответить
            • во фляшке вполне можно не знать ничего про глобалы
              @app.route('/path/<path:subpath>')
              def show_subpath(subpath):
                  print(subpath)
              Ответить
              • Тело запроса и заголовки так попарсить не получится. Параметры запроса (которые после знака вопросика), впрочем, тоже.
                Ответить
                • фу, кака ваш фласк тогда

                  В джанге можно так
                  def my_view(request):
                      pass #ну понятно, да?
                  Ответить
                  • С flask.request однохуйственно же.
                    А вообще, у путей во фляжке есть крутая фишка:
                    @app.route('/post/<int:post_id>')
                    def post(post_id: int) -> flask.Response:
                        ...
                    Ответить
                    • в джанге начиная с двойки тоже так можно.

                      Разница в том, что во-первых маппинг вынесен в отдельный файл, во-вторых первый параметр всегда request, а потом остальеые, и наконец есть ООПышки вокруг этого для фомочек там итд
                      Ответить
                      • > маппинг вынесен в отдельный файл
                        Дык во фляжке тоже спокойно можно вынести.

                        > во-вторых первый параметр всегда request
                        Фу, бойлерплейт!
                        Ответить
                        • в джанге он практически всегда в отдельном файле.

                          >бойлерплейт
                          зато не глобальное говно.

                          Алсо, очень часто писать вручную вьюшки вообще не надо, бо в комплекте идет куча говна, интегрированного с ORM, формами итд: фулстек жи.
                          Ответить
                          • > в джанге он практически всегда в отдельном файле.
                            Это уже вопрос подходов, а не функциональности. В официальном туториале, кстати, всё аккуратно разнесено по разным файлам:
                            https://github.com/pallets/flask/tree/1.1.2/examples/tutorial/flaskr.

                            > зато не глобальное говно.
                            Так во фласке оно и не глобальное.
                            Ответить
                            • выж сами тока что сказали, что в реквест надо лазить вручную, и что аргументом он не передается?

                              >вопрос подходов
                              джанго гораздо более жестко диктует архитектуру
                              Ответить
                              • > выж сами тока что сказали, что в реквест надо лазить вручную, и что аргументом он не передается?
                                Ну да. В глобальном пространстве имён (пространстве имён текущего мудуля, если угодно) его не будет, если ты не попросишь. С тем же успехом «глобальным говном» можно назвать какое-нибудь «django.urls.path()».

                                > джанго гораздо более жестко диктует архитектуру
                                Я против фреймворков, в которых «Hello World» занимает шесть файлов.
                                Ответить
                                • path не хранит в себе состояние, а request хранит.

                                  Функция, зависящая только от своих аргументов, более чиста, и легче поддается тестированию.

                                  >анимает шесть файлов.
                                  Тогда тебе понарвится чистый PHP: там hello world занимает один файл.
                                  Ответить
                                  • Чистый php это, к сожалению, не фреймворк (

                                    А в чём проблема шести файлов, gost?
                                    Ответить
                                    • > А в чём проблема шести файлов, gost?
                                      В оверинжиниринге и излишней сложности для простых задач.
                                      Ответить
                                      • А что такое простая задача и что такое сложная? нгк - это какая задача?

                                        Фреймворки же не делают для хелловордов.

                                        Тем более, что эти файлы не надо руками писать в нормальных фреймворках.
                                        Ответить
                                        • Простая задача — API «NGK», например. Или морда перекатного петуха:
                                          import os
                                          import json
                                          import logging
                                          from typing import Dict, List, Union
                                          
                                          import flask
                                          import sqlalchemy.sql as sql
                                          from sqlalchemy.orm import joinedload
                                          
                                          import perekat.config as config
                                          from perekat.schema import ScopedSession, Offtop, OfftopCategory
                                          from perekat.log import get_logger, redirect_basic_logging
                                          
                                          
                                          L = get_logger('api', logging.DEBUG)
                                          redirect_basic_logging(L, logging.INFO)
                                          
                                          app = flask.Flask(__name__, template_folder=os.path.join(config.WORKING_DIR_PATH, 'templates'))
                                          app.secret_key = config.SECRET_KEY
                                          
                                          
                                          @app.route('/api/index')
                                          def index_json() -> flask.Response:
                                              categories: List[Dict[str, Union[str, int]]] = []
                                              offtops: List[Dict[str, Union[str, int, bool]]] = []
                                              with ScopedSession() as session:
                                                  for cat in session.query(OfftopCategory).order_by(OfftopCategory.id.asc()):
                                                      categories.append({'id': cat.id, 'name': cat.name})
                                                      for offtop in cat.offtops:
                                                          offtops.append({'category_id': cat.id,
                                                                          'visible_num': offtop.visible_num,
                                                                          'index': offtop.index,
                                                                          'vanished': offtop.vanished,
                                                                          'post_id': offtop.post_id,
                                                                          'auto_offtop': offtop.auto_offtop})
                                          
                                              resp = app.make_response(json.dumps({'categories': categories, 'offtops': offtops}, ensure_ascii=False))
                                              resp.mimetype = 'application/json; charset=utf-8'
                                              resp.headers['Access-Control-Allow-Origin'] = '*'
                                          
                                              return resp
                                          
                                          
                                          @app.route('/')
                                          def index_html() -> flask.Response:
                                              with ScopedSession() as session:
                                                  categories = session.query(OfftopCategory).options(joinedload(OfftopCategory.offtops)).all()
                                                  return flask.make_response(flask.render_template('index.html', categories=categories))
                                          Ответить
                                          • > 'index.html'
                                            > perekat.config
                                            > perekat.schema
                                            > perekat.log
                                            > os.path.join(config.WORKING_DIR_PATH, 'templates')

                                            - поясните мысль
                                            Ответить
                                            • Какую именно?
                                              Ответить
                                              • У тебя ещё 4 файла, если я правильно понимаю, не считая шаблонов.
                                                Ответить
                                                • Это куски перекатного петуха, которые используются по инерции. «log» не нужен («systemd» всё пишет), «config» тоже. Остались app.py и schema.py — вполне себе нормально для примитивной морды.
                                                  Ответить
                                                  • Ну и индекс.

                                                    Не, я тебя на самом деле отчасти понимаю. Сам в своё время плюнул на VIPER по этой причине, хотя у меня там и была кодогенерация.

                                                    Просто пусть будет хоть 106 файлов, если они реально нужны, а если у нас сущность ради сущности, то конечно, я с тобой только соглашусь, это ерунда
                                                    Ответить
                                                    • Это всё как-то очень обще.

                                                      Если тебе нужно выдать по HTTP результат вызова одной функции, то конечно нужно брать flask: зачем тут джанга?

                                                      Если тебе нужно хранить в базе десять объектов, связанных между собой какими-то отношениями, и предоставлять UI для заполнения это базы через админику, то логичнее взять django.

                                                      Без привязок к конкретной задаче сравнивать трудно.

                                                      Но говрить "джанго говно, потому что там нужно шесть файлов" это как сказать "линукс хуже доса, потому что в линуксе больше файлов"
                                                      Ответить
                                                      • > джанго говно, потому что там нужно шесть файлов
                                                        Ну так это же субъективное мнение. Вот не нравится мне она* и всё.

                                                        * А вот объективно я её рекомендую, разумеется. Если вдруг мне придётся писать гостевуху сложное веб-приложение — скорее всего, я буду это делать именно на ней.
                                                        Ответить
                                                      • Возьми тот же VIPER. Это пять сущностей: view, interactor, presenter, entity, router. А по сути это тот же MVC, просто раздутый до неприличия. Но три сущности проще, чем пять, если пять делают то же самое, что и три.
                                                        Ответить
                                                        • Я не знаю viper, но могу сказать, что мне нравятся системы с четырьмя сушностями.

                                                          * Template (шаблон)
                                                          * View (код, специфичный для отображения в html)
                                                          * Service layer (общий API системы, не специфичный для веба)
                                                          * Модели

                                                          В джанге вот сервис леера нету из коробки, остальное есть.
                                                          Ответить
                                                          • Service layer ты сам пишешь, его нигде нет.

                                                            Остальное это вариации MVC. И у тебя три сущности по итогу. Поменял бы на 5 + Service layer?
                                                            Ответить
                                                            • Когда его нет в документации и в best practicies, его и в приложениях тоже нет.

                                                              >Поменял бы на 5 + Service layer?
                                                              надо смотреть как именно сделано.

                                                              В тяжелых случаях можно ввести еще ViewModel, и растянуть всё на еще большее число сущностей.
                                                              Ответить
                                    • Ну как не фреймворк?
                                      На нем можно писать веб приложения же).

                                      Фласк с питоном позволяет делать это намного удобнее, но ведь и фласк надо ставить.

                                      Это же всегда трейдофф: чем больше функциональности из коробки, тем питушня сложнее.
                                      Ответить
                                  • > path не хранит в себе состояние, а request хранит.
                                    Если уж на то пошло, в «Python» любой объект хранит в себе состояние:
                                    >>> django.urls.path.x = 42
                                    >>> django.urls.path.x
                                    42

                                    Там даже есть какие-то публичные атрибуты «func» и «keywords».

                                    > Тогда тебе понарвится чистый PHP: там hello world занимает один файл.
                                    А тебе нравится ЙАЖА и https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition?
                                    Ответить
                                    • >в «Python» любой объект хранит в себе состояние:
                                      конечно, но ты не обязан это делать, правда?

                                      >А тебе нравится ЙАЖА
                                      Больше, чем ПХП.

                                      И уж точно больше, чем написание одинакового говна.

                                      Фласк, вероятно, хорош, когда у тебя либо специфические задачи, либо очень простые.

                                      Когда же у тебя обычный энтерпрарйз с кучей объектов в бд, и кучей форрмочек для их заполнения, то вдруг внезапно оказывается, что достаточно описать модели, и получить из коробки готовую админку, готовые формочки с валидацией и сохранением созданных объектов, готовый ORM, и еще охулион django apps вроде поддержки oauth.


                                      Ругать джангу за шесть файлов, это примерно как ругать питон за то, что в нем файлов больше, чем в lua
                                      Ответить
                                      • > конечно, но ты не обязан это делать, правда?
                                        Что делать? Это «Питон» делает, а не я.

                                        > И уж точно больше, чем написание одинакового говна.
                                        Вроде лишнего параметра «request» даже там, где он не нужен?

                                        > Фласк, вероятно, хорош, когда у тебя либо специфические задачи, либо очень простые.
                                        Именно поэтому я за «простые задачи».
                                        Ответить
                                        • >Что делать?
                                          хранить в модуле состояние и ходить туда.

                                          Жили были две функции:
                                          def petuh():
                                              return makaka.foo.bar
                                          
                                          
                                          def petuh2(makaka):
                                              return makaka.foo.bar


                                          какая из них лучше?

                                          >Вроде лишнего параметра «request» даже там, где он не нужен?

                                          Часто писать view вообще не обязательно.

                                          https://docs.djangoproject.com/en/3.1/topics/class-based-views/generic-display/

                                          >Именно поэтому я за «простые задачи».

                                          К сожалению, не все задачи бывают простые.

                                          Гост, пройди туториал по джанге, правда. Это займет у тебя не более часа, и наша беседа станет немного более предметной, не?)
                                          Ответить
                                          • > хранить в модуле состояние и ходить туда.
                                            «path» — это не мудуль, это функция.

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

                                            > Гост, пройди туториал по джанге, правда.
                                            Я пытался. Отвращение к фронту не позволило продвинуться дальше первой главы.
                                            Ответить
                                            • >«path» — это не мудуль, это функция.
                                              еще лучше. Ты можешь навесить любой атрибут на функцию, но зачем?

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

                                              Приведи пример, где лучше первая.

                                              >Отвращение к фронту
                                              К какому именно фронту? К языку шаблонизции? Он правда блевотный (как и все не xml-based), но его можно поменять.

                                              Какой у тебя шаблонизатор во фласке?
                                              Ответить
                                              • > но зачем?
                                                Чтобы показать, что любой объект в «Питоне» хранит состояние.

                                                > Приведи пример, где лучше первая.
                                                Ну, например, мне нужно написать функции с единообразным определением petuh1()-petuh999(), из которых макаку использует только петух номер 123.

                                                > К какому именно фронту?
                                                К фронту как к концепции. «Джанга» слишком сильно привязана к созданию веб-сайтов. Не то что бы это не было её основным назначением, конечно…

                                                > Какой у тебя шаблонизатор во фласке?
                                                «Jinja», ЕМНИП.
                                                Ответить
                                                • >что любой объект в «Питоне» хранит состояние.

                                                  может хранить, но ты не обязан это использовать, да?

                                                  >например
                                                  Я не очень понял юзкейс, можешь подробнее написать ЗАЧЕМ?

                                                  > «Джанга» слишком сильно привязана к созданию веб-сайтов.

                                                  Не понял. А чего ты хочешь? веб api?
                                                  Так есть Django REST, и там тоже самое все, только json вместо фронта.*

                                                  Шаблоны и статика не обязательны в Django.

                                                  >Jinja
                                                  Джанго её умеет из коробки, кстати.
                                                  template_engine можно поменять


                                                  *
                                                  https://www.django-rest-framework.org/
                                                  Ответить
                                                  • > может хранить, но ты не обязан это использовать, да?
                                                    Я ж говорю — какое-то состояние есть у любых объектов. У того же «django.url.path» — публичные атрибуты «func» и «keywords».
                                                    >>> django.urls.path.func
                                                    <function _path at 0x00000156C289E5E0>
                                                    >>> django.urls.path.keywords
                                                    {'Pattern': <class 'django.urls.resolvers.RoutePattern'>}


                                                    > Не понял. А чего ты хочешь?
                                                    Писать бэк и никогда в глаза это дерьмо под названием «фронт» в общем и «HTML/CSS/JS» в частности не видеть! В гейдев податься, ёб.
                                                    Ответить
                                                    • >когда в глаза это дерьмо под названием «фронт»

                                                      Так в джанге ты не обязан же))
                                                      Я ж грю: ты можешь сделать приложение чисто с REST API.

                                                      Ну да, ты не используешь 20% возможностей джанги, но и пофиг.
                                                      Формочки с ORM у тебя всё равно будут, просто сабмититься они будут через REST API (и будут они не формочками, а json).

                                                      >гейдев
                                                      Я почему-то думал, что ты на работе крестовик, а вебпараша у тебя только для себя, не?
                                                      Ответить
                                                      • В мечтах мы крестовики, а на работе визитки на пыхе пишем.
                                                        Ответить
                                                        • Был же старый мем:

                                                          Собеседование: а можете переписать алгоритм, чтобы работал за логарифм от n?

                                                          Первый рабочий день: добавьте в отчет поле "страна", и выделите его красным
                                                          Ответить
                                                          • Говорят, что пыхеры могут нормально зарабатывать. Сеньоры конечно, ну и те, кто не совсем уж абизяна.

                                                            Так шо если кто-то в профессии чисто ради бабла, то почему и нет
                                                            Ответить
                                                            • мне не известны случаи, чтобы крествик работал пыхером по причине бабла, хотя вероятно у большинства сеньоров примерно одинаковые зп (+- процентов двадцать) в рамках одной компании)

                                                              То есть смена языка не приводит к резкому изменению ЗП обычно
                                                              Ответить
                                                              • Ого, по-твоему 20% это примерно одинаково?

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

                                                                  Боюсь, что для изучения крестов пыхеру понадобится много отпусков, и еще потом года три практики, но это не точно
                                                                  Ответить
                                                                  • Ну от пяти косарей 20% это штука, как бы принципиальное различие.

                                                                    Конечно, если в конторе кап ограничен восьмьюстами долларами, то не так заметно
                                                                    Ответить
                                                                    • Если ты получаешь пять косарей (мы же про баксы?) то возможно, что штука для тебя не так уж и много.

                                                                      Кажется, что дело всё таки в процентах.

                                                                      Если ты получаешь 10 долларов, то повышение на 20 долларов это очень много, правда?

                                                                      > кап ограничен восьмьюстами долларами
                                                                      хочется верить, что сеньоры столько не получают даже в Усть-Каменогорсках
                                                                      Ответить
                                                                      • > Если ты получаешь 10 долларов, то повышение на 20 долларов это очень много, правда?
                                                                        - так это и не 20%.

                                                                        Если мы говорим про сеньоров, неважно, пыхеров или крестовиков, в крупных городах, то зп в 4 и даже 5 косарей зелёных не кажется чем-то удивительным. При чём тут 10 долларов?
                                                                        Ответить
                                                                        • Это был пример того, что важны не абсолютные цифры, а проценты.

                                                                          Если сенор получает 5К, то 1К для него не безумные деньги.

                                                                          Если джун получает 1К, то разумеется 1К для него безумные деньги. А вот 200 баксов -- нет.

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

                                                                            Мы начали с того, что ты сказал, что +/- 20% это почти одинаково.

                                                                            Вот возьмём ставку в 4500 и определим интервал по твоим процентам. Это от 3600 до 5400 баксов. 1800 разницы между минимумом и максимумом. Это копейки что ли?

                                                                            Прикинь, ты дохуя сеньор и вдруг узнаёшь, что Вася из соседнего угла не только пялит по четвергам Катю из эйчарни, а ещё и получает на 1800 баксов больше. Твоя реакция?
                                                                            Ответить
                                                                            • Зависит от того, нравится ли мне Катя из эйчарки.

                                                                              Вот именно потому у нас в конторе зарплаты обсуждать и запрещено
                                                                              Ответить
                                                                              • Но ты согласен, что +/- 20% это не одинаково?
                                                                                Ответить
                                                                              • > запрещено

                                                                                Что будет, если разгласить?
                                                                                Татьяныч, например, увольняет нахуй, если узнаёт.
                                                                                Ответить
                                                                                • нельзя так просто взять и уволить
                                                                                  это должно быть четко прописано, например, в приложении к трудовому договору о неразглашении, которое подписывает работник
                                                                                  Ответить
                                                                                  • Можно не уволить, а заставить уволиться.
                                                                                    Ответить
                                                                                    • трудовое законодательство в нашей стране всегда на стороне работника
                                                                                      если работник не хочет увольняться, то ты тупо заебешься его увольнять, проще будет сократить штатную единицу и заплатить 3 оклада
                                                                                      Ответить
                                                                                      • Сократить тоже может быть сложно. Если у сотрудника двое детей, то сократить нужно того, у кого нет детей. Иначе доказывать профнепригодность.
                                                                                        Ответить
                                                                                        • вот
                                                                                          теперь ты думаешь в правильном направлении
                                                                                          Ответить
                                                                                          • Но можно заебать сотрудника так, чтобы он сам захотел уволиться. Задач там подкидывать, дежурств, поссориться с ним, и прочего неприятного.
                                                                                            Ответить
                                                                                            • у работника обязательно есть должностная инструкция (которые всегда пишут жопой, это факт)

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

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

                                                                                              трудовая инспекция не любит, когда в неё пишут, будет ходить на проверки, обязательно что-нибудь найдет (кадровый учет это полный пиздос, его точно не программисты разрабатывали, трактовки могут быть иногда диаметральные)

                                                                                              т.е. не надо ссориться со своими работниками, и надо расставаться полюбовно

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

                                                                                              так что проще будет расстаться полюбовно

                                                                                              (если что, все страшилки я рассказываю не из личного опыта, но в курсе о том, что такой головняк работодателю нахер не сдался, лучше не попадать в эти ситуации)
                                                                                              Ответить
                                                                                              • у нас просто радикально всё не так как в США
                                                                                                в США могут выпиздить работника в любой момент, куча способов и культура чуть ли не почасовой оплаты, и даже если ты резко заболел, то ты уже под угрозой
                                                                                                дикие люди
                                                                                                Ответить
                                                                                              • Ну вот тебе по какой-то причине (не будем уточнять по какой: он токсичный мудак, или он увёл у тебя жену) нужно выпиздить сотрудника, но он встал в позу. Твои действия?
                                                                                                Ответить
                                                                                                • > увёл у тебя жену

                                                                                                  Да и хуй с ней. Зачем нужна такая жена? Он же не в мешок её засунул и увёз в свой осетинский аул.
                                                                                                  Ответить
                                                                                                  • С ней может быть и хуй, но с ним сможешь потом работать?
                                                                                                    Ответить
                                                                                                    • Вай нот? Может быть и побухаем потом, когда её кто-то ещё "уведёт".
                                                                                                      Ответить
                                                                                                      • Начальникам и подчинённым бухать вместе это вообще такая себе идея имхо
                                                                                                        Ответить
                                                                                                        • Почему?
                                                                                                          Ответить
                                                                                                          • Потому что потом случается «дружба дружбой, а служба службой»

                                                                                                            Когда сохраняются чисто рабочие отношения, то и рабочие вопросы решать проще.

                                                                                                            Ну и зачем лишний повод давать для обвинений в фаворитизме
                                                                                                            Ответить
                                                                                                            • Звучит как хуйня. Что мешает работать в рабочее время, а дружить в остальное? Это же не служба. Мы про коллектив программистов.
                                                                                                              Бухать всей командой тоже нельзя? Ну и руководитель может уйти, а на его место с высокой вероятностью станет кто-то из команды, и что, разрывать нерабочее общение?
                                                                                                              Ответить
                                                                                                              • Лично для себя я вывел правило, что на работу я хожу работать. Для дружить, бухать, целоваться должен быть другой круг общения.

                                                                                                                > Это же не служба
                                                                                                                - а что это, хобби за зарплату?
                                                                                                                Ответить
                                                                                                        • А помоему отличная идея в рамках тимбилдинга-то. Другой вопрос, что начальник должен уметь не спизднуть лишего пока пьяный
                                                                                                          Ответить
                                                                                                    • > с ним сможешь потом работать

                                                                                                      Тут либо несовместимость, косяки с моей стороны и т.п. И тогда чела в общем-то не в чем обвинять.

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

                                                                                                      Жена не велик, просто так не уведут.
                                                                                                      Ответить
                                                                                                      • Ладно, похуй.
                                                                                                        Тред не об этом, я для примера привёл. Вопрос был в том как выпиздить сотрудника.
                                                                                                        Ответить
                                                                                                        • http://www.garant.ru/article/1272786/

                                                                                                          И да, ничего не сработает, если сотрудник беременная или в декретном отпуске (по родам или уходу за ребенком), кроме закрытия конторы.
                                                                                                          Ответить
                                                                                                          • > закрытия конторы

                                                                                                            Попробуйте выйти и зайти.

                                                                                                            Блин, даже тут это работает.
                                                                                                            Ответить
                                                                                                        • реально же это будет комплексная проблема, индивидуальная

                                                                                                          1) прежде всего стоит признать, что это проеб менеджера/начальника, любую поебень можно детектить на относительно раннем этапе, пресекать, принимать меры, не доводить до крайностей

                                                                                                          если дошло до крайностей - работник даже не на половину виноват

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

                                                                                                          т.к. я всегда ставлю высокие цели, а решаем мы нестандартные вещи, на низкой морали это никак, фейл

                                                                                                          поэтому надо оградить остальных в первую очередь, минимизировать ущерб

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

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

                                                                                                          если коллектив неоднозначно оценивает кто мудак, а кто нет, значит работодатель мудак, он должен признать это и расстаться полюбовно, с выплатой нужного числа окладов, и сделать это как можно быстрее
                                                                                                          Ответить
                                                                                                  • Борманд, ты как-то очень логично мыслишь.

                                                                                                    Большинство самцов проявляет агрессию к тем, кому дала их самка, хотя это очевидно глупо: выпёздывание с работы любовника жены не приводит к возврату жены. Но люди живут эмоциями, а не мозгом
                                                                                                    Ответить
                                                                                                    • > люди живут эмоциями, а не мозгом

                                                                                                      Именно поэтому я за подушку.
                                                                                                      Ответить
                                                                                                      • то есть если у тебя спиздят подушку, то ты не будешь мстить??
                                                                                                        Ответить
                                                                                                  • А ты тоже из Осетии?
                                                                                                    Ответить
                                                                                                • Дуэль на php
                                                                                                  Ответить
                                                                                                • Теоретически можно заебать сотрудника выговорами, и после трёх выговоров уволить за профнепригодностью.

                                                                                                  Доебаться всегда есть до чего.

                                                                                                  Но сотрудник может пойти в суд, и заебать тебя в ответ.

                                                                                                  Так что лучше уговорить его уволиться самому
                                                                                                  Ответить
                                                                                • Смотря какая форма трудоустройства и в какой стране
                                                                                  Ответить
                                                                                • он еще хвастался, что сначала всем разрешал курить на работе, а потом сам бросил, и всем сотрудникам тоже запретил.

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

                                                                                  Что будет у нас -- я не знаю, скоее всего начальник вызовет на тет-а-тет, и очень сильно попросит так больше не делать. Большинству людей этого будет достаточно, потому что зачем ссориться с начальником?
                                                                                  Ответить
                                                                            • > твоя реакция

                                                                              Да и хуй с ними.

                                                                              Меня моя зарплата и работа устраивает - значит норм.

                                                                              Иначе можно крышей поехать от всех этих сравнений кто больше хуи пинал, а кто лучше код пишет.
                                                                              Ответить
                                                                              • Ничего не понимаю.

                                                                                Получать больше лучше, чем получать меньше.

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

                                                                                Но, в общем, спорить тут не о чем, это дело каждого.
                                                                                Ответить
                                                                                • свобода лучше несвободы наличием свободы
                                                                                  быть богатым и здоровым лучше, чем бедным и больным
                                                                                  Ответить
                                                                                  • А больным и богатым против здорового и бедного?
                                                                                    Ответить
                                                                                    • когда ты жобс и у тебя рак, то, возможно, ты бы захотел стать бедным и здоровым
                                                                                      Ответить
                                                                              • Нет, не хуй с ним.

                                                                                Прикинь, ты дохуя сеньор и вдруг узнаёшь, что Вася из соседнего угла не только пялит по четвергам Катю из эйчарни, а ещё и получает на 1800 баксов больше. Твоя реакция?
                                                                                Ответить
                                                                      • > хочется верить, что сеньоры столько не получают даже в Усть-Каменогорсках
                                                                        - сильно зависит от географии. В моём родном зажопье сеньоры получали от полутора косарей, а 800 это была зарплата мидла-дева.
                                                                        Ответить
            • Именно поэтому я за пыху.
              Ответить
    • Раз уж тут обсуждали пистон и ситайпс, то давно хотел поинтересоваться.

      Если питон встраивать в приложуху, то там доступны все стандартные либы? То есть скрипты такой приложухи могут рассылать реквесты со спамом и майнить крипту помимо прочего в тайне от пользователя?
      Ответить
      • В последних версиях добавили точки аудита на опасных функциях. Можешь повешать свой обработчик и с горем пополам закрыть часть дыр. Но х.з. насколько там полное покрытие. Блеклисты - очень плохая идея для секьюрити.

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

        Если хочешь более-менее секьюрный сендбокс - лучше lua, может быть js ещё. Там про это изначально думали, в отличие от питона.
        Ответить
        • Я просто недавно ради прикола баловался со встраиванием рэкета.

          Там тулза генерит сишный файл, в котором транслированы все доступные дефиниции. И по умолчанию там только racket/base, который умеет чуть более, чем нихуя. Хочешь больше модулей - указывай это явно при генерации.
          Ответить
          • В питоне по-умолчанию всё доступно.
            Ответить
          • А вот в lua вообще ничего нет по-умолчанию. Можно так и оставить, для конфигов или простеньких формул вполне норм.
            Ответить
            • Там есть ГОМОИКОНЫ метатаблицы, луашнику этого достаточно.
              Ответить
              • Фиг там, getmetatable и setmetatable по-умолчанию недоступны. Даже поитерироваться по табличкам толком нельзя, на самом деле.
                Ответить
                • Какой анскилл (((
                  Ответить
                • pairs/ipairs нету?

                  Вообще это логично: не плати за то, что не используешь
                  Ответить
                  • Там на самом деле либы очень нелогично разбиты. В том же base есть как фундаментальные штуки в духе pairs, ipairs, setmetatable так и опасное говно типа loadfile. Приходится все стандартные либы вилкой чистить. Ну кроме math и string, наверное.
                    Ответить
            • Что, даже сложения и умножения нет?
              Ответить
              • Есть. Конкатенация вроде даже есть (остальные строковые операции в отдельной либе). Таблички можно заполнять. Свои функции объявлять можно. В общем-то и всё.
                Ответить
                • Щас посмотрел, сколько в racket/base определений: дохуя, конечно, так что это тяжеловес по сравнению с тем, что ты описал в lua.
                  Ответить

    Добавить комментарий