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:
                        ...
                    Ответить
                    • показать все, что скрытоvanished
                      Ответить
                      • > маппинг вынесен в отдельный файл
                        Дык во фляжке тоже спокойно можно вынести.

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

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

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

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

                                > джанго гораздо более жестко диктует архитектуру
                                Я против фреймворков, в которых «Hello World» занимает шесть файлов.
                                Ответить
                                • показать все, что скрытоvanished
                                  Ответить
                                  • Чистый 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 файлов, если они реально нужны, а если у нас сущность ради сущности, то конечно, я с тобой только соглашусь, это ерунда
                                                    Ответить
                                                    • показать все, что скрытоvanished
                                                      Ответить
                                                      • > джанго говно, потому что там нужно шесть файлов
                                                        Ну так это же субъективное мнение. Вот не нравится мне она* и всё.

                                                        * А вот объективно я её рекомендую, разумеется. Если вдруг мне придётся писать гостевуху сложное веб-приложение — скорее всего, я буду это делать именно на ней.
                                                        Ответить
                                                      • Возьми тот же VIPER. Это пять сущностей: view, interactor, presenter, entity, router. А по сути это тот же MVC, просто раздутый до неприличия. Но три сущности проще, чем пять, если пять делают то же самое, что и три.
                                                        Ответить
                                    • показать все, что скрытоvanished
                                      Ответить
                                  • > path не хранит в себе состояние, а request хранит.
                                    Если уж на то пошло, в «Python» любой объект хранит в себе состояние:
                                    >>> django.urls.path.x = 42
                                    >>> django.urls.path.x
                                    42

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

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

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

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

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

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

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

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

                                                > Какой у тебя шаблонизатор во фласке?
                                                «Jinja», ЕМНИП.
                                                Ответить
                                                • показать все, что скрытоvanished
                                                  Ответить
                                                  • > может хранить, но ты не обязан это использовать, да?
                                                    Я ж говорю — какое-то состояние есть у любых объектов. У того же «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» в частности не видеть! В гейдев податься, ёб.
                                                    Ответить
                                                    • показать все, что скрытоvanished
                                                      Ответить
                                                      • В мечтах мы крестовики, а на работе визитки на пыхе пишем.
                                                        Ответить
                                                        • показать все, что скрытоvanished
                                                          Ответить
                                                          • Говорят, что пыхеры могут нормально зарабатывать. Сеньоры конечно, ну и те, кто не совсем уж абизяна.

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

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

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

                                                                    Конечно, если в конторе кап ограничен восьмьюстами долларами, то не так заметно
                                                                    Ответить
                                                                    • показать все, что скрытоvanished
                                                                      Ответить
                                                                      • > Если ты получаешь 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
                                                                                                  Ответить
                                                                                                • Теоретически можно заебать сотрудника выговорами, и после трёх выговоров уволить за профнепригодностью.

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

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

                                                                                                  Так что лучше уговорить его уволиться самому
                                                                                                  Ответить
                                                                                • Смотря какая форма трудоустройства и в какой стране
                                                                                  Ответить
                                                                                • показать все, что скрытоvanished
                                                                                  Ответить
                                                                            • > твоя реакция

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

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

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

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

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

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

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

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

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

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

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

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