Какое говно выбрать Java/Go/Js/Php/Python ?

Зря Вы так, уважаемый kick. Основы знать все же надо.
А "ссаные сайтики" на php в блокноте пишутся на ура, и часто работают они не хуже, а иногда и лучше созданных в навороченных редакторах. Все зависит от "пряморукости" программиста.
 

Зря Вы так, уважаемый kick. Основы знать все же надо.
А "ссаные сайтики" на php в блокноте пишутся на ура, и часто работают они не хуже, а иногда и лучше созданных в навороченных редакторах. Все зависит от "пряморукости" программиста.
Блокнот != среда разработки. Он подойдет полько для пхп и похожих скриптовых языков
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Выбирай то говно, которое ты сможешь съесть, а не то, которое нравится есть другим.
 
Зря Вы так, уважаемый kick. Основы знать все же надо.
А "ссаные сайтики" на php в блокноте пишутся на ура, и часто работают они не хуже, а иногда и лучше созданных в навороченных редакторах. Все зависит от "пряморукости" программиста.
Ну да именно старые и без применения паттерна MVC. То то я смотрю любой разработчик пишет в среде разработки и пишет под неё различные плагины и не только. Так же приведу простой пример XF пишут в среде PhP Storm и есть генерация мета файлов, а теперь возьмем их уровень и несколько лет написания написания приложений на пхп. Они пишут на пхп уже столько лет, что больше лет чем пользователям шмакси. Тот же ларавел так же имеет генерацию под PhP Storm. Написание реального и хорошего веб приложения, без среды разработки не возможна по многим причинам. Ну а кто пытается, что то кричать подобное, либо познают азы программирования или говнокодеры которые не работали над серьезным проектом и в команде. Угадаю как минимум приложения ещё и тестами не покрывается. Так что кодинг в блокнотике это клиника и реальные PhP приложения не пишутся ни кем в блокноте.
 
Вы правы на все сто. Конечно, сейчас никто не пишет в блокнотах, особенно, если на первом плане сроки. Я имел ввиду другое - можно пилить мебель на станках с ЧПУ, а можно и перочинным ножиком - все зависит от того какой нужен результат - время или удовольствие ))) (терь я догадываюсь, что Вы называете "клиникой") )))))
 
Ну если Notepad++ напичкан всякими плагинами, то почему бы и нет. В противном случае это просто мазохизм.
Приведу пример: можно напичкать Visual Studio Code плагинами под кодинг на тех же C# или C++, при этом получая подобие IDE. Да, оно не настолько мощное, как Visual Studio, но при этом с лучшим откликом. В таком случае выбор текстового редактора оправдано.
По поводу Java: ее основным плюсом является то, что скомпилированный байткод запускается спокойно на любом устройстве с той же версией Java. В остальном я не вижу преимуществ, да и выше описанное тоже не особо является преимуществом. так как никто не мешает собирать проект под разные платформы, при чем добавлять какие-то различия в функционале для каждой платформы (на примере директив препроцессора в C#/C++ ).
Лично я предпочитаю те же C# и C++ (не зря я их же упоминал тут). Но не прочь в будущем изучить Rust и Go.
 
Ну я писал на Golang софтину получения данных с сторонего апи + генерация xls ничего сложного

C:
package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "time"
    "github.com/360EntSecGroup-Skylar/excelize"
)

type list struct {
    COUNT int       `json:"count"`
    NEXT  string    `json:"next"`
    BACK  string    `json:"previous"`
    RES   []results `json:"results"`
}

type results struct {
    ID    int    `json:"id"`
    SLUG  string `json:"slug"`
    TITLE string `json:"title"`
}

type FullViews struct {
    TEXT  string  `json:"body_text"`
    DESC  string  `json:"description"`
    TITLE string  `json:"title"`
    URL   string  `json:"site_url"`
    PL    place   `json:"place"`
    DATE  []dates `json:"dates"`
}
type place struct {
    ID int32 `json:"id"`
}

type Maps struct {
    ADRES string `json:"address"`
}

type dates struct {
    START int64 `json:"start"`
    END   int64 `json:"end"`
}

var xls = excelize.NewFile()

func main() {
    var time = int32(time.Now().Unix())

    index := xls.NewSheet("Отчет")
    xls.SetCellValue("Отчет", "A1", "Заголовок")
    xls.SetCellValue("Отчет", "B1", "Описание")
    xls.SetCellValue("Отчет", "C1", "Сылка")
    xls.SetCellValue("Отчет", "D1", "Дата")
    xls.SetCellValue("Отчет", "E1", "Место")

    for page := 1; page < 15; page++ {
        forResult(time, page)
    }

    xls.SetActiveSheet(index)
    xls.SaveAs("./" + fmt.Sprintf("%d", time) + ".xlsx")
}

func forResult(t int32, page int) {
    var Data = &list{}
    var Views = &FullViews{}
    var place = &Maps{}
    var s int = 2
    var D = t + 86400
    var M = t + 2592000

    err := getJSON(fmt.Sprintf("https://kudago.com/public-api/v1.4/events/?location=msk&text_format=text&page_size=100&actual_since=%d&page=%d&actual_until=%d", D, page, M), Data)
    if err != nil {
        fmt.Println("Ошибка доступа к API")
    }

    for i := range Data.RES {
        fmt.Printf("ID%d - %s\n", Data.RES[i].ID, Data.RES[i].TITLE)
        err := getJSON("https://kudago.com/public-api/v1.4/events/"+fmt.Sprintf("%d", Data.RES[i].ID)+"/?lang=&fields=&text_format=text", Views)
        if err != nil {
            fmt.Println("Ошибка доступа к API")
        }

        getJSON("https://kudago.com/public-api/v1.4/places/"+fmt.Sprintf("%d", Views.PL.ID)+"/?lang=ru", place)
        if err != nil {
            fmt.Println("Ошибка доступа к API")
        }

        dates := time.Unix(Views.DATE[0].START, 0)
        xls.SetCellValue("Отчет", fmt.Sprintf("A%d", s), Views.TITLE)
        xls.SetCellValue("Отчет", fmt.Sprintf("B%d", s), Views.TEXT)
        xls.SetCellValue("Отчет", fmt.Sprintf("C%d", s), Views.URL)
        xls.SetCellValue("Отчет", fmt.Sprintf("D%d", s), dates)
        xls.SetCellValue("Отчет", fmt.Sprintf("E%d", s), place.ADRES)
        s++
    }
}

func getJSON(url string, target interface{}) error {
    r, err := http.Get(url)
    if err != nil {
        return err
    }
    defer r.Body.Close()
    return json.NewDecoder(r.Body).Decode(&target)
}

Писал на php скрипт работы с биржей youbit по генерации ваучеров и обмену
Авторизация, каптча, хранение кукисов, работа с тг апи
PHP:
<?php

namespace lib;

class Brouwse
{
    private static $login;
    private static $password;
    private static $siteCode;
    private static $API_KEY;
    private static $youbit;
    public static $wallID = ['rub' => 50003, 'usd' => 50001];
    public static $TempCaptcha;
    public static $support;
    public static $Check = false;
    public static $SRF_TEMP = false;



    /**
     *  __construct
     *
     * @param string $login
     * @param string $password
     * @param float $support
     * @param string $API_KEY
     * @param string $siteCode
     */
    public function __construct(string $login, string $password, float $support, string $API_KEY, string $siteCode)
    {
        self::$login = $login;
        self::$password = $password;
        self::$youbit = __DIR__ . "/coockie/{$login}";
        self::$SRF_TEMP = __DIR__ ."/coockie/srf";
        self::$API_KEY = $API_KEY;
        self::$siteCode = $siteCode;
        if (!file_exists(self::$youbit)) {
            file_put_contents(self::$youbit, '');
        }

        self::$support = $support;
    }

    /**
     * getSRF function get srf token site
     *
     * @param boolean $k
     * @return void
     */
    public static function getSRF($k = false)
    {
        if ($k) {
            $url = Brouwse::getURL('https://yobit.net/ru/', [], 'GET');
            \preg_match('/csrf_token\"\svalue\=\"(.*?)\"/i', $url, $match);

            if (isset($match[1]) && !empty($match[1])) {
                return file_put_contents(self::$SRF_TEMP, $match[1]);
            }
                self::$Check = true;
                return Brouwse::login();
            /***
            if (!isset($match[1])) {
                Telega::msg(Route::$data->chat, Lang::$get->text->ErrorYoubitUser);
                throw new \Exception("Error Login Youbit");
            }
            */
        }
        return trim(file_get_contents(self::$SRF_TEMP));
    }

    /**
     * genCode function generate code cupoun
     *
     * @param float $summ
     * @param string $currency
     * @return void
     */
    public static function genCode(float $summ, string $currency)
    {
        $cur = ['rub' => 'RUR', 'usd' => 'USD'];
        $param = [
            "method" => "new_yobicode",
            "csrf_token" => Brouwse::getSRF(),
            "currency" => self::$wallID[$currency],
            "amount" => $summ
        ];
        $result = Brouwse::getURL('https://yobit.net/ajax/system_yobicodes.php', \http_build_query($param), 'POST', true);
        if (isset($result->error, $result->result) && $result->error == 0 && $result->result == 'OK') {
            return Brouwse::getAllCode($summ, $cur[$currency]);
        }
    }

    /**
     * getAllCode function get all code cupoun
     *
     * @param [type] $summ
     * @param [type] $cur
     * @return void
     */
    private static function getAllCode($summ, $cur)
    {
        $param = [
            "draw" => 1,
            "columns[0][data]" => 0,
            "columns[0][name]" => "",
            "columns[0][searchable]" => true,
            "columns[0][orderable]" => false,
            "columns[0][search][value]" => "",
            "columns[0][search][regex]" => false,
            "columns[1][data]" => 1,
            "columns[1][name]" => "",
            "columns[1][searchable]" => true,
            "columns[1][orderable]" => false,
            "columns[1][search][value]" => "",
            "columns[1][search][regex]" => false,
            "columns[2][data]" => 2,
            "columns[2][name]" => "",
            "columns[2][searchable]" => true,
            "columns[2][orderable]" => false,
            "columns[2][search][value]" => "",
            "columns[2][search][regex]" => false,
            "start" => 0,
            "length" => 20,
            "search[value]" => "",
            "search[regex]" => false,
            "method" => "get_yobicodes_list",
            "csrf_token" => Brouwse::getSRF()
        ];
        $result = Brouwse::getURL('https://yobit.net/ajax/system_yobicodes.php', \http_build_query($param), 'POST', true);
        if ($result->data) {
            foreach ($result->data as $k => $v) {
                if (preg_match('/green/i', $v[2]) && (float)$v[1] == $summ) {
                    if (preg_match("/YOBIT(.*)$cur/i", $v[0], $match)) {
                        return $match[0];
                    }
                }
            }
        }
        return false;
    }

    /**
     * checkCode function checking and activete code cupoun
     *
     * @param [type] $code
     * @param [type] $currency
     * @return void
     */
    public static function checkCode($code, $currency)
    {
        $cur = ['rub' => 'RUR', 'usd' => 'USD'];
        $param = [
            "method" => "activate_yobicode",
            "csrf_token" => Brouwse::getSRF(),
            "code" => $code,
            "captcha" => Brouwse::ruCaptcha('https://yobit.net/ru/yobicodes/')
        ];
        $result = Brouwse::getURL('https://yobit.net/ajax/system_yobicodes.php', \http_build_query($param), 'POST', true);
        \file_put_contents('log', \json_encode($result));
        if (isset($result->error_log)) {
            switch ($result->error_log) {
                case 'Invalid captcha':
                    Brouwse::errorCaptcha();
                    return Lang::$get->text->ErrorYoubit;
                    break;
                case 'invalid csrf token':
                    Brouwse::errorCaptcha();
                    return Lang::$get->text->ErrorYoubit;
                    break;
            }
            if (\preg_match('/Yobit/i', $result->error_log)) {
                return $result->error_log;
            }
        }

        if (isset($result->result, $result->error) && $result->error == 0 && $result->result == 'OK') {
            \preg_match('/(\d{0,9}\.\d{0,9})/i', $result->log, $sum);
            if (\preg_match("/{$cur[$currency]}/i", $result->log) && (float)$sum[1] > 0) {
                return number_format($sum[1], 2, '.', '');
            }
        }
        return Lang::$get->text->ErrorYoubit;
    }

    /**
     * login function auth login:password site
     *
     * @param boolean $codeMail
     * @return void
     */
    public static function login($codeMail = false)
    {
        $param = [
            "method" => "login",
            "locale" => "ru",
            "email" => self::$login,
            "psw" => self::$password,
            "remember" => 1,
            "code_2fa" => "",
            "code_email" => ($codeMail) ? strtoupper(trim($codeMail)) : "",
            "captcha" => Brouwse::ruCaptcha('https://yobit.net/ru/'),
            "tz" => "Asia/Baghdad",
            'scrw' => 1920,
            "scrh" => 1080,
        ];
        $result = Brouwse::getURL('https://yobit.net/ajax/system_login.php', \http_build_query($param), 'POST', true);
        if (isset($result->result) && $result->result == 'OK' && !self::$Check) {
            return Telega::msg(self::$support, Lang::$get->text->accountSussecc);
        }

        if (isset($result->error_log) && @$result->need_email_code == 1) {
            return \lib\Telega::msg(self::$support, "Нарушена авторизация на сайте Youbit, он выслал вам код на email\nДля отпавки кода введи:\n/youbit-xxx  - где xxx код с почты");
        }

        if (isset($result->error_log) && $result->error_log == 'Invalid captcha') {
            Brouwse::errorCaptcha();
        }

        return \lib\Telega::msg(self::$support, "Что то пошло не так попробуйте еще раз\nНарушена авторизация на сайте Youbit, он выслал вам код на email\nДля отпавки кода введи:\n/youbit-xxx  - где xxx код с почты");
    }

    /**
     * errorCaptcha function
     *
     * @return void
     */
    private static function errorCaptcha()
    {
        $params = [
            "key" => self::$API_KEY,
            "action" => "reportbad",
            "id" => self::$TempCaptcha,
            "json" => 1
        ];
        file_get_contents("http://rucaptcha.com/res.php?" . http_build_query($params));
        return true;
    }

    /**
     * ruCaptcha function
     *
     * @param [type] $url
     * @return void
     */
    private static function ruCaptcha($url)
    {
        $param = [
            "key" => self::$API_KEY,
            "method" => "userrecaptcha",
            "googlekey" => self::$siteCode,
            "pageurl" => $url,
            "json" => 1
        ];

        $result = json_decode(\file_get_contents('http://rucaptcha.com/in.php?' . http_build_query($param)));

        if ($result->status == 1) {
            self::$TempCaptcha = $result->request;
            $sleep = 30;
            while ($sleep) {
                \sleep($sleep);
                $params = [
                    "key" => self::$API_KEY,
                    "action" => "get",
                    "id" => $result->request,
                    "json" => 1
                ];
                $key = json_decode(\file_get_contents("http://rucaptcha.com/res.php?" . http_build_query($params)));

                if ($key->status == 1) {
                    return $key->request;
                    continue;
                }
                $sleep -= 5;
            }
        }
        return false;
    }



    /**
     * getURL function CURL
     *
     * @param [type] $url
     * @param [type] $params
     * @param string $type
     * @param boolean $json
     * @return void
     */
    public static function getURL($url, $params, $type = 'POST', $json = false)
    {
        $ch = curl_init();
        if ($type == 'POST') {
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
            curl_setopt($ch, CURLOPT_URL, $url);
        }
        if ($type == 'GET') {
            curl_setopt($ch, CURLOPT_URL, $url . '?' . http_build_query($params));
        }
        curl_setopt($ch, CURLOPT_COOKIEFILE, self::$youbit);
        curl_setopt($ch, CURLOPT_COOKIEJAR, self::$youbit);
        curl_setopt($ch, CURLOPT_COOKIEFILE, self::$youbit);
        curl_setopt_array($ch, array(
            CURLOPT_HTTPHEADER => [
                'accept-language: ru',
                'authority: yobit.net',
                'scheme: https',
                'dnt: 1',
                'origin: https://yobit.net',
                'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'
            ],
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HEADER => false,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_VERBOSE => false
        ));
      
        if ($json) {
            $result = json_decode(curl_exec($ch));
        } else {
            $result = curl_exec($ch);
        }

        curl_close($ch);
        return $result;
    }
}

то что писал на питоне не нашел, но там парсер не оч сложный, на js писал чат на сокетах тоже ничо сверх крутого
 
для новичков Spring — это хороший костыль для освоения таких идей, как внедрение зависимостей, mocking и тестирование, но на самом деле они ортогональны Spring. Если вы применяете TDD, у вас в коде не будет геттеров и сеттеров — только внедрение зависимостей через конструкторы, которые вы можете «замокать» для тестирования, а затем, когда вы связываете своё приложение воедино, просто используете часто забываемый способ создания объектов — ключевое слово «new». Зачастую мы создаем класс «ApplicationContext», который отвечает за связывание всего воедино
Забыли автора указать...
Так и не увидел в чём проблема спринга лично для вас.
В том что "магия" CRUD репозиториев не может предугадать все ваши хотелки?) Так простите, не юзайте, пишите банальную кверю на нативном SQL... SpringData только облегчает вам жизнь, но не решает все ваши изяшные кейсы.
Да, спринг потягивает слишком много для своей работы, но если вы попробуете написать тоже самое без использования стороннего - у вас уйдет куча времени, а сколько багов будет.... Стоит ли оно того? Очевидно, что нет! Спрингом пользуется много(почти весь) продакшена, всё оттестировано и работает отлично.
Да, спринг жесток к новичкам, порог понимания "как там под капотом" велик, но тут же и куча абстракции и простота использования базового функционала.

А ещё сюда добавим кучу фреймворков которые интегрируются с спрингом и так же отлично работают, протестированы и всё с ними нормально.
 
Последнее редактирование:
Rovskoi, Ну да фреймворк для фреймворк и даже запуск для фреймворка... Есть спец языки для сайтов, а не извращения. Ну да для абстракции есть кучу нормальных фреймов, библиотек. Помимо этого шаред хостинг не сможет обеспечить необходимый функционал и не позволит запустить. Я то смотрю не в 1 эмуле досих пор нет ORM и пример как не нужно кодить. Спринг априори кроме круд ничего не может дать, как и нормальной ORM
 
asm/C++ и ничего другого.

Я сидел сравнивал С++/Си - походу лучше начинать с Си а только потом если потребуется ООП С++, использовать Go (точный синтаксис Си) по мере надобности для web (backend).

Си - посмотрел почитал, читаемый код, порог вхождения не сильно зашкаливает, компилится под nix win mac.

asm/паскаль - на данный момент я даже не представляю что мне на них писать и для чего учить.
 
kick При чём тут шаред хостинги? Если это якобы камень в огород спринга, то вспомните про angular, да и ещё кучу JS-фреймов у которых проблемы с деплойментом "на хостинги". Любой нормальный человек может позволить себе дедик\впс, а компании вовсе могут позволить себе своё железо или аренду кучи серверов для создания кластеров...
Что вам нужно от ОРМ, чего нету в том же хибернейте?) Все обычные кейсы ОРМки покрывает, если нужно что-то супер специфичное - пишите своё, никто же не вынуждает использовать готовое...
Повторюсь ещё раз, НИКТО вас не вынуждает использовать ОРМку и репы с спрингом, хоть напишите свои ДАО и пуляйте запросики на чистом ждбс.
Все эти фреймы экономят кучу времени и дают продукт, который можно использовать для решения базовых задач.
При чём тут вообще эмули?... Привязать к эмулю ОРМку эт не проблема, но нужно ли это делать? В нынешних реалиях нужно слишком много переписать в эмулях для интеграции с ОРМ, это никому не нужно. Плюс для эмуля важен перформанс, ОРМ не даст того профита как чистый ждбс.
Можно было бы для эмуля написать свою ОРМ, с fetch и persistance планами, in-memory сторингом и кучей приколов, возможно даже оно дало бы свои плоды, но всем лень это делать или вовсе не умеют\не понимают.
PS: Я не фанбой спринга и не занимаюсь сейчас протектом спринга, я просто не понимаю ваших претензий и всё.
 
@verbrannt а что тебя в моем говно коде так рассмешило? Мне кажется он не на столько уж ужасен.
 
Rovskoi, Ну да фреймворк для фреймворк и даже запуск для фреймворка... Есть спец языки для сайтов, а не извращения. Ну да для абстракции есть кучу нормальных фреймов, библиотек. Помимо этого шаред хостинг не сможет обеспечить необходимый функционал и не позволит запустить. Я то смотрю не в 1 эмуле досих пор нет ORM и пример как не нужно кодить. Спринг априори кроме круд ничего не может дать, как и нормальной ORM
Вообще с хостингом это отдельный вопрос, т.к. большинство платных хостинов кричат что они друпал френдли, а на самом деле его там можно установить и не трогать, о человеческом деплое и речь идти не может

я этот бред писал года 2 назад так что там ничего рефакторить ненужно, он свое отработал))
Отрефакторить != Не работает)
 
  • Ха-ха-ха
Реакции: kick
Rovskoi, мы рассматриваем как замену в плане веба, да конечно компании и любой человек может себе позволить впс/вдс. Да и к тому же в 2019 цены такие же как и на шаред хостинг, но тут и другая сторона медали. Человек не знаком с администрированием и обслуживанием машины. Я же уже говорил, что спринг подойдёт для начинающих программистов или не знакомым в этой системе и не более. И многие высокие проекты да используют у себя Spring в отказ от PhP и не только. Но многие у которых был под капотом Spring просто потом от него отказываются и уходят в более легковесное и не такое жирное сборище.
 
kick ну я не могу утверждать про уход от спринга, мб оно так и есть, я не проходил через такое.
у нас огромный энтерпрайз, серверсайд на спринге(под оракловским веблоджиком) + своя ОРМ, вебсайд на ангуляре. пока не планируем уходить с спринга, да и не уйдем уже) много легаси, слишком многое нужно будет рефакторить и переписывать)
Ну чисто моё имхо: если ты уж юзаешь спринг или там angular\nodejs, то умей и минимальный деплой делать :) я сейчас не про всякие там разворачивание контейнеров и остальные девопсные заморочки, а чисто с помощью того же спринг бута поднять всё это дело.
спринг же не только для веба, на нём просто удобно и быстро разрабатывать бэк.
сейчас же все стараются сделать отдельно бэк, отдельно фронт, допустим та же связка spring + angular. таким образом ты имеешь возможность быстро интегрировать свою мобильную апликуху с бэком, да вообще что угодно.
чисто есть смотреть как для веб разработки, то тут уже кому как)
 
  • Мне нравится
Реакции: kick
что будет выгодней изучать?

php - хз чо про него сказать
js - ну это огород
golang - тут надо подумать Си будет получше мне кажется
Java - ?
python - ?


вообщем я запутался с выбором.

в планах - писать серверные, сетевые,(web), всякие обработчики ну и тд.
Что такое выгоднее?
Плевать что выбрать, работать можно на любом, найди под себя подходящий и работай.

Лично я юзал все эти ЯПы кроме пайтон и в принципе джавы, Go мне зашел и полностью устраивает меня уже несколько лет.

C:
#Перебор массива
for i, v := range x {
fmt.Println(i, v)
}
#Отправка запроса
r, _ := http.Get(urlStr)
println(r.Status)
ээээ...Не понял логику. Почему в цикле обращаемся к пакету fmt, а в статусе GET запроса через встроенную println ?)
Твой код должен выглядеть примерно так.

C:
package main

import (
    "fmt"
    "net/http"
)

func main() {

    x := [...]string{"Logan22", "Volond lox", "Ahmed poc"}

    for i, v := range x {
        fmt.Println(i, v)
    }

    resp, err := http.Get("https://golang.org")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer resp.Body.Close()
    fmt.Println(resp.Status)
}
 
Последнее редактирование модератором:

Похожие темы

Назад
Сверху Снизу