И вот, появился такой ужасный значок, что один из сайтов заражен и хорошо бы весь, но почему-то только на 2 страницах, что для вируса странновато. В общем, я с таким дело не разу не имела. Прошлась по сайту, нашла гада, его зовут JS/RefC-Gen, если верить было тому же яндексу, то этот вредноносный код должен меня перенаправлять на другой сайт, но почему-то ничего не происходило, возможно, из-за защиты браузера от перенаправлений автоматических, поэтому и не заметила его сразу.
Дале интересней. Мне показалось, что код стоит в файлах движка и я его просто обновила автоматически. Вредноносный код исчез и я о нем забыла, но вот яндекс все так же плювался на гада. Зашла уже на следующий день и этот гад снова там же красуется.
Немного поискав инфу о гаде, нашла, что он прячется в функционале темы и удалила его.
Но вопрос вот в чем, как этот вирус вообще попал на сайт? На хостинге с ним стоит не один сайт и все они без вирусов, а этот. Причем появился недавно. Либо сайт взломан, либо иные пользователи сайта, которых удалила уже, занесли код.
Если вы попадете в такую ситуацию:
Проверяете свой комп на вирусы. Ну всякое может быть, в том числе и взлом сайта.
Вирусы бывают разные, и методы удаления их разные бывают. Проще целиком переустановить движок (на вордпресе это легко), там редактируется только один файл, остальное с нуля заливаете. Темы лучше восстановить из проверенных архивов. Фотки вернуть назад. БД все найдет, не бойтесь, главное, чтобы все на своих местах стояло.
Можно ручками найти вирус, вводите в поиск название вируса и смотрите, как обезвредить гада.
Далее: меняете пароль у ящика. затем меняете пароль у администраторов, заставьте их провериться на вирусы ( о компе конечно).
Js refc gen — kak.zydus.su
JavaScript refactoring language plugin for Atom. This package requires refactor package. You can install from the preference pane.
Содержание статьи:
ES6+ Support
Start from v0.6.0, we already have experimental support of ES6+, track #6 for more details.
Related Packages
Changelog
v0.8.0 on 2018-03-06
- Upgrade to babylon 7 beta, which support more new syntax
- Add
.mjs
file extension - Enable tests
v0.7.5 on 2016-12-28
v0.7.2 on 2016-06-30
- Use original debug package to solve install failures, fix #8, #15
- Support different styles for references/mutations/declaration
- Fix #14
v0.7.0 on 2016-06-24
- Upgrade to babylon 6, enable all ES next syntax (include stage 0 features like bind operator) and JSX, Flow… all features babel support. Babylon 6 is not compatible with estools, so we change to babel-traverse, and rewrite and simplify the implementations, it should also fix all issues from underlying. (Of coz it may introduce new issues 🙂
- Implement correct renaming of object shorthand and import alias.
v0.6.0 on 2015-09-08
- Require Atom >=1.0.0, refactor ^0.6.0
- Experimental support of ES6+ (Babel, stage >= 1)
- Start migrating from coffeescript to babel
- Improve esrefactor based on a most recent and active fork
- Use babylon (the parser of babel) instead of esprima
- Update estools (estraverse, escope) to latest version
- Add debug util
- Update travis config as latest atom/ci
Changelog of old versions
Источник: atom.io
Читайте также
Как перейти на gRPC, сохранив REST / Хабр
Многие знакомы с gRPC — открытым RPC-фреймворком от Google, который поддерживает 10 языков и активно используется внутри Google, Netflix, Kubernetes, Docker и многими другими. Если вы пишете микросервисы, gRPC предоставляет массу преимуществ перед традиционным подходом REST+JSON, но на существующих проектах часто переход не так просто осуществить из-за наличия уже использующихся REST-клиентов, которые невозможно обновить за раз. Нередко общаясь на тему gRPC можно услышать «да, мы у нас в компании тоже смотрим на gRPC, но всё никак не попробуем».
Что ж, этой проблеме есть хорошее решение под названием grpc-rest-gateway, которое занимается именно этим — автогенерацией REST-gRPC прокси с поддержкой всех основных преимуществ gRPC плюс поддержка Swagger. В этой статье я покажу на примере как это выглядит и работает, и, надеюсь, это поможет и вам перейти на gRPC, не теряя существующие REST-клиенты.
Но, для начала, давайте определимся о каких вообще ситуациях речь. Два самых частых варианта:
- бекенд (Go/Java/C++/node.js/whatever) и фронтенд (JS/iOS/Kotlin/Java/etc) общаются с помощью REST API
- микросервисы (на разных языках) общаются между собой также через REST-подобный API (протокол HTTP и JSON для сериализации)
Для маленьких проектов это абсолютно нормальный выбор, но по мере того, как проекты и количество людей на нём растут, проблемы REST API начинают очень явно давать о себе знать и отнимать львиную долю времени разработчиков.
Безусловно, REST используется везде и повсюду в виду его простоты и даже размытого понимания, что такое REST. Вообще, REST начался как диссертация одного из создателей HTTP Роя Филдинга под названием «Архитектурные стили и дизайн сетевых программных архитектур». Собственно, REST это и есть лишь архитектурный стиль, а не какая-то чётко описанная спецификация.
Но это и является корнем некоторых весомых проблем. Нет единого соглашения, когда какой метод HTTP использовать, когда какой код возвращать, что передавать в URI, а что в теле запроса и т.д. Есть попытки прийти к общей договорённости, но они, к сожалению, не очень успешны.
Далее, при REST подходе, у вас есть чересчур много сущностей, которые несут смысл — метод HTTP (GET/POST/PUT/DELETE), URI запроса (/users
, /user/1
), тело запроса ({id: 1}
) плюс заголовки (X-User-ID: 1
). Всё это добавляет излишнюю сложность и возможность неверной интерпретации, что превращается в большую проблему по мере того, как API начинает использоваться между различными сервисами, которые пишут различные команды и синхронизация всех этих сущностей начинает занимать значительную часть времени команд.
Это приводит нас к следующей проблеме — сложности декларативного описания интерфейсов API и описания типов данных. OpenAPI Specification (известное как Swagger), RAML и API Blueprint частично решают эту проблему, но делают это ценой добавления другой сложности. Кто-то пишет YAML файлы ручками для каждого нового запроса, кто-то использует web-фрейморки с автогенерацией, раздувая код описаниями параметров и типов запроса, и поддержка swagger-спецификации в синхронизации с реальной реализацией API всё равно лежит на плечах ответственных разработчиков, что отнимает время от решения, собственно, задач, которые эти API должны решать.
Отдельная сложность заключается в API, которое развивается и меняется, и синхронизация клиентов и серверов может отнимать довольно много времени и ресурсов.
gRPC решает эти проблемы кодогенерацией и декларативным языком описания типов и RPC-методов. По-умолчанию используется Google Protobuf 3 в качестве IDL, и HTTP/2 для транспорта. Кодогенераторы есть по 10 языков — Go, Java, C++, Python, Ruby, Node.js, C#, PHP, Android.Java, Objective-C. Есть также пока неофициальные реализации для Rust, Swift и прочих.
В gRPC у вас есть только одно место, где вы определяете, как будут именоваться поля, как называться запросы, что принимать и что возвращать. Это описывается в .proto файле. Например:
syntax = "proto3";
package library;
service LibraryService {
rpc AddBook(AddBookRequest) returns (AddBookResponse)
}
message AddBookRequest {
message Author {
string name = 1;
string surname = 2;
}
string isbn = 1;
repeated Author authors = 2;
}
message AddBookResponse {
int64 id = 1;
}
Из этого proto-файла, с помощью
-компилятора генерируются код клиентов и серверов на всех поддерживаемых языках (ну, на тех, которые вы укажете компилятору). Дальше, если вы что-то изменили в типах или методах — перезапускаете генерацию кода и получаете обновлённый код и клиента, и сервера.
Если вы когда-либо разруливали конфликты в названиях полей вроде UserID
vs user_id
, вам понравится работать с gRPC.
Но я не буду сильно подробно останавливаться на принципах работы с gRPC, и перейду к вопросу, что же делать, если вы хотите использовать gRPC, но у вас есть клиенты, которые всё ещё должны работать через REST API, и их не просто будет перевести/переписать на gRPC. Это особенно актуально, учитывая, что официальной поддержки gRPC в браузере пока нет (JS только Node.js официально), и реализация для Swift также пока не в списке официальных.
Проект grpc-gateway, как и почти всё в grpc-экосистеме, реализован в виде плагина для protoc
-компилятора. Он позволяет добавить аннотации к rpc-определениям в protobuf-файле, который будут описывать REST-аналог этого метода. Например:
import "google/api/annotations.proto";
...
service LibraryService {
rpc AddBook(AddBookRequest) returns (AddBookResponse) {
option (google.api.http) = {
post: "/v1/book"
body: "*"
};
}
}
После запуска protoc с указанным плагином, вы получите автосгенерированный код, который будет прозрачно перенаправлять POST HTTP запросы на указанный URI на реальный grpc-сервер и также прозрачно конвертировать и отправлять ответ.
Тоесть формально, это API Proxy, который запущен, как отдельный сервис и делает прозрачную конвертацию REST HTTP запросов в gRPC коммуникацию между сервисами.
Давайте, продолжим пример выше — скажем, наш сервис работы с книгами, должен уметь работать со старым iOS-фронтендом, который пока умеет работать только по REST HTTP. Другие сервисы вы уже перевели на gRPC и наслаждаетесь меньшим количеством головной боли при росте или изменениях ваших API. Добавив выше указанные аннотации, создаём новый сервис — например
и в нём автогенерируем код обратного прокси:
protoc -I/usr/local/include -I. \
-I$GOPATH/src \
-I$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \
--grpc-gateway_out=logtostderr=true:. \
library.proto
Код самого сервиса может выглядеть вот как-нибудь так:
import (
"github.com/myuser/rest-proxy/library"
)
var main() {
gw := runtime.NewServeMux(muxOpt)
opts := []grpc.DialOption{grpc.WithInsecure()}
err := library.RegisterLibraryServiceHandlerFromEndpoint(ctx, gw, "library-service.dns.name", opts)
if err != nil {
log.Fatal(err)
}
mux := http.NewServeMux()
mux.Handle("/", gw)
log.Fatal(http.ListenAndServe(":80", mux))
}
Этот код запустит наш прокси на 80-м порту, и будет направлять все запросы на gRPC сервер, доступный по library-service.dns.name
. RegisterLibraryServiceHandlerFromEndpoint
это автоматически сгенерированный метод, который делает всю магию.
Очевидно, что этот прокси может служить входной точкой для всех остальных ваших сервисов на gRPC, которым нужен fallback в виде REST API — просто подключаете остальные автосгенерированные пакаджи и регистрируете их на тот же gw-объект:
err = users.RegisterUsersServiceHandlerFromEndpoint(ctx, gw, "users-service.dns.name", opts)
if err != nil {
log.Fatal(err)
}
и так далее.
Автосгенерированный прокси поддерживает автоматический реконнект к сервису, с экспоненциальной backoff-задержкой, как и в обычных grpc-сервисах. Аналогично, поддержка TLS есть из коробки, таймаутов и всё, что доступно в grpc-сервисах, доступно и в прокси.
Middlewares
Отдельно хочется написать про возможность использования т.н. middlewares — обработчиков запросов, которые автоматически должны срабатывать до или после запроса. Типичный пример — ваши HTTP запросы содержат специальный заголовок, который вы хотите передать дальше в grpc-сервисы.
Для примера, я возьму пример со стандартным JWT токеном, которые вы хотите расшифровывать и передавать значение поля UserID grpc-сервисам. Делается это также просто, как и обычные http-middlewares:
func checkJWT(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
bearer := r.Header.Get("Authorization")
...
// parse and extract value from token
...
ctx = context.WithValue(ctx, "UserID", claims.UserID)
h.ServeHTTP(w, r.WithContext(ctx))
})
}
и заворачиваем наш mux-объект в эту middleware-функцию:
mux.Handle("/", checkJWT(gw))
Теперь на стороне сервисов (все gRPC-методы в Go реализации принимают первым параметром context), вы просто достаёте это значение из контекста:
func (s *LIbrary) AddBook(ctx context.Context, req *library.AddBookRequest) (*library.AddBookResponse, error) {
userID := ctx.Value("UserID").(int64)
...
}
Дополнительный функционал
Разумеется, ничего не ограничивает ваш rest-proxy от реализации дополнительного функционала. Это обычный http-сервер, в конце-концов. Вы можете пробросить какие-то HTTP запросы на другой legacy REST сервис:
legacyProxy := httputil.NewSingleHostReverseProxy(legacyUrl)
mux.Handle("/v0/old_endpoint", legacyProxy)
Swagger UI
Отдельной вишенкой в подходе с grpc-gateway есть автоматическая генерация swagger.json
файла. Его можно затем использовать с онлайн UI, а можно и отдавать напрямую из нашего же сервиса.
С помощью небольших манипуляций со SwaggerUI и go-bindata, можно добавить ещё один endpoint
к нашему сервису, который будет отдавать красивый и, что самое важное, актуальный и автосгенерированный UI для REST API.
Генерируем swagger.json
protoc -I/usr/local/include -I$GOPATH/src -I$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis --swagger_out=logtostderr=true:swagger-ui/ path/to/library.proto
Создаем handler-ы, которые будут отдавать статику и генерировать index.html (в примере статика добавляется прямо в код с помощью go-bindata):
mux.HandleFunc("/swagger/index.html", SwaggerHandler)
mux.Handle("/swagger/", http.StripPrefix("/swagger/", http.FileServer(assetFS())))
...
// init indexTemplate at start
func SwaggerHandler(w http.ResponseWriter, r *http.Request) {
indexTemplate.Execute(w, nil)
}
и вы получаете Swagger UI, подобный этому, с актуальной информацией и возможностью тут же тестировать:
В целом мой опыт работы с grpc-gateway можно пока-что охарактеризовать одной фразой — «оно просто работает из коробки». Из проблем, с которыми приходилось сталкиваться, например могу отметить следующее.
В Go для сериализации в JSON используются так называемые «тэги структур» — мета информация для полей. В encoding/json
есть такой тэг omitempty
— он означает, что если значение равно нулю (нулевому значению для этого типа), то его не нужно добавлять в результирующий JSON. Плагин grpc-gateway для Go именно этот тег и добавляет к структурам, что приводит иногда к неверному поведению.
Например, у вас есть переменная типа bool
в структуре, и вы отдаёте эту структуру в ответе — оба значения true
и false
одинаково важны в ответе, и фронтенд ожидает это поле получить. Ответ же, сгенерированный grpc-gateway будет содержать это поле, только если значение равно true
, в противном случае оно просто будет пропущено (omitempty).
К счастью, это легко решается с помощью опций конфигурации:
customMarshaller := &runtime.JSONPb{
OrigName: true,
EmitDefaults: true, // disable 'omitempty'
}
muxOpt := runtime.WithMarshalerOption(runtime.MIMEWildcard, customMarshaller)
gw := runtime.NewServeMux(muxOpt)
Ещё одним моментом, которым хотелось бы поделиться, можно назвать неочевидная семантика работы с самим protoc
-компилятором. Команды вызова очень длинные, трудночитаемые, и, что самое важное, логика того, откуда берется protobuf и куда генерируется вывод (+какие директории создаются) — очень неочевидна. Например, вы хотите использовать proto-файл из другого проекта и сгенерировать каким-нибудь плагином код, положив его в текущий проект в папку swagger-ui/
. Мне пришлось минут 15 перепробовать массу вариантов вызова protoc, прежде чем стало понятно, как заставить генератор работать именно так. Но, снова же, ничего нерешаемого.
gRPC может ускорить продуктивность и эффективность работы с микросервис архитектурой в разы, но часто помехой становится требование обратной совместимости и поддержки REST API. grpc-gateway
предоставляет простой и эффективный способ решения этой проблемы, автоматически генерируя обратный прокси сервер, транслирующий REST/JSON запросы в gRPC вызовы. Проект очень активно развивается и используется в продакшене во многих компаниях.
Руководство по Node.js для начинающих. Часть 2 / Хабр
Доброго времени суток, друзья!
Продолжаю публиковать перевод этого руководства по Node.js.
Другие части:
Часть 1
Часть 2
Часть 3
Часть 4
Движок JavaScript V8
V8 — название движка JavaScript, поддерживаемого Google Chrome. Эта та штука, которая берет ваш JavaScript-код и выполняет его в браузере.
Другими словами, V8 представляет собой среду выполнения JavaScript. DOM и другие веб-API также предоставляются браузером.
Движок JavaScript не зависит от браузера. Именно это привело к появлению Node.js. V8 был выбран в качестве движка для Node.js в 2009, и с ростом популярности Node.js V8 стал основой для большого количества серверного JavaScript.
Экосистема Node.js огромна и благодаря V8 мы имеем возможность создавать настольные приложения, например, с помощью Electron.
Другие JS движки
Другие браузеры имеют собственные JavaScript-движки:
и т.д.
Во всех этих движках реализован стандарт ECMA ES-262 (ECMAScript), стандарт, используемый JavaScript.
О производительности
V8 написан на C++ и продолжает развиваться. Он работает во всех операционных системах.
Мы не будем рассматривать особенности реализации V8: вы можете найти их здесь, они меняются время от времени, часто радикально.
V8 постоянно эволюционирует, как и другие JavaScript-движки, для повышения скорости веба и экосистемы Node.js.
В вебе имеет место соревнование за производительность, которое продолжается долгие годы, и мы (как пользователи и разработчики) получаем от этого соревнования очень многое, поскольку получаем более быстрые и оптимизированные инструменты каждый год.
Компиляция
JavaScript обычно позиционируется как интерпретируемый язык, однако современные движки не просто интерпретируют JavaScript, они его компилируют.
Это происходит с 2009 года, когда компилятор JavaScript SpiderMonkey был добавлен в Firefox 3.5.
JavaScript компилируется V8 «на лету» (just-in-time, JIT, динамическая компиляция) для ускорения его выполнения.
Это может показаться нелогичным, однако с появлением Google Maps в 2004, JavaScript эволюционировал от языка, на котором пишут небольшие блоки кода, до языка, на котором создаются полноценные приложения, состоящие из сотен и тысяч строк кода, выполняющегося в браузере.
Сегодня наши браузерные приложения могут работать часами, они больше не являются простыми средствами решения примитивных задач, таких как валидация форм.
В современном мире компиляция JavaScript имеет смысл: несмотря на то, что на подготовку кода уходит больше времени, его производительность существенно превышает производительность интерпретируемого кода.
Запуск Node.js-скриптов посредством командной строки
Стандартным способом запуска программ на Node.js является выполнение глобальной команды
node
и передачи имени исполняемого файла.Если основной файл вашего Node.js-приложения называется app.js
, вы можете вызвать его следующим образом:
node app.js
При выполнении указанной команды убедитесь, что находитесь в директории с файлом
app.js
.Как выйти из Node.js?
Существуют различные способы остановки Node.js-приложения.
При запуске программы посредством терминала, вы можете закрыть его с помощью ctrl-C
, однако давайте обсудим программные способы.
Начнем с самого радикального, и поговорим о том, почему его не следует использовать.
Основной (глобальный, модуль ядра) модуль process
содержит удобный метод, позволяющий программно выйти из Node.js-приложения: process.exit()
.
Когда Node.js достигает этой строки кода, процесс выполнения программы немедленно завершается.
Это означает, что все выполняющиеся функции обратного вызова, отправленные (незавершенные) запросы, открытый доступ к файловой системе, процессы записи в stdout
или stderr
— все они будут жестко прерваны.
Если это для вас приемлемо, вы можете передать методу exit()
целое число — сигнал к завершению выполнения кода:
process.exit(1)
По умолчанию код выхода — 0, указывающий на успешное завершение. Разные коды выходы имеют разное значение, вы можете использовать их для обеспечения взаимодействия одних программ с другими.
Подробнее о кодах выхода можно почитать здесь.
Также вы можете присвоить соответствующее значение свойству exitCode
:
process.exitCode = 1
и после завершения программы, Node.js вернет этот код.
Выполнение программы завершится мягко, когда все процессы будут выполнены.
В Node.js мы часто запускаем сервер:
const express = require('express')
const app = express()
app.get('/', (req, res) => {
res.send('Hi!')
})
app.listen(3000, () => console.log('Server ready'))
Эта программа никогда не завершится. Если вы вызовете
process.exit()
, все ожидающие или выполняющиеся запросы будут прерваны. Это не круто.В данном случае необходимо отправить команду-сигнал SIGTERM
и обработать ее с помощью обработчика процессорных сигналов (process
подключать не нужно, он доступен по умолчанию):
const express = require('express')
const app = express()
app.get('/', (req, res) => {
res.send('Hi!')
})
const server = app.listen(3000, () => console.log('Server ready'))
process.on('SIGTERM', () => {
server.close(() => {
console.log('Process terminated')
})
})
Что такое сигналы? Сигналы — это система коммуникации POSIX: отправка процессу уведомления о произошедшем событии.
SIGKILL
— сигнал о немедленном завершении процесса, аналогичный process.exit()
.
SIGTERM
— сигнал о мягком завершении процесса. Этот сигнал может быть отправлен системой управления процессами, такой как upstart
, supervisord
и др.
Вы можете отправить данный сигнал внутри программы через другую функцию:
process.kill(process.id, 'SIGTERM')
Или из другой Node.js-программы или любого другого приложения, запущенного в системе, при условии, что им известен PID процесса, который вы хотите завершить.
Как читать переменные среды в Node.js?
Основной модуль Node.js
process
имеет свойство env
, содержащее все переменные среды, установленные при запуске процесса.Вот пример получения доступа к переменной среды NODE_ENV, установленной в значение development
по умолчанию:
process.env.NODE_ENV // development
Установка значения в production перед выполнением скрипта сообщит Node.js о том, что перед ним продакшн-среда.
Аналогичным способом вы можете получить доступ к любой установленной переменной среды.
Как использовать Node.js REPL
Команда
node
используется для запуска Node.js-скриптов:node script.js
Если мы опустим имя файла, то попадем в режим REPL:
node
REPL (Run Evaluate Print Loop, цикл «чтение-вычисление-вывод») — это среда выполнения кода (обычно, окно терминала), которая принимает выражение, введенное пользователем, и возвращает результат вычисления этого выражения.
Если вы введете node
в терминале, произойдет следующее:
>
Терминал перейдет в режим ожидания.
Если быть более точным, терминал в данном случае ожидает ввода какого-либо JavaScript-кода.
Введем следующее:
> console.log('test')
test
undefined
>
Первое значение,
test
, это то, что мы велели вывести в консоль, затем мы получаем undefined
— значение, которое вернуло выполнение console.log()
После этого мы можем ввести что-нибудь еще.
Использование tab
для автозавершения
REPL является интерактивным.
Если нажать tab
при написании кода, REPL попытается завершить написанное, выбирая из определенных ранее или предопределенных переменных.
Объекты JavaScript
Попробуйте ввести имя JavaScript-класса, например,
Number
, добавьте к нему точку и нажмите tab
.REPL покажет все свойства и методы этого класса:
Глобальные объекты
Вы можете получить список глобальных объектов, введя
global.
и нажав tab
:Специальная переменная _
Если в конце кода набрать
_
, будет выведен результат выполнения последней операции.Команды после точки
REPL содержит некоторые специальные команды, начинающиеся с точки. Вот они:
.help
— показывает список доступным команд.editor
— включает режим редактирования для написания многострочного JavaScript-кода. Для выполнения кода в этом режиме необходимо нажатьctrl-D
.break
— прекращает ввод многострочного кода. Аналогично нажатиюctrl-C
.clear
— сбрасывает контекст REPL к пустому объекту, удаляет весь введенный код.load
— загружает JavaScript-файл, находящийся в текущей (рабочей) директории.save
— сохраняет сессию REPL в файл с указанным именем.exit
— выход из REPL. Аналогично двойному нажатиюctrl-C
REPL понимает, что вы вводите многостроный код без вызова
.editor
.Например, если вы начали реализовывать итерацию:
[1, 2, 3].forEach(num => {
и нажали
enter
, REPL перейдет на новую строку с тремя точками в начале, сообщая, что вы можеет продолжить работу с блоком кода:... console.log(num)
... })
Если вы введете
.break
в конце, режим набора многострочного кода остановится и выражение не будет выполнено.Передача аргументов с помощью командной строки
При запуске Node.js-приложения вы можете передать ему любое количество аргументов.
Аргументы могут быть автономными или иметь ключ и значение.
Например:
node app.js joe
или
node app.js name=joe
От этого зависит то, как вы будете извлекать значение в Node.js-коде.
Для извлечения значений используется встроенный объект process
.
В свойстве argv
этого объекта содержится массив аргументов, переданных посредством командной строки.
Первый аргумент — это полный путь команды node
.
Второй — полный путь исполняемого файла.
Интересующие нас аргументы начинаются с третьей позиции (индекса массива).
Вы можете перебрать аргументы (включая путь node и путь файла) с помощью цикла:
process.argv.forEach((val, index) => {
console.log(`${index}: ${val}`)
})
Переданные аргументы можно получить, создав новый массив без первых двух параметров:
const args = process.argv.slice(2)
Если у нас имеется один аргумент без индекса (ключа):
node app.js joe
мы можем получить его следующим образом:
const args = process.argv.slice(2)
args[0]
В этом случае:
node app.js name=joe
args[0]
— это name=joe
, поэтому нам нужно его разобрать. Лучшим способом это сделать является использование библиотеки minimist, предназначенной для работы с аргументами:const args = require('minimist')(process.argv.slice(2))
args['name'] // joe
Здесь необходимо использовать двойное тире перед каждым аргументом:
node app.js --name=joe
Вывод результатов в командную строку с помощью Node.js
Стандартный вывод посредством модуля console
Node.js предоставляет модуль console, содержащий множество очень полезных способов взаимодействия с командной строкой.
Он похож на объект console
браузера.
Одним из основных методов данного модуля является console.log()
, который выводит в консоль переданную строку.
Если вы передадите объект, он будет преобразован в строку.
Мы можем передавать console.log
несколько переменных:
const x = 'x'
const y = 'y'
console.log(x, y)
и Node.js выведет обе.
Мы также можем форматировать строку с помощью спецификаторов:
Например:
console.log('My %s has %d years', 'cat', 2)
%s
— форматирует переменную как строку%d
— форматирует переменную как число%i
— приводит переменную к целому числу%o
— форматирует переменную как объект
Например:
console.log('%o', Number)
Очистка консоли
console.clear()
очищает консоль (поведение зависит от используемой консоли).Подсчет элементов
console.count()
— удобный метод.Изучите этот код:
const x = 1
const y = 2
const z = 3
console.count(
'The value of x is ' + x +
' and has been checked .. how many times?'
)
console.count(
'The value of x is ' + x +
' and has been checked .. how many times?'
)
console.count(
'The value of y is ' + y +
' and has been checked .. how many times?'
)
Счетчик считает количество отображений строки и показывает это количество.
The value of x is 1 and has been checked .. how many times?: 1
The value of x is 1 and has been checked .. how many times?: 2
The value of y is 2 and has been checked .. how many times?: 1
Так вы можете посчитать количество яблок и апельсинов:
const oranges = ['orange', 'orange']
const apples = ['just one apple']
oranges.forEach(fruit => console.count(fruit))
apples.forEach(fruit => console.count(fruit))
Отображение трассировки стека
Возникают ситуации, когда необходимо отображить трассировку стека функции, например, для того, чтобы ответить на вопрос «Как мы достигли этой части кода?»
Вы можете сделать это с помощью console.trace()
:
const function2 = () => console.trace()
const function1 = () => function2()
function1()
Это выведет в консоль трассировку стека. Вот что мы увидим в командной строке, если выполним приведенный код в Node.js REPL:
Trace
at function2 (repl:1:33)
at function1 (repl:1:25)
at repl:1:1
at ContextifyScript.Script.runInThisContext (vm.js:44:33)
at REPLServer.defaultEval (repl.js:239:29)
at bound (domain.js:301:14)
at REPLServer.runBound [as eval] (domain.js:314:12)
at REPLServer.onLine (repl.js:440:10)
at emitOne (events.js:120:20)
at REPLServer.emit (events.js:210:7)
Подсчет времени выполнения кода
Вы легко можете посчитать, сколько времени выполнялась функция при помощи
time()
и timeEnd()
:const doSomething = () => console.log('test')
const measureDoingSomething = () => {
console.time('doSomething()')
// выполняем какие-либо операции и засекаем время их выполнения
doSomething()
console.timeEnd('doSomething()')
}
measureDoingSomething()
stdout и stderr
Как мы знаем, console.log отлично подходит для вывода сообщений в консоль. Это называется стандартным выводом или
stdout
.console.error
отображает поток stderr
.
Данный поток не выводится в консоль, а записывается в журнал ошибок (error log).
Стилизуем вывод
Вы можете раскрасить текст, выводимый в консоль, с помощью обратных последовательностей (escape sequences). Эти последовательности представлют собой набор символов, идентифицирующих цвет.
Например:
console.log('\x1b[33m%s\x1b[0m', 'hi!')
Если набрать приведенный код в Node.js REPL, то
hi!
будет желтого цвета.Рассмотренный способ довольно трудоемкий. Простейшим способом раскрасить консольный вывод — использовать библиотеку. Одной из таких библиотек является Chalk, которая кроме определения цвета, позволяет сделать текст полужирным, наклонным или подчеркнутым.
Устанавливаем библиотеку посредством npm install chalk
и используем ее следующим образом:
const chalk = require('chalk')
console.log(chalk.yellow('hi!'))
Использование
chalk.yellow
гораздо проще, чем запоминание сложных последовательностей. Это также делает код более читаемым.Создание индикатора прогресса
Progress — отличная библиотека для создания индикаторов прогресса в терминале. Устанавливаем ее с помощью
npm install progress
.Данный сниппет создает индикатор прогресса, состоящий из 10 шагов. Каждые 100 мс выполняется один шаг. При заполнении индикатора мы отключаем счетчик:
const ProgressBar = require('progress')
const bar = new ProgressBar(':bar', { total: 10 })
const timer = setInterval(() => {
bar.tick()
if (bar.complete) clearInterval(timer)
}, 100)
Благодарю за внимание, друзья. При обнаружении ошибок и опечаток не стесняйтесь писать в личку, буду признателен.
Продолжение следует…
Кстати, в прошлом году у нас был похожий по масштабам проект, посвящённый bash-скриптам. Тогда мы, после публикации всех запланированных материалов, собрали их в виде PDF-файла. Так же планируется поступить и в этот раз.
Сегодня мы обсудим особенности Node.js, начнём знакомство с экосистемой этой платформы и напишем серверный «Hello World».
[Советуем почитать] Другие части циклаЧасть 1: Общие сведения и начало работыЧасть 2: JavaScript, V8, некоторые приёмы разработки
Часть 3: Хостинг, REPL, работа с консолью, модули
Часть 4: npm, файлы package.json и package-lock.json
Часть 5: npm и npx
Часть 6: цикл событий, стек вызовов, таймеры
Часть 7: асинхронное программирование
Часть 8: Руководство по Node.js, часть 8: протоколы HTTP и WebSocket
Часть 9: Руководство по Node.js, часть 9: работа с файловой системой
Часть 10: Руководство по Node.js, часть 10: стандартные модули, потоки, базы данных, NODE_ENV
Полная PDF-версия руководства по Node.js
Обзор Node.js
Node.js — это опенсорсная кроссплатформенная среда выполнения для JavaScript, которая работает на серверах. С момента выпуска этой платформы в 2009 году она стала чрезвычайно популярной и в наши дни играет весьма важную роль в области веб-разработки. Если считать показателем популярности число звёзд, которые собрал некий проект на GitHub, то Node.js, у которого более 50000 звёзд, это очень и очень популярный проект.
Платформа Node.js построена на базе JavaScript движка V8 от Google, который используется в браузере Google Chrome. Данная платформа, в основном, используется для создания веб-серверов, однако сфера её применения этим не ограничивается.
Рассмотрим основные особенности Node.js.
▍Скорость
Одной из основных привлекательных особенностей Node.js является скорость. JavaScript-код, выполняемый в среде Node.js, может быть в два раза быстрее, чем код, написанный на компилируемых языках, вроде C или Java, и на порядки быстрее интерпретируемых языков наподобие Python или Ruby. Причиной подобного является неблокирующая архитектура платформы, а конкретные результаты зависят от используемых тестов производительности, но, в целом, Node.js — это очень быстрая платформа.
▍Простота
Платформа Node.js проста в освоении и использовании. На самом деле, она прямо-таки очень проста, особенно это заметно в сравнении с некоторыми другими серверными платформами.
▍JavaScript
В среде Node.js выполняется код, написанный на JavaScript. Это означает, что миллионы фронтенд-разработчиков, которые уже пользуются JavaScript в браузере, могут писать и серверный, и клиентский код на одном и том же языке программирования без необходимости изучать совершенно новый инструмент для перехода к серверной разработке.
В браузере и на сервере используются одинаковые концепции языка. Кроме того, в Node.js можно оперативно переходить на использование новых стандартов ECMAScript по мере их реализации на платформе. Для этого не нужно ждать до тех пор, пока пользователи обновят браузеры, так как Node.js — это серверная среда, которую полностью контролирует разработчик. В результате новые возможности языка оказываются доступными при установке поддерживающей их версии Node.js.
▍Движок V8
В основе Node.js, помимо других решений, лежит опенсорсный JavaScript-движок V8 от Google, применяемый в браузере Google Chrome и в других браузерах. Это означает, что Node.js пользуется наработками тысяч инженеров, которые сделали среду выполнения JavaScript Chrome невероятно быстрой и продолжают работать в направлении совершенствования V8.
▍Асинхронность
В традиционных языках программирования (C, Java, Python, PHP) все инструкции, по умолчанию, являются блокирующими, если только разработчик явным образом не позаботится об асинхронном выполнении кода. В результате если, например, в такой среде, произвести сетевой запрос для загрузки некоего JSON-кода, выполнение потока, из которого сделан запрос, будет приостановлено до тех пор, пока не завершится получение и обработка ответа.
JavaScript значительно упрощает написание асинхронного и неблокирующего кода с использованием единственного потока, функций обратного вызова (коллбэков) и подхода к разработке, основанной на событиях. Каждый раз, когда нам нужно выполнить тяжёлую операцию, мы передаём соответствующему механизму коллбэк, который будет вызван сразу после завершения этой операции. В результате, для того чтобы программа продолжила работу, ждать результатов выполнения подобных операций не нужно.
Подобный механизм возник в браузерах. Мы не можем позволить себе ждать, скажем, окончания выполнения AJAX-запроса, не имея при этом возможности реагировать на действия пользователя, например, на щелчки по кнопкам. Для того чтобы пользователям было удобно работать с веб-страницами, всё, и загрузка данных из сети, и обработка нажатия на кнопки, должно происходить одновременно, в режиме реального времени.
Если вы создавали когда-нибудь обработчик события нажатия на кнопку, то вы уже пользовались методиками асинхронного программирования.
Асинхронные механизмы позволяют единственному Node.js-серверу одновременно обрабатывать тысячи подключений, не нагружая при этом программиста задачами по управлению потоками и по организации параллельного выполнения кода. Подобные вещи часто являются источниками ошибок.
Node.js предоставляет разработчику неблокирующие базовые механизмы ввода вывода, и, в целом, библиотеки, использующиеся в среде Node.js, написаны с использованием неблокирующих парадигм. Это делает блокирующее поведение кода скорее исключением, чем нормой.
Когда Node.js нужно выполнить операцию ввода-вывода, вроде загрузки данных из сети, доступа к базе данных или к файловой системе, вместо того, чтобы заблокировать ожиданием результатов такой операции главный поток, Node.js инициирует её выполнение и продолжает заниматься другими делами до тех пор, пока результаты выполнения этой операции не будут получены.
▍Библиотеки
Благодаря простоте и удобству работы с менеджером пакетов для Node.js, который называется npm, экосистема Node.js прямо-таки процветает. Сейчас в реестре npm имеется более полумиллиона опенсорсных пакетов, которые может свободно использовать любой Node.js-разработчик.
Рассмотрев некоторые основные особенности платформы Node.js, опробуем её в действии. Начнём с установки.
Установка Node.js
Node.js можно устанавливать различными способами, которые мы сейчас рассмотрим.
Так, официальные установочные пакеты для всех основных платформ можно найти здесь.
Существует ещё один весьма удобный способ установки Node.js, который заключается в использовании менеджера пакетов, имеющегося в операционной системе. Например, менеджер пакетов macOS, который является фактическим стандартом в этой области, называется Homebrew. Если он в вашей системе есть, вы можете установить Node.js, выполнив эту команду в командной строке:
brew install node
Список менеджеров пакетов для других операционных систем, в том числе — для Linux и Windows, можно найти здесь.
Популярным менеджером версий Node.js является nvm. Это средство позволяет удобно переключаться между различными версиями Node.js, с его помощью можно, например, установить и попробовать новую версию Node.js, после чего, при необходимости, вернуться на старую. Nvm пригодится и в ситуации, когда нужно испытать какой-нибудь код на старой версии Node.js.
Я посоветовал бы начинающим пользоваться официальными установщиками Node.js. Пользователям macOS я порекомендовал бы устанавливать Node.js с помощью Homebrew. Теперь, после того, как вы установили Node.js, пришло время написать «Hello World».
Первое Node.js-приложение
Самым распространённым примером первого приложения для Node.js можно назвать простой веб-сервер. Вот его код:
const http = require('http')
const hostname = '127.0.0.1'
const port = 3000
const server = http.createServer((req, res) => {
res.statusCode = 200
res.setHeader('Content-Type', 'text/plain')
res.end('Hello World\n')
})
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`)
})
Для того чтобы запустить этот код, сохраните его в файле
server.js
и выполните в терминале такую команду:node server.js
Для проверки сервера откройте какой-нибудь браузер и введите в адресной строке
http://127.0.0.1:3000
, то есть — тот адрес сервера, который будет выведен в консоли после его успешного запуска. Если всё работает как надо — на странице будет выведено «Hello World».Разберём этот пример.
Для начала, обратите внимание на то, что код содержит команду подключения модуля http.
Платформа Node.js является обладателем замечательного стандартного набора модулей, в который входят отлично проработанные механизмы для работы с сетью.
Метод createServer()
объекта http
создаёт новый HTTP-сервер и возвращает его.
Сервер настроен на прослушивание определённого порта на заданном хосте. Когда сервер будет готов, вызывается соответствующий коллбэк, сообщающий нам о том, что сервер работает.
Когда сервер получает запрос, вызывается событие request
, предоставляющее два объекта. Первый — это запрос (req
, объект http.IncomingMessage), второй — ответ (res
, объект http.ServerResponse). Они представляют собой важнейшие механизмы обработки HTTP-запросов.
Первый предоставляет в наше распоряжение сведения о запросе. В нашем простом примере этими данными мы не пользуемся, но, при необходимости, с помощью объекта req
можно получить доступ к заголовкам запроса и к переданным в нём данным.
Второй нужен для формирования и отправки ответа на запрос.
В данном случае ответ на запрос мы формируем следующим образом. Сначала устанавливаем свойство statusCode
в значение 200
, что указывает на успешное выполнение операции:
res.statusCode = 200
Далее, мы устанавливаем заголовок
Content-Type
:res.setHeader('Content-Type', 'text/plain')
После этого мы завершаем подготовку ответа, добавляя его содержимое в качестве аргумента метода
end()
:res.end('Hello World\n')
Мы уже говорили о том, что вокруг платформы Node.js сформировалась мощная экосистема. Обсудим теперь некоторые популярные фреймворки и вспомогательные инструменты для Node.js.
Фреймворки и вспомогательные инструменты для Node.js
Node.js — это низкоуровневая платформа. Для того чтобы упростить разработку для неё и облегчить жизнь программистам, было создано огромное количество библиотек. Некоторые из них со временем стали весьма популярными. Вот небольшой список библиотек, которые я считаю отлично сделанными и достойными изучения:
- Express. Эта библиотека предоставляет разработчику предельно простой, но мощный инструмент для создания веб-серверов. Ключом к успеху Express стал минималистический подход и ориентация на базовые серверные механизмы без попытки навязать некое видение «единственно правильной» серверной архитектуры.
- Meteor. Это — мощный фулстек-фреймворк, реализующий изоморфный подход к разработке приложений на JavaScript и к использованию кода и на клиенте, и на сервере. Когда-то Meteor представлял собой самостоятельный инструмент, включающий в себя всё, что только может понадобиться разработчику. Теперь он, кроме того, интегрирован с фронтенд-библиотеками, такими, как React, Vue и Angular. Meteor, помимо разработки обычных веб-приложений, можно использовать и в мобильной разработке.
- Koa. Этот веб-фреймворк создан той же командой, которая занимается работой над Express. При его разработке, в основу которой легли годы опыта работы над Express, внимание уделялось простоте решения и его компактности. Этот проект появился как решение задачи внесения в Express серьёзных изменений, несовместимых с другими механизмами фреймворка, которые могли бы расколоть сообщество.
- Next.js. Этот фреймворк предназначен для организации серверного рендеринга React-приложений.
- Micro. Это — весьма компактная библиотека для создания асинхронных HTTP-микросервисов.
- Socket.io. Это библиотека для разработки сетевых приложений реального времени.
На самом деле, в экосистеме Node.js можно найти вспомогательную библиотеку для решения практически любой задачи. Как вы понимаете, на строительство подобной экосистемы нужно немало времени. Платформа Node.js появилась в 2009 году. За время её существования случилось много всего такого, о чём стоит знать программисту, который хочет изучить эту платформу.
Краткая история Node.js
В этом году Node.js исполнилось уже 9 лет. Это, конечно, не так уж и много, если сравнить этот возраст с возрастом JavaScript, которому уже 23 года, или с 25-летним возрастом веба, существующем в таком виде, в котором мы его знаем, если считать от появления браузера Mosaic.
9 лет — это маленький срок для технологии, но сейчас возникает такое ощущение, что платформа Node.js существовала всегда.
Я начал работу с Node.js с ранних версий платформы, когда ей было ещё только 2 года. Даже тогда, несмотря на то, что информации о Node.js было не так уж и много, уже можно было почувствовать, что Node.js — это очень серьёзно.
Теперь поговорим о технологиях, лежащих в основе Node.js и кратко рассмотрим основные события, связанные с этой платформой.
Итак, JavaScript — это язык программирования, который был создан в Netscape как скриптовый язык, предназначенный для управления веб-страницами в браузере Netscape Navigator.
Частью бизнеса Netscape была продажа веб-серверов, которые включали в себя среду, называемую Netscape LiveWire. Она позволяла создавать динамические веб-страницы, используя серверный JavaScript. Как видите, идея использования JS для серверной разработки гораздо старше чем Node.js. Этой идее почти столько же лет, сколько и самому JavaScript, но во времена, о которых идёт речь, популярности серверный JS не снискал.
Одним из ключевых факторов, благодаря которому платформа Node.js стала столь распространённой и популярной, является время её появления. Так, за несколько лет до этого JavaScript начали считать серьёзным языком. Случилось это благодаря приложениям Web 2.0, вроде Google Maps или Gmail, которые продемонстрировали миру возможности современных веб-технологий.
Благодаря конкурентной войне браузеров, которая продолжается и по сей день, серьёзно возросла производительность JavaScript-движков. Команды разработчиков, стоящих за основными браузерами, каждый день работают над повышением производительности их решений, что благотворно влияет на JavaScript в целом. Один из таких движков — это уже упомянутый V8, используемый в браузере Chrome и применяемый в Node.js. Он является одним из результатов стремления разработчиков браузеров к высокой производительности JS-кода.
Конечно же, популярность Node.js основана не только на удачном стечении обстоятельств и на том, что эта платформа появилась в правильное время. Она представила миру инновационный подход к серверной разработке на JavaScript. Рассмотрим основные вехи истории Node.js.
▍2009
- Появление Node.js
- Создание первого варианта npm.
▍2010
▍2011
- Выход npm 1.0.
- Большие компании, такие, как LinkedIn и Uber, начали пользоваться Node.js.
▍2012
- Быстрый рост популярности Node.js.
▍2013
- Появление Ghost, первой крупной платформы для публикаций, использующей Node.js.
- Выпуск Koa.
▍2014
- В этом году произошли драматические события. Появился проект IO.js, являющийся форком Node.js, целью создания которого, кроме прочего, было внедрение поддержки ES6 и ускорение развития платформы.
▍2015
- Основание организации Node.js Foundation.
- Слияние IO.js и Node.js.
- В npm появляется возможность работать с приватными модулями.
- Выход Node.js 4 (надо отметить, что версий 1, 2 и 3 у этой платформы не было).
▍2016
- Инцидент с пакетом left-pad.
- Появление Yarn.
- Выход Node.js 6.
▍2017
- В npm начинают больше внимания уделять безопасности.
- Выход Node.js 8
- Появление поддержки HTTP/2.
- V8 официально признают в качестве JS-движка, предназначенного не только для Chrome, но и для Node.
- Еженедельно осуществляется 3 миллиарда загрузок из npm.
▍2018
- Выход Node.js 10.
- Поддержка ES-модулей.
- Экспериментальная поддержка mjs.
Итоги
Сегодня вы ознакомились с платформой Node.js, разобрались с её установкой, написали и испытали первое простое приложение. В следующий раз мы поговорим о том, каким объёмом знаний в области JavaScript нужно обладать для успешной разработки для Node.js, о том, чем различаются браузерный и серверный JS-код, и обсудим некоторые приёмы Node.js-разработки.
Уважаемые читатели! Скажите, запустился ли у вас Hello World для Node.js?
Следующие части руководства:
Часть 1: Общие сведения и начало работы
Часть 2: JavaScript, V8, некоторые приёмы разработки
Часть 3: Хостинг, REPL, работа с консолью, модули
Часть 4: npm, файлы package.json и package-lock.json
Часть 5: npm и npx
Часть 6: цикл событий, стек вызовов, таймеры
Часть 7: асинхронное программирование
Устранение неисправностей вирусов
Эти программы являются наиболее распространенными вредоносными программами и могут уничтожать личные файлы, операционные системы или открывать уязвимости для других заражений вредоносным ПО.
Компьютерные вирусы существуют уже несколько десятилетий. Компьютерный вирус — это оригинальная вредоносная программа, созданная в самом начале создания компьютера еще до того, как был создан Интернет. Эти программы являются наиболее распространенными вредоносными программами и могут уничтожать личные файлы, операционные системы или открывать уязвимости для других вредоносных программ.
Общая история вирусов
Один из самых первых компьютерных вирусов был написан как шутка. Он был написан для компьютера Apple II и заражал любую дискету, вставленную после заражения. На 50-й загрузке вирус Elk Cloner отобразит стихотворение. Это был безвредный, но эффективный способ саморепликации компьютерной программы.
В 1970-х годах был создан вирус по имени Creeper, который распространялся через первоначальную версию Интернета — ARPANET.Вирус отобразил простое сообщение: «Я ползучий, поймай меня, если сможешь!» Затем была создана счетная программа Reaper для удаления вируса — своего рода «антивирус» перед созданием антивирусных приложений.
В 1980-х годах создатели вирусов становились все более вредоносными и скомпилированными программами, которые уничтожали и удаляли файлы. Ограничение для создателей вирусов заключалось в том, что программы должны распространяться с использованием дискет, передаваемых от пользователя к пользователю. Когда Интернет стал популярным в 1990-х годах, у вирусов появился более удобный способ распространения — веб-сайты и электронная почта.1990-е годы — это когда вирусы начинают распространяться быстрее, и с 2012 года насчитывается более 17 миллионов вирусов.
Что делает вирус?
Хотя трояны и вирусы часто попадают в одну категорию, они представляют собой разные типы компьютерных программ. Троян предоставляет хакеру доступ к вашей машине. Вирус предназначен для самовоспроизведения, уничтожения или удаления данных, нарушения последовательности загрузки или просто отправки данных другому пользователю. С более чем 17 миллионами вирусов трудно перечислить все функции вируса.Однако основной целью компьютерного хакера является тот, у кого есть данные для удаления, уничтожения или кражи.
Одним из основных компонентов компьютерного вируса является фактор репликации. Вирус неэффективен, если он заражает один компьютер и не распространяется на другие компьютеры. Чтобы быть эффективным, вирус должен иметь возможность реплицироваться на другие машины с использованием любого типа векторов — дискет, флешек, Интернета или электронной почты. Это делается разными способами, большинство из которых — умные идеи от создателей вирусов. Например, в 1990-х годах было несколько вирусов, которые распространялись по электронной почте.Вирус проверяет компьютер пользователя на наличие контактов, а затем отправляет копию своего электронного письма всем контактам. Все, что нужно, — это чтобы один пользователь открыл и запустил вредоносное ПО, чтобы распространить его среди десятков других пользователей. Пара из этих дюжин запускает его снова, и вирус распространяется в геометрической прогрессии. Как вы, наверное, видите, стратегия чрезвычайно эффективна.
Вирусы начали портить загрузочные файлы и удалять файлы, но современные вирусы часто используются для кражи данных. Конфиденциальные данные делают хакеров большим количеством денег на черном рынке.По этой причине большинство хакеров используют кражу данных вместо того, чтобы просто удалять важные файлы.
Создатели вирусов даже перешли на мобильные устройства. Только в последние несколько лет люди делали онлайн-банкинг со своего телефона, оплачивали через приложения, хранили личную информацию и обменивались документами с помощью мобильного устройства. Большинство пользователей даже не имеют антивирусов на своем смартфоне, поэтому это идеальное убежище для создателей вирусов.
Что вы можете сделать, чтобы избежать вирусов?
Поскольку большинство пользователей десять лет назад имели Windows, большинство вирусов предназначалось для пользователей Windows.На компьютерах Linux и Apple было очень мало вирусов, созданных для их операционной системы. Помните, что создатели вирусов должны иметь возможность реплицировать вирус на разных компьютерах, поэтому нацеливание на Apple и Linux было плохим выбором — таких пользователей было недостаточно. Однако сегодня операционный ландшафт сильно отличается.
Времена изменились, и компьютеры Linux и Apple продолжают набирать обороты. Раньше было так, что просто наличие операционной системы помимо Windows защищало вас от вирусов.Это уже не так.
Первым шагом на пути к предотвращению вирусов является установка только программного обеспечения, загруженного из официального источника. Например, если вы хотите установить Microsoft Office, вы должны устанавливать его только с сайта Microsoft или из упакованного пакета, который вы покупаете в магазине. Авторы вирусов используют распространенные программы, распространяемые на сторонних сайтах, чтобы убедить пользователей устанавливать вредоносные программы на своих компьютерах. Эти программы иногда устанавливают реальное приложение, но затем создатели добавляют дополнительный фрагмент вредоносного ПО в процесс установки.
Некоторые создатели вредоносных программ по-прежнему используют электронную почту. Электронная почта человека используется для отправки ссылки на группу контактов с компьютера жертвы. Ссылка указывает пользователям на вирусный файл или сайт, где пользователь может загрузить вирус. Если вы получили странное электронное письмо от знакомого, предупредите его о том, что его электронное письмо может быть взломано, но не нажимайте на ссылку.
Если вы получили электронное письмо с исполняемым вложением, вы должны либо отсканировать его, либо вообще не запускать на своем компьютере.
Несколько распространенных расширений файлов, которые могут устанавливать вирусы:
- EXE
- CMD
- VBS
- ZIP.EXE
- TXT.EXE
Последние два используются для маскировки реального исполняемого файла. Пользователи видят расширение TXT и сразу думают, что файл является просто текстовым файлом. Они дважды щелкают файл, и исполняемый файл запускается вместе с вирусом вместо открытия простого текстового документа. То же самое с расширением zip. Пользователи думают, что они откроют zip-файл, но вместо этого запускают исполняемый файл вируса.
Браузеры иногда оставляют вашу систему открытой для вредоносных программ. Старые браузеры, такие как Internet Explorer 6, часто становились мишенью для хакеров.IE6 был широко известен своей уязвимостью, когда хакеры могли устанавливать вредоносное ПО на ПК только тогда, когда пользователь просматривает веб-сайт. Всегда обновляйте свой браузер и устанавливайте исправления безопасности, когда они публикуются. За последние годы Internet Explorer стал более безопасным, но большинство экспертов придерживаются FireFox или Chrome.
Основное правило для предотвращения вирусов — «устанавливайте программное обеспечение только от поставщика, которому вы доверяете».
Удаление вирусов с вашего компьютера
По большей части вирусы копируют себя в системные каталоги.Они также создают записи реестра на вашем компьютере. Самый лучший и безопасный способ удаления вируса с вашего компьютера — запустить на компьютере хорошее антивирусное приложение. Если вы не обновили файлы определений, обновите их либо через приложение, либо загрузите их у официального производителя антивируса. С помощью полной проверки вашего компьютера с использованием новейших файлов определений вы можете избавить свой компьютер от большинства вирусов в дикой природе.
- Почему GitHub?
Особенности →
- Обзор кода
- Управление проектами
- Интеграции
- Действия
- Пакеты
- Безопасность
- Управление командой
- Хостинг
- Отзывы клиентов →
- Безопасность →
- команда
- предприятие
- Проводить исследования
- Исследуйте GitHub →
учиться и внести свой вклад
- Темы
- Коллекции
- Тенденции
- Learning Lab
- Руководства с открытым исходным кодом
Общайтесь с другими
- События
- Общественный форум
- GitHub Education
- Почему GitHub?
Особенности →
- Обзор кода
- Управление проектами
- Интеграции
- Действия
- Пакеты
- Безопасность
- Управление командой
- Хостинг
- Отзывы клиентов →
- Безопасность →
- команда
- предприятие
- Проводить исследования
- Исследуйте GitHub →
учиться и внести свой вклад
- Темы
- Коллекции
- Тенденции
- Learning Lab
- Руководства с открытым исходным кодом
Общайтесь с другими
- События
- Общественный форум
- GitHub Education
tunz / js-vuln-db: коллекция CVE для движка JavaScript с PoC
перейти к содержанию Зарегистрироваться- Почему GitHub?
Особенности →
- Обзор кода
- Управление проектами
- Интеграции
- Действия
- Пакеты
- Безопасность
- Управление командой
- Хостинг
- Отзывы клиентов →
- Безопасность →
- команда
- предприятие
- Проводить исследования
- Исследуйте GitHub →
учиться и внести свой вклад
- Темы
- Коллекции
- Тенденции
- Learning Lab
- Руководства с открытым исходным кодом
Общайтесь с другими
- События
- Общественный форум
- GitHub Education