• Как сделать ожидание сообщения от пользователя в VK(бот на php)?

    iiiBird
    @iiiBird
    Пока ты спишь - твой конкурент совершенствуется
    с ботами давно не работал, но в свое время самый оптимальный способ был - представление работы бота как обычного веб-сайта.
    условно в таблице юзеров создаешь колонку "location" и от этого отталкиваешься.
    тобишь написал человек в первый раз - значит в location он на "главной". тобишь вписываешь "/"
    заходит он на твои ставки - вписываешь "/bet"
    т.е. если человек сейчас находится на "/bet" и он что-то написал - значит он сделал ставку. так и обрабатываешь.
    логика, надеюсь, ясна.
    Ответ написан
    6 комментариев
  • Какие готовые решения WEВ чатов на GOLANG стоит использовать?

    @PapaStifflera
    Родился, вырос...
    Комментировать
  • Что не так с кодом?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    Мдааааа...
    <?php
    
    session_start();
    require('connect.php');
    $fsmsg = "";
    
    if (!empty($_POST['username']) AND !empty($_POST['password'])) {
        $username = mysqli_real_escape_string($connection, $_POST['username']);
        $password = $_POST['password'];
    
        $query = "SELECT * FROM users WHERE username='{$username}'";
        $result = mysqli_query($connection, $query) or die(mysqli_error($connection));
        $row = mysqli_fetch_assoc($result);
    
        if (isset($row['ban']) AND $row['ban'] == 1){
            $fsmsg = "Пользователь заблокирован";
        }
        else if (isset($row['password']) AND $row['password'] == $password) {
            $_SESSION['username'] = $username;
            $fsmsg = "Вы вошли под пользователем";
            if (isset($row['role']) AND $row['role'] == "admin") {
                $fsmsg = "Вы вошли под админом";
            }
        } else {
            $fsmsg = "Ошибка";
        }
    }
    ?>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
              integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
        <link rel="stylesheet" href="style.css">
        <title>Авторизация</title>
    </head>
    <body>
    
    <div class="container">
    <?php
    if (isset($_SESSION['username'])) {
        $username = $_SESSION['username'];
        echo("Hello," . $username . ".<br>\n");
        if(!empty($fsmsg)) echo("<h2>{$fsmsg}</h2><br>\n");
        echo("<a href='logout.php' class='btn btn-lg btn-primary'>Выйти</a>");
    }
    else
    {
    ?>
        <form class="form-signin" method="POST">
            <?php if(!empty($fsmsg)) echo("<h2>{$fsmsg}</h2><br>\n"); ?>
            <h2>Авторизация</h2>
            <input type="text" name="username" class="form-control" placeholder="Username" required>
            <input type="password" name="password" class="form-control" placeholder="Password" required>
            <button class="btn btn-lg btn-primary btn-block" type="submit">Авторизоваться</button>
            <a href="index.php" class="btn btn-lg btn-primary btn-block">Зарегистрироваться</a>
        </form>
    </div>
    <?php
    }
    ?>
    </body>
    </html>


    P.S. Хотя... Учи вас, не учи - всё в пустую, "да это всё локально, да мне только показать, да я потом переучусь, правда-правда"... Ага, ага, верим-верим. Только один оскорбительный вопрос: вы на быдлокодера учитесь?
    Ответ написан
    Комментировать
  • Как сохранить данные полученные из пользовательской формы в БД?

    bitniks
    @bitniks
    Go/PHP/Symfony developer
    Можно сделать так
    package "handlers"
    
    import "database/sql"
    
    type User struct {
    	db *sql.DB
    }
    
    func NewUser(db *sql.DB) *User {
    	return &User{db: db}
    }
    
    func (u *User) Add(w http.ResponseWriter, r *http.Request) {
    	//  u.db - доступ к db
    }
    
    func (u *User) GetInfo(w http.ResponseWriter, r *http.Request) {
    	//  u.db - доступ к db
    }


    package main
    
    import "handlers"
    
    func main(){
    	//...
    	//установление соединения к postgres
    	DB, err = ConnectToDB()
    
    	userHandler := handlers.NewUser(DB)
    
    	http.HandleFunc("/adduser/", userHandler.Add)
    	http.HandleFunc("/getinfo/", userHandler.GetInfo)
    	http.ListenAndServe(":8080", nil)
    }
    Ответ написан
    Комментировать
  • Как бэкенд-разработчику поднять свой заработок?

    Epsiloncool
    @Epsiloncool
    Программер, веб-девелопер, гейм-девелопер
    Эх, дружище. Я бы не стал писать ещё один ответ, семнадцатый по счёту, если бы ты своей историей не напомнил меня самого 10 лет назад.

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

    Я объясню.
    Когда человек молодой, у него мало опыта, но много энергии и он хватается за всё подряд и преуспевает именно за счёт своей энергии. В это время его главная задача - набраться опыта.
    По мере взросления у человека уменьшается энергия и увеличивается опыт. И вот, в один прекрасный день, его преимуществом становится не умение делать то, что ему скажут, а опыт, благодаря которому он сам может говорить людям - как правильно. Проще говоря, тебе не будут платить за то, что ты делаешь то, что скажут. И, поскольку твоя энергия теперь ниже, тебе будут платить даже меньше, чем некоторым малолеткам.

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

    Так что же делать конкретно?
    Вот несколько вариантов.
    1. Если ты уже работаешь где-то, поговори с руководителем. Возможно, ты знаешь, как можно улучшить тот продукт, над которым ты работаешь. Предложи ему дать тебе несколько джуниоров, которым ты мог бы давать задачи, чтобы под твоим руководством продукт стал намного круче.
    2. Если ты не работаешь или планируешь ливнуть с работы, присмотрись к фрилансу. Но не рассматривай фриланс в РФ. Это грустно. Подтяни базовый инглиш и пробуй брать небольшие заказы на апворке или фриланс.ком. твои 50 тыр - это всего 800 долларов. За неделю вполне можно заработать. Не сразу, конечно.
    3. Подумай, как свои знания ты можешь упаковать в законченный продукт. Не смотри как что продаётся. Поверь, даже очень простая мелкая утилитка или плагин очень скоро даст тебе плоды и ты поймёшь, что бесцельно тратил время, сидя в офисе, отдавая 90% ценности своему начальнику.
    Ответ написан
    Комментировать
  • Как бэкенд-разработчику поднять свой заработок?

    Zoominger
    @Zoominger
    System Integrator
    Устроиться дополнительно в Яндекс.Еду или DC. Зарплата увеличится раза в три.
    Ответ написан
    8 комментариев
  • Как бэкенд-разработчику поднять свой заработок?

    @balberbro
    Главная проблема. Сидя на маленькой зп и делая "простые" задачи, ты никогда не достигнешь уровня, чтобы попасть в норм компанию. Не попав в норм компанию, ты не получишь норм зп.

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

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

    @YuryBorodkin
    Android dev
    Самый надежный способ - просто переехать в Москву, там зп, даже относительно расходов, выше в разы.
    Более сложный - но и более перспективный и денежный - удаленка на белого господина из США, но требования гораздо выше -нужен норм (b2)инглишь и уметь что-то промычать, а главное - не быть аутистом (cultural fit).
    Удаленки искать на hackernew, weworkremotely, например. Сейчас ее много, все хотят аутсорсить в бедный страны и лучше(дешевле!) без прокладок.
    Ответ написан
    Комментировать
  • Допустимо ли в проектах использовать logrus так?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    Нет.
    Так не можно. Функция configurateLogger() у вас бесполезная. Она только оперирует внутренней переменной logger. Чтобы переменную было заметно глобальней нужно объявлять ее в более широком контексте, снаружи функции(а не внутри оператором := ). А что бы ее было видно в других пакетах она должна именоваться с большой буквы var Logger = configurateLogger() и все это добро нужно импортировать в другие пакеты.
    Ответ написан
    6 комментариев
  • Допустимо ли в проектах использовать logrus так?

    @ghostiam
    На Go писатель, серверов пинатель.
    Опять отвечу я :-) (как и на вопрос по ссылке)
    Да, вы можете использовать так как написали, сам logrus имеет в себе глобальный логер по умолчанию.

    В чём суть передачи логера в параметрах?
    Ну...
    Мы избавляемся от глобальной переменной.
    Передача логера происходит в функцию явно.
    Мы можем передавать по разному настроенный логер в одну и ту же функцию.

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

    UPD. Это пример если логирование всех ошибок приложения в одном стиле производится, но мне интересно у кого-нибудь был проект где требовалось несколько разных логеров?

    Я бы не советовал передавать в функцию явно, если бы не натыкался на подводные камни глобалок...
    Предположим, у вас есть функция парсинга сайтов и вам вдруг(требования меняются часто в реальных проектах) стало необходимо писать лог в файл по имени сайта, как вы будете это делать с глобальным логером?
    С передачей логера по ссылке, это сделать очень просто:
    А в случае теста, мы заменим логер в файл, на логер с выводом в консоль.
    func main() {
    	logger := logrus.New()
    
    	sites := []string{
    		"example.com",
    		"google.com",
    	}
    
    	DoParse(sites, logger)
    }
    
    func DoParse(sites []string, logger logrus.FieldLogger) {
    	for _, site := range sites {
    		logger.Infof("Start parse site: %s", site)
    		siteLogger := initLoggerForSite(site)
    		parseSite(site, siteLogger)
    	}
    }


    Или часть приложения логировать в файл, а часть и в файл и на консоль выводить.
    Ответ написан
    Комментировать
  • Почему сейчас такой спрос на go?

    Стартапы чаще пишут код на языках с динамической типизацией, поскольку проще выпустить первый релиз-монолит в короткие сроки. А раз быстро, то по мере роста компании будет появляться все больше "костылей" и говно-кода. На определенном этапе в компании приходят к выводу, что монолит медленно работает, его трудно развивать и он плохо масштабируем. И тогда сначала пробуют дробить монолит на мелкие службы на том же языке, что и монолит, на даже этого по производительности может не хватать. И тогда начинают искать язык, на котором можно писать высокопроизводительные службы, при этом был легок в изучении, легко разворачиваем на сервере, у которого было хорошее сообщество и легко было найти новых разработчиков или переобучить их. Таких языков не так много.
    Ответ написан
    Комментировать
  • Почему сейчас такой спрос на go?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    Потому что Go - отличный язык программирования?
    Ответ написан
    5 комментариев
  • Как получить increment созданного sequence?

    Melkij
    @Melkij
    PostgreSQL DBA
    information_schema.sequences верный ответ, только стоит имя схемы так же учитывать чтобы не получить случайно несколько строк с разных схем.
    SELECT increment FROM information_schema.sequences where sequence_name = 'example' and sequence_schema = 'public';


    В postgresql 10+ можно обратиться к системному каталогу так
    select increment_by from pg_sequences where schemaname = 'public' and sequencename = 'example';

    До 10 релиза посмотрите в
    select * from public.example;
    (нет под рукой чтобы уточнить имя поля)

    Но если не нужны детали реализации postgresql - то information_schema.sequences вероятно будет уместнее т.к. маловероятно будет изменяться в major релизах.
    Ответ написан
    1 комментарий
  • Почему меняется указатель?

    @rustler2000
    погромист сикраш
    У горутин маленький стэк в начале, и это не стэк треда.
    Рекурсивный func f вызывает рост стэка (в го нет TCO и похоже не будет), и переаллокацию бОльшего стэка из другого size class (смотри tcmalloc) с последующим копированием.
    Смещение переменной в стэке осталось таким же, но адрес изменился.

    Ну а при fmt.Printf переменная в хипе и с постоянным адресом. Вроде на github было даже этому объяснение, из-за чего escape analysis так себя ведёт.
    Ответ написан
    Комментировать
  • Как запустить команды в режиме демона?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    При старте из консоли - приложение отрывается от нее, или продолжает висеть в консоли?
    Если второе - нужно через nohup например оторвать от консоли.
    Ответ написан
    2 комментария
  • Как выбрать последние записи для каждого raw_id?

    Melkij
    @Melkij
    PostgreSQL DBA
    select distinct on (raw_id) raw_id, id, single_sum 
    from tablename
    order by raw_id, id desc

    Может быть как обычно перепутал направление сортировки.
    Ответ написан
    Комментировать
  • Архитектура highload websocket проекта?

    @deliro
    Искать канал в обычном массиве - это O(n). Хотя бы дихотомией, а лучше map юзать
    Ответ написан
    1 комментарий
  • Пользовательские сортировки в python?

    longclaps
    @longclaps
    arr = ["", "a", "d", "e", "", "b", "c", "c", ""];
    arr.sort(key=lambda s: s or "zzzzz")
    print(arr)

    Вместо "zzzzz" возьми по ситуации то, что заведомо лексикографически больше любой валидной строки, да хоть chr(127), если речь идёт о латинице.
    Ответ написан
    Комментировать
  • Продвинутая функция для тестирования aka reflect.DeepEqual?

    @ghostiam
    На Go писатель, серверов пинатель.
    Посоветую https://github.com/stretchr/testify
    А именно пакет assert, он показывает diff структуры.
    Diff:
    --- Expected
    +++ Actual
    @@ -2,5 +2,5 @@
      (int) 1,
    - (int) 2,
      (int) 3,
    - (int) 4
    + (int) 5,
    + (int) 7
     }


    Пользоваться просто:
    assert.Equal(t, struct1, struct2)
    где t это testing.T (единственный аргумент у тестовой функции)
    Ответ написан
    1 комментарий