diff options
Diffstat (limited to 'ru-ru')
28 files changed, 537 insertions, 122 deletions
| diff --git a/ru-ru/asymptotic-notation-ru.html.markdown b/ru-ru/asymptotic-notation-ru.html.markdown index 7fd02c47..cb276ec1 100644 --- a/ru-ru/asymptotic-notation-ru.html.markdown +++ b/ru-ru/asymptotic-notation-ru.html.markdown @@ -48,7 +48,7 @@ f(n) — время выполнения. Тогда для данного ал  С помощью О-символики можно оценить функцию или алгоритм
  несколькими различными способами. Например, можно оценить алгоритм исходя
  из нижней оценки, верхней оценки, тождественной оценки. Чаще всего встречается
 -анализ на основе верхней оценки. Как правило не используется нижняя оценка,
 +анализ на основе верхней оценки. Как правило, не используется нижняя оценка,
  потому что она не подходит под планируемые условия. Отличный пример — алгоритмы
  сортировки, особенно добавление элементов в древовидную структуру. Нижняя оценка
  большинства таких алгоритмов может быть дана как одна операция. В то время как в
 @@ -155,8 +155,8 @@ c (c > 0) и n<sub>0</sub> (n<sub>0</sub> > 0), такие, что `f(n)` >= `c  ### Примечание
 -Асимптотические оценки, сделаные при помощи О Большого и Омега Большого, могут
 -как являться, так и не являться точными. Для того, чтобы обозначить, что границы не
 +Асимптотические оценки, сделанные при помощи О Большого и Омега Большого, могут
 +как являться, так и не являться точными. Для того чтобы обозначить, что границы не
  являются асимптотически точными, используются записи О Малое и Омега Малое.
  ### О Малое
 diff --git a/ru-ru/binary-search-ru.html.markdown b/ru-ru/binary-search-ru.html.markdown index 9ed62cb8..ab1a1585 100644 --- a/ru-ru/binary-search-ru.html.markdown +++ b/ru-ru/binary-search-ru.html.markdown @@ -55,7 +55,7 @@ def search(arr, x):  ### На заметку -Существует и другая форма двоичного поиска, которая можеть быть полезна. +Существует и другая форма двоичного поиска, которая может быть полезна.  ## На почитать diff --git a/ru-ru/c++-ru.html.markdown b/ru-ru/c++-ru.html.markdown index fad1b434..43e9e6a3 100644 --- a/ru-ru/c++-ru.html.markdown +++ b/ru-ru/c++-ru.html.markdown @@ -17,7 +17,7 @@ C++ - компилируемый, статически типизированн  - "лучшая замена C"  - язык с поддержкой абстракции данных -- язык с поддержкой объектно-ориентированого программирования +- язык с поддержкой объектно-ориентированного программирования  - язык с поддержкой обобщенного программирования  Хотя его синтаксис может показаться более трудным или сложным для понимания, чем в более современных языках, diff --git a/ru-ru/c-ru.html.markdown b/ru-ru/c-ru.html.markdown index eb5de011..a146a76b 100644 --- a/ru-ru/c-ru.html.markdown +++ b/ru-ru/c-ru.html.markdown @@ -476,7 +476,7 @@ void str_reverse_through_pointer(char *str_in) {  Если у вас появился вопрос, почитайте [compl.lang.c Frequently Asked Questions](http://c-faq.com).  Очень важно использовать правильные отступы и ставить пробелы в нужных местах. -Читаемый код лучше чем красивый или быстрый код. +Читаемый код лучше, чем красивый или быстрый код.  Чтобы научиться писать хороший код, почитайте [Linux kernel coding style](https://www.kernel.org/doc/Documentation/CodingStyle).  Также не забывайте, что [Google](http://google.com) и [Яндекс](http://yandex.ru) – ваши хорошие друзья. diff --git a/ru-ru/common-lisp-ru.html.markdown b/ru-ru/common-lisp-ru.html.markdown index d5f9bf0e..0490ee30 100644 --- a/ru-ru/common-lisp-ru.html.markdown +++ b/ru-ru/common-lisp-ru.html.markdown @@ -14,7 +14,8 @@ Common Lisp - мультипарадигменный язык программи  спектра задач.  Его частенько называют программируемым языком программирования. -Идеальная отправная точка - книга [Common Lisp на практике (перевод)](http://lisper.ru/pcl/). +Идеальная отправная точка - книга +[Common Lisp на практике (перевод)](https://github.com/pcl-ru/pcl-ru/releases/download/v1.1/pcl-ru.pdf).  Ещё одна популярная книга [Land of Lisp](http://landoflisp.com/).  И одна из последних книг [Common Lisp Recipes](http://weitz.de/cl-recipes/) вобрала в себя лучшие  архитектурные решения на основе опыта коммерческой работки автора. @@ -674,7 +675,7 @@ nil                    ; ложь; а ещё пустой список () тож  ## Для чтения  На русском -- [Practical Common Lisp](http://www.gigamonkeys.com/book/) +- [Practical Common Lisp](https://github.com/pcl-ru/pcl-ru/releases/download/v1.1/pcl-ru.pdf)  На английском  - [Practical Common Lisp](http://www.gigamonkeys.com/book/) @@ -685,7 +686,7 @@ nil                    ; ложь; а ещё пустой список () тож  На русском -- [Lisper.ru](http://lisper.ru/) +- [Сообщество в Telegram](https://t.me/lisp_forever)  На английском diff --git a/ru-ru/css-ru.html.markdown b/ru-ru/css-ru.html.markdown index e0e5e30b..b543bfeb 100644 --- a/ru-ru/css-ru.html.markdown +++ b/ru-ru/css-ru.html.markdown @@ -20,12 +20,12 @@ HTML элементы и определять их внешний вид.  **ВАЖНО:** Так как результатом применения CSS является изменение внешнего вида  элементов, постарайтесь использовать CSS-песочницы при изучении языка. -Например [dabblet](http://dabblet.com/). +Например, [dabblet](http://dabblet.com/).  В данной статье рассматриваются в первую очередь синтаксис и общие рекомендации.  ```css -/* Для комментариев используется слеш-астериск, как на этой строчке. +/* Для комментариев используется слэш-астериск, как на этой строчке.     В CSS нет однострочных комментариев; все комментарии записываются таким способом */  /* #################### @@ -104,7 +104,7 @@ div.some-parent.class-name {}  .i-am-any-before ~ .this-element {} -/* Существуют псевдо-классы, позволяющие изменять внешний вид элемента +/* Существуют псевдоклассы, позволяющие изменять внешний вид элемента     в зависимости от событий, произошедших с элементом */  /* например, когда курсор наведен на элемент */ diff --git a/ru-ru/elixir-ru.html.markdown b/ru-ru/elixir-ru.html.markdown index c8c2c060..8dd48ba7 100644 --- a/ru-ru/elixir-ru.html.markdown +++ b/ru-ru/elixir-ru.html.markdown @@ -1,5 +1,5 @@  --- -language: elixir +language: Elixir  contributors:      - ["Joao Marques", "http://github.com/mrshankly"]      - ["Dzianis Dashkevich", "https://github.com/dskecse"] diff --git a/ru-ru/forth-ru.html.markdown b/ru-ru/forth-ru.html.markdown index 2fc4ad7c..96fa0941 100644 --- a/ru-ru/forth-ru.html.markdown +++ b/ru-ru/forth-ru.html.markdown @@ -10,10 +10,10 @@ lang: ru-ru  Форт создан Чарлзом Муром в 70-е годы. Это императивный, стековый язык программирования и среда исполнения программ. Использовался в таких проектах как Open Firmware. Продолжает применятся в проектах. Применяется в НАСА. -Внимание: эта материал использует реализацию Форта - Gforth, но большая часть написанного будет работать в других средах. +Внимание: этот материал использует реализацию Форта - Gforth, но большая часть написанного будет работать в других средах. -``` +```forth  \ Это комментарий  ( Это тоже комментарий, но используется для предоределённых слов ) diff --git a/ru-ru/go-ru.html.markdown b/ru-ru/go-ru.html.markdown index 8d2eac90..22249a6e 100644 --- a/ru-ru/go-ru.html.markdown +++ b/ru-ru/go-ru.html.markdown @@ -82,7 +82,7 @@ func learnTypes() {      // Символ не из ASCII. Исходный код Go в кодировке UTF-8.      g := 'Σ' // тип rune, это алиас для типа int32, содержит символ юникода. -    f := 3.14195 // float64, 64-х битное число с плавающей точкой (IEEE-754). +    f := 3.14159 // float64, 64-х битное число с плавающей точкой (IEEE-754).      c := 3 + 4i  // complex128, внутри себя содержит два float64.      // Синтаксис var с инициализациями. @@ -334,12 +334,12 @@ func requestServer() {  ## Что дальше -Основа всех основ в Go это [официальный веб сайт](http://golang.org/). +Основа всех основ в Go это [официальный веб сайт](https://go.dev/).  Там можно пройти туториал, поиграться с интерактивной средой Go и почитать  объёмную документацию.  Для живого ознакомления рекомендуется почитать исходные коды [стандартной -библиотеки Go](http://golang.org/src/pkg/). Отлично задокументированная, она +библиотеки Go](https://go.dev/src/). Отлично задокументированная, она  является лучшим источником для чтения и понимания Go, его стиля и идиом. Либо -можно, кликнув на имени функции в [документации](http://golang.org/pkg/), +можно, кликнув на имени функции в [документации](https://go.dev/pkg/),  перейти к ее исходным кодам. diff --git a/ru-ru/haml-ru.html.markdown b/ru-ru/haml-ru.html.markdown index c2f8852e..ed823496 100644 --- a/ru-ru/haml-ru.html.markdown +++ b/ru-ru/haml-ru.html.markdown @@ -39,7 +39,7 @@ $ haml input_file.haml output_file.html  / Комментарии  / ------------------------------------------- -/ Комментари начинается с символа косой черты. +/ Комментарии начинается с символа косой черты.  /    Для написания многострочного комментария расположите ваш комментарий @@ -94,7 +94,7 @@ $ haml input_file.haml output_file.html  / выведет 'Да & да'  / -  Чтобы выполнять Ruby-код без экранрования, можно использовать +  Чтобы выполнять Ruby-код без экранирования, можно использовать    "восклицательный знак" и "равно" (!=)  %p @@ -196,13 +196,13 @@ $ haml input_file.haml output_file.html  / -------------------------------------------  / -  Фильтры передают связанный блок текста в соотвествующую +  Фильтры передают связанный блок текста в соответствующую    фильтрующую программу и возвращают результат в Haml    Фильтр обозначается двоеточием и названием фильтра:  / Markdown filter  :markdown -  # Заголовк +  # Заголовок    Текст **внутри** *блока* @@ -221,7 +221,7 @@ $ haml input_file.haml output_file.html  </script>  / -  Существует множество типов фильров (:markdown, :javascript, :coffee, +  Существует множество типов фильтров (:markdown, :javascript, :coffee,    :css, :ruby и так далее). Вы можете определить собственный фильтр c    помощью Haml::Filters. diff --git a/ru-ru/haskell-ru.html.markdown b/ru-ru/haskell-ru.html.markdown index b1b8eb79..aada30c1 100644 --- a/ru-ru/haskell-ru.html.markdown +++ b/ru-ru/haskell-ru.html.markdown @@ -8,7 +8,7 @@ translators:  lang: ru-ru  --- -Haskell разрабатывался, как чистый функциональный язык программирования, применимый на практике. Язык известен благодаря своей системе типов, и "знаменит" благодаря монадам. [Меня][autor] же Haskell заставляет возвращаться к себе снова и снова именно своей элегантностью и [я][autor] получаю истинное удовольствие, программируя на Haskell. +Haskell разрабатывался, как чистый функциональный язык программирования, применимый на практике. Язык известен благодаря своей системе типов, и "знаменит" благодаря монадам. [Меня][author] же Haskell заставляет возвращаться к себе снова и снова именно своей элегантностью и [я][author] получаю истинное удовольствие, программируя на Haskell.  ```haskell  -- Однострочные комментарии начинаются с двух дефисов @@ -172,7 +172,7 @@ fib x  первое определение, к образцу которого  "подойдет" набор аргументов -}  fib 1 = 1 -fib 2 = 2 +fib 2 = 1  fib x = fib (x - 1) + fib (x - 2)  -- Pattern matching для кортежей выглядит так @@ -544,4 +544,4 @@ Haskell прост в установке, забирайте [здесь](http:/  [Learn you a Haskell](http://learnyouahaskell.com/) и  [Real World Haskell](http://book.realworldhaskell.org/). -[autor]: http://adit.io имеется в виду автор оригинального текста Adit Bhargava *(примечание переводчика)* +[author]: http://adit.io имеется в виду автор оригинального текста Adit Bhargava *(примечание переводчика)* diff --git a/ru-ru/html-ru.html.markdown b/ru-ru/html-ru.html.markdown index 120981b9..e18fb8a0 100644 --- a/ru-ru/html-ru.html.markdown +++ b/ru-ru/html-ru.html.markdown @@ -8,28 +8,28 @@ translators:  lang: ru-ru  --- -HTML расшифровывается как Hypertext Markup Language(гипертекстовый язык разметки). -Это язык используют для написания страниц для World Wide Web(всемирной паутины). -Это язык разметки позволяет писать веб-страниц с помощью кода, чтобы определять,  -как должны быть отображены текст и данные. +HTML расшифровывается как Hypertext Markup Language (гипертекстовый язык разметки). +Этот язык используют для написания страниц для World Wide Web (всемирной паутины). +Этот язык разметки позволяет описать веб-страницу с помощью кода, чтобы определить,  +как на ней должны быть отображены текст и данные.  На самом деле, HTML файлы представляют собой простые текстовые файлы. -Что такое разметка? Это способ организации данных страницы, -путем открытия и закрытия тегов(помещая данные внутрь этих тегов). -Эта разметка служит, чтобы придать значение тексту, который он окружает. +Что такое разметка? Это способ организации данных страницы +путем открытия и закрытия тегов и помещения данных внутрь этих тегов. +Эта разметка служит, чтобы придать значение тексту, который она окружает.  Как и в других языках программирования, HTML имеет много версий. Здесь мы будем говорить о HTML5.  **Примечание:** Вы можете тестировать различные теги и элементы по мере продвижения  -через учебник на сайте, как [codepen](http://codepen.io/pen/) для того, чтобы увидеть  +через учебник на сайте [codepen](http://codepen.io/pen/) для того, чтобы увидеть   их влияние, понять, как они работают и ознакомиться с языком. -В данной статье рассматривается в основном HTML синтаксис и некоторые полезные советы. +В данной статье рассматривается в основном HTML-синтаксис и некоторые полезные советы.  ```html -<!-- Комментарии заключаются как эта лини\! --> +<!-- Это комментарий. -->  <!-- #################### Теги #################### --> -<!-- Ниже приведен пример HTML-файл, который мы будем анализировать. --> +<!-- Ниже приведен пример HTML-файла, который мы будем анализировать. -->  <!doctype html>  	<html> @@ -39,7 +39,7 @@ HTML расшифровывается как Hypertext Markup Language(гипе  		<body>  			<h1>Привет, мир!</h1>  			<a href = "http://codepen.io/anon/pen/xwjLbZ"> -				Переходите сюда, чтоб посмотреть как это выглядит. +				Переходите сюда, чтобы посмотреть, как это выглядит.  			</a>  			<p>Это параграф.</p>  			<p>Это другой параграф.</p> @@ -51,41 +51,41 @@ HTML расшифровывается как Hypertext Markup Language(гипе  		</body>  	</html> -<!-- HTML-файл всегда начинается с указанием браузеру, что страница это HTML. --> +<!-- HTML-файл всегда начинается с указания браузеру, что страница — это HTML. -->  <!doctype html> -<!-- После этого, страница начинается с <html> тега. --> +<!-- После этого страница начинается с <html> тега. -->  <html> -<!-- страница будет закрыта в конце с помощью тега </html>. --> +<!-- Страница будет закрыта в конце с помощью тега </html>. -->  </html>  <!-- Ничто не должно появиться после этого заключительного тега. --> -<!-- Внутри (между открывающим и закрывающим тегами <html> </ html>), мы находим: --> +<!-- Внутри (между открывающим и закрывающим тегами <html> </ html>) мы находим: --> -<!-- Заголовок определяется <head> (it он должен быть закрыт </head>). --> +<!-- Заголовок определяется <head> (и он должен быть закрыт </head>). -->  <!-- Заголовок содержит описание и дополнительную информацию, которая не отображается; это метаданные. -->  <head> -	<title>Мой сайт</title><!-- Тег <title> указывает браузеру заголовок, чтобы показать в строке заголовка названия и вкладки браузера окна. --> +	<title>Мой сайт</title><!-- Тег <title> указывает браузеру заголовок, который следует показать в строке заголовка названия и вкладки браузера окна. -->  </head> -<!-- После секция <head>, находится секция - <body> --> -<!-- До этого момента, ничего описаное не будет отображаться в окне браузера. --> -<!-- Мы должны наполнить <body>  содержанием, которое будет отображаться. --> +<!-- После секции <head>, находится секция - <body> --> +<!-- До этого момента, ничего из описанного не будет отображаться в окне браузера. --> +<!-- Мы должны наполнить <body> содержанием, которое будет отображаться. -->  <body>  	<h1>Hello, world!</h1> <!-- Тег h1 создает заголовок. --> -	<!-- Так же существуют другие заголовки от имеющего большее значение <h1> по убыванию к  <h6>. --> -	<a href = "http://codepen.io/anon/pen/xwjLbZ">Переходите сюда, чтоб посмотреть как это выглядит.</a> -	<!--гиперссылка на URL, заданнf атрибутом href="" --> -	<p>Это параграф.</p> <!-- Тег <p> позволяет нам добавдять текст на странице HTML. --> +	<!-- Также существуют другие заголовки от имеющего большее значение <h1> до меньшего <h6>. --> +	<a href = "http://codepen.io/anon/pen/xwjLbZ">Переходите сюда, чтобы посмотреть, как это выглядит.</a> +	<!--гиперссылка на URL, заданная атрибутом href="" --> +	<p>Это параграф.</p> <!-- Тег <p> позволяет нам добавлять текст на странице HTML. -->  	<p>Это другой параграф.</p>  	<ul> <!-- Тег <ul> создает маркированный список. --> -	<!-- Для того, чтобы иметь пронумерованный список лучше использовать <ol>  -		тогда первый элемент будет иметь значение 1. для второго элемента, 2. и так далее. --> -		<li>Это элемент в не нумерованном списке (маркированный список)</li> +	<!-- Для того, чтобы иметь пронумерованный список, лучше использовать <ol>  +		тогда первый элемент будет иметь значение 1., для второго элемента 2. и так далее. --> +		<li>Это элемент в ненумерованном списке (маркированный список)</li>  		<li>Это еще один элемент</li>  		<li>И это последний пункт в списке</li>  	</ul> @@ -124,6 +124,6 @@ HTML файлы имеют окончание(расширение) `.html`.  ## Узнать больше -* [википедиа](https://ru.wikipedia.org/wiki/HTML) +* [википедия](https://ru.wikipedia.org/wiki/HTML)  * [HTML учебник](https://developer.mozilla.org/ru/docs/Web/HTML)  * [htmlbook](http://htmlbook.ru/) diff --git a/ru-ru/javascript-ru.html.markdown b/ru-ru/javascript-ru.html.markdown index 4556b425..4c4fa503 100644 --- a/ru-ru/javascript-ru.html.markdown +++ b/ru-ru/javascript-ru.html.markdown @@ -504,7 +504,7 @@ if (Object.create === undefined) { // не перезаписываем мето  [Mozilla Developer Network](https://developer.mozilla.org/ru/docs/Web/JavaScript) —  предоставляет отличную документацию для JavaScript, как он используется в браузерах. -Кроме того, это вики, поэтому, если вы знаете больше, вы можете помочь другим, +Кроме того, это вики. Поэтому, если вы знаете больше, вы можете помочь другим,  делясь своими знаниями.  [JavaScript Garden](http://bonsaiden.github.io/JavaScript-Garden/ru/) — это diff --git a/ru-ru/learnvisualbasic-ru.html.markdown b/ru-ru/learnvisualbasic-ru.html.markdown index 72e1358c..6242fc42 100644 --- a/ru-ru/learnvisualbasic-ru.html.markdown +++ b/ru-ru/learnvisualbasic-ru.html.markdown @@ -8,7 +8,7 @@ filename: learnvisualbasic-ru.vb  lang: ru-ru  --- -```vbnet +```visualbasic  Module Module1      Sub Main() diff --git a/ru-ru/linker-ru.html.markdown b/ru-ru/linker-ru.html.markdown index 7df29c23..14cfd229 100644 --- a/ru-ru/linker-ru.html.markdown +++ b/ru-ru/linker-ru.html.markdown @@ -34,11 +34,11 @@ lang: ru-ru  # Определяем точку входа в программу  ENTRY(Reset_Handler) -# Определяем перемнную которая содержит адрес вершины стека +# Определяем переменную которая содержит адрес вершины стека  _estack = 0x20020000;   -# Определяем перемнную которая содержит значение размера кучи   +# Определяем переменную которая содержит значение размера кучи    _Min_Heap_Size = 0x200; -# Определяем перемнную которая содержит значение размера стека +# Определяем переменную которая содержит значение размера стека  _Min_Stack_Size = 0x400;   # Описание карты памяти доступной для данного процессора @@ -50,7 +50,7 @@ _Min_Stack_Size = 0x400;  # RAM - начинается с адреса 0x20000000 и занимает 128 Кбайт;  # CCMRAM - начинается с адреса 0x10000000и занимает 64 Кбайт;  # FLASH - начинается с адреса 0x8000000 занимает 1024 Кбайт; -# Причем RAM память доступка для чтения, записи и исполнения. +# Причем RAM память доступна для чтения, записи и исполнения.  # CCMRAM память доступна только на чтение и запись.  # FLASH память доступна на чтение и исполнение.  MEMORY @@ -70,7 +70,7 @@ SECTIONS      . = ALIGN(4);  	# Существует опция --gc-sections, которая позволяет собирать мусор из неиспользуемых  -	# входных разделов. И если есть разделы, которые сборщик муссора не должен трогать,  +	# входных разделов. И если есть разделы, которые сборщик мусора не должен трогать,   	# то их необходимо указать в качестве аргумента функции KEEP() (аналог ключевого слова   	# volatile).  	# Запись (*(.isr_vector)) означает разделы .isr_vector во всех объектных файлах. Т.к.  @@ -80,8 +80,8 @@ SECTIONS  	# Выравниваем текущую позицию на границу 4-х байт.      . = ALIGN(4); -	# Выражение ">ОБЛАСТЬ_ПАМЯТИ" указывает в какую именно область памяти будет помещенна  -	# данная секция.	В нашем слущае секция .isr_vector будет размещена во FLASH памяти. +	# Выражение ">ОБЛАСТЬ_ПАМЯТИ" указывает в какую именно область памяти будет помещена  +	# данная секция.	В нашем случае секция .isr_vector будет размещена во FLASH памяти.    } >FLASH  # ИТОГО: Секция .isr_vector, которая содержит таблицу векторов прерываний выравнивается  @@ -125,7 +125,7 @@ SECTIONS  	# Выравниваем текущую позицию на границу 4-х байт.      . = ALIGN(4); -	# Указываем, что в данной секции будут хранится области .rodataвсех +	# Указываем, что в данной секции будут хранится области .rodata всех  	# объектных файлов         *(.rodata)               *(.rodata*)   @@ -158,13 +158,13 @@ SECTIONS      _edata = .;      	# Функция AT указывает на то, что данный сектор хранится в одной области памяти  -	# (в нашем случае FLASH), а исполняться будет из другой обасти памяти (в нашем случае RAM).  -	# Есть два типа адрессов: -	# * VMA (Virtual memory address) - это run-time адрес по которому уомпилятор ожидает  +	# (в нашем случае FLASH), а исполняться будет из другой области памяти (в нашем случае RAM).  +	# Есть два типа адресов: +	# * VMA (Virtual memory address) - это run-time адрес по которому компилятор ожидает   	#	видеть данные.  	# * LMA (Load memory address) - это адрес по которому линкер хранит данные.			 -	#Startup должен код скопировать секцию .data из адрессов LMA в адресса VMA. +	#Startup должен код скопировать секцию .data из адресов LMA в адреса VMA.    } >RAM AT> FLASH diff --git a/ru-ru/markdown-ru.html.markdown b/ru-ru/markdown-ru.html.markdown index 579a9a20..4692e628 100644 --- a/ru-ru/markdown-ru.html.markdown +++ b/ru-ru/markdown-ru.html.markdown @@ -45,7 +45,7 @@ Markdown является надмножеством HTML, поэтому люб  HTML-элементов -->  ``` -## Заголовки  +## Заголовки  HTML-элементы от <h1> до <h6> размечаются очень просто:  текст, который должен стать заголовком, предваряется @@ -110,7 +110,7 @@ __И этот тоже.__  Для вставки принудительных переносов можно завершить абзац двумя дополнительными пробелами:  ```md -Эта строка завершается двумя пробелами (выделите, чтобы увидеть!).   +Эта строка завершается двумя пробелами (выделите, чтобы увидеть!).  Над этой строкой есть <br />!  ``` @@ -208,7 +208,7 @@ __И этот тоже.__  ```md      my_array.each do |item| -        puts item +      puts item      end  ``` @@ -223,12 +223,11 @@ __И этот тоже.__  В Github Flavored Markdown для блоков кода можно использовать  специальный синтаксис: -<pre> -<code class="highlight">```ruby +```ruby  def foobar -    puts "Привет, мир!" +  puts "Привет, мир!"  end -```</code></pre> +```  Во фрагменте, приведённом выше, отступ не требуется.  Кроме того, Github подсветит синтаксис языка, указанного после \`\`\` @@ -255,6 +254,7 @@ end  ```md  [Ссылка!](http://test.com/)  ``` +  Также для ссылки можно указать всплывающую подсказку (`title`), используя  кавычки внутри круглых скобок: @@ -269,11 +269,13 @@ end  Markdown также позволяет размечать ссылку в виде сноски: -<pre><code class="highlight">[<span class="nv">Щёлкните эту ссылку</span>][<span class="ss">link1</span>] для подробной информации! -[<span class="nv">Также посмотрите эту ссылку,</span>][<span class="ss">foobar</span>] если хотите. +```md +[Щёлкните эту ссылку][link1] для подробной информации! +[Также посмотрите эту ссылку,][foobar] если хотите. -[<span class="nv">link1</span>]: <span class="sx">http://test.com/</span> <span class="nn">"Круто!"</span> -[<span class="nv">foobar</span>]: <span class="sx">http://foobar.biz/</span> <span class="nn">"Нормально!"</span></code></pre> +[link1]: http://test.com/ "Круто!" +[foobar]: http://foobar.biz/ "Нормально!" +```  `Title` также может быть в одинарных кавычках или круглых скобках, а также  отсутствовать вовсе. Ссылки на сноски могут быть в любом месте документа, @@ -281,9 +283,11 @@ Markdown также позволяет размечать ссылку в вид  Существует также неявное именование, когда ссылка является идентификатором. -<pre><code class="highlight">[<span class="nv">Это</span>][] ссылка. +```md +[Это][] ссылка. -[<span class="nv">это</span>]: <span class="sx">http://thisisalink.com/</span></code></pre> +[это]: http://thisisalink.com/ +```  Правда, эта возможность не очень распространена. @@ -294,11 +298,15 @@ Markdown также позволяет размечать ссылку в вид  ```md    ``` -Изображения тоже могут быть оформлены, как сноски. -<pre><code class="highlight">![<span class="nv">Это альтернативный текст.</span>][<span class="ss">myimage</span>] +Изображения тоже могут быть оформлены как сноски. + +```md +![Это альтернативный текст.][myimage] + +[myimage]: relative/urls/cool/image.jpg "Если нужна подсказка, её можно добавить" +``` -[<span class="nv">myimage</span>]: <span class="sx">relative/urls/cool/image.jpg</span> <span class="nn">"Если нужна подсказка, её можно добавить"</span></code></pre>  ## Разное  ### Автоссылки @@ -341,6 +349,7 @@ Markdown также позволяет размечать ссылку в вид  | Выравнивание | Выравнивание | Выравнивание |  | влево        | по центру    | вправо       |  ``` +  Или более компактно  ```md diff --git a/ru-ru/nim-ru.html.markdown b/ru-ru/nim-ru.html.markdown index 0e08f1bf..09784792 100644 --- a/ru-ru/nim-ru.html.markdown +++ b/ru-ru/nim-ru.html.markdown @@ -3,7 +3,7 @@ language: Nim  filename: learnNim-ru.nim  contributors:      - ["Jason J. Ayala P.", "http://JasonAyala.com"] -    - ["Dennis Felsing", "http://felsin9.de/nnis/"] +    - ["Dennis Felsing", "https://dennis.felsing.org"]  translators:      - ["Nomadic", "https://github.com/n0madic"]      - ["dvska", "https://github.com/dvska"] diff --git a/ru-ru/php-ru.html.markdown b/ru-ru/php-ru.html.markdown index af77a9ca..4a508cfc 100644 --- a/ru-ru/php-ru.html.markdown +++ b/ru-ru/php-ru.html.markdown @@ -125,7 +125,7 @@ echo 'Multiple', 'Parameters', 'Valid'; // печатает 'MultipleParametersV  // и никогда не может быть изменена во время выполнения программы!  // Правильное имя константы начинается с буквы или символа подчеркивания -// и содержит любое колличество букв, цифр или символов подчеркивания. +// и содержит любое количество букв, цифр или символов подчеркивания.  define("FOO", "something");  // Доступ к константе возможен через прямое указание её имени без знака $ @@ -224,7 +224,7 @@ assert($c > $b); // больше  assert($a <= $b); // меньше или равно  assert($c >= $d); // больше или равно -// Следующие утверждения истинны, если переменные имеют одинаковые тип. +// Следующие утверждения истинны, если переменные имеют одинаковый тип.  assert($c === $d);  assert($a !== $d);  assert(1 == '1'); @@ -251,7 +251,7 @@ echo $string + $string; // => 2 (строка превращается в чис  $string = 'one';  echo $string + $string; // => 0 -// Приведение типов (type casting) может быть использовано для преобразование +// Приведение типов (type casting) может быть использовано для преобразования  // переменной в другой тип  $boolean = (boolean) 1; // => true @@ -458,7 +458,7 @@ include_once 'my-file.php';  require 'my-file.php';  require_once 'my-file.php'; -// Действует также как и include(), но если файл не удалось подключить, +// Действует так же как и include(), но если файл не удалось подключить,  // функция выдает фатальную ошибку  // Содержимое файла my-include.php: @@ -497,7 +497,7 @@ class MyClass      // Конструктор описывается с помощью __construct      public function __construct($instanceProp) { -        // Доступ к эземпляру класса с помощью $this +        // Доступ к экземпляру класса с помощью $this          $this->instanceProp = $instanceProp;      } @@ -661,7 +661,7 @@ $cls->myTraitMethod(); // Напечатает "I have MyTrait"  <?php  // По умолчанию, классы существуют в глобальном пространстве имен и могут быть -// вызваны с обратным слешем. +// вызваны с обратным слэшем.  $cls = new \MyClass(); @@ -762,7 +762,7 @@ echo "Current method is " . __METHOD__;  echo "Current namespace is " . __NAMESPACE__;  // Возвращает имя текущего трейта. -// Возвращает только если испольщуется внутри трейта. +// Возвращает только если используется внутри трейта.  echo "Current namespace is " . __TRAIT__; @@ -771,7 +771,7 @@ echo "Current namespace is " . __TRAIT__;  *    */ -// Простую обработку ошибок можно произвести спомощью try catch блока. +// Простую обработку ошибок можно произвести с помощью try catch блока.  try {      // Выполняем что-то @@ -779,7 +779,7 @@ try {      // Обработка исключения  } -// При использовании try catch блока в области вилимости, стоит использовать +// При использовании try catch блока в области видимости, стоит использовать  // следующий подход:  try { @@ -788,7 +788,7 @@ try {      // Обработка исключения  } -// Специальное(кастомное) исключение - exceptions +// Специальное (кастомное) исключение - exceptions  class MyException extends Exception {} @@ -797,7 +797,7 @@ try {      $condition = true;      if ($condition) { -        throw new MyException('Something just happend'); +        throw new MyException('Something just happened');      }  } catch (MyException $e) { diff --git a/ru-ru/pyqt-ru.html.markdown b/ru-ru/pyqt-ru.html.markdown index 24afc03d..a7e14c02 100644 --- a/ru-ru/pyqt-ru.html.markdown +++ b/ru-ru/pyqt-ru.html.markdown @@ -11,7 +11,7 @@ translators:  **Qt** - широко известный кросс-платформенный фреймворк для разработки программного обеспечения,  который может быть использован на различных софтварных и хардварных платформах без какого-либо -изменения в коде. Данный фреймворк при этом обладает мощью и скоростью нативных приложений.  +изменения в коде. Данный фреймворк при этом обладает мощью и скоростью нативных приложений.  Qt и был изначально написан на *C++*.  Данный текст является адаптацией введения в Qt на C++ под авторством Алексея Ковальчука для pyqt. @@ -20,7 +20,7 @@ Qt и был изначально написан на *C++*.  ```python  def window(): -    # Создайте объект приложения  +    # Создайте объект приложения      app = QtGui.QApplication(sys.argv)      # Создайте виджет, где будет находиться наш лейбл      w = QtGui.QWidget() @@ -28,10 +28,10 @@ def window():      b = QtGui.QLabel(w)      # Задайте текст для лейбла      b.setText("Hello World!") -    # Задайте информация о размере и расположении  +    # Задайте информация о размере и расположении      w.setGeometry(100, 100, 200, 50)      b.move(50, 20) -    # Задайте заголовок окна  +    # Задайте заголовок окна      w.setWindowTitle("PyQt")      # Все ранее написанное выводится на экран      w.show() @@ -43,11 +43,11 @@ if __name__ == '__main__':  ``` -Для того, чтобы получить более продвинутые функции приложения в pyqt, нам необходимо  -обратить внимание на создание дополнительных элементов. Ниже представлено создание всплывающего диалогового окна, которое просит пользователя подтвердить его решение или предоставить какую-либо  +Для того чтобы получить более продвинутые функции приложения в pyqt, нам необходимо +обратить внимание на создание дополнительных элементов. Ниже представлено создание всплывающего диалогового окна, которое просит пользователя подтвердить его решение или предоставить какую-либо  информацию. -```Python  +```python  import sys  from PyQt4.QtGui import *  from PyQt4.QtCore import * @@ -67,7 +67,7 @@ def window():      w.show()      sys.exit(app.exec_()) -Данная функция должна создавать диалоговое окно с кнопкой, которая ждет клика по себе  +Данная функция должна создавать диалоговое окно с кнопкой, которая ждет клика по себе  и затем завершает программу.  def showdialog(): diff --git a/ru-ru/python-ru.html.markdown b/ru-ru/python-ru.html.markdown index e0e53b9c..e088593e 100644 --- a/ru-ru/python-ru.html.markdown +++ b/ru-ru/python-ru.html.markdown @@ -353,7 +353,6 @@ empty_set = set()  # Да, оно выглядит примерно как словарь. Ну извините, так уж вышло.  filled_set = {1, 2, 2, 3, 4}  # => {1, 2, 3, 4} -# Similar to keys of a dictionary, elements of a set have to be immutable.  # Как и ключи словаря, элементы множества должны быть неизменяемыми.  invalid_set = {[1], 1}  # => Выбрасывает ошибку TypeError: unhashable type: 'list'  valid_set = {(1,), 1} diff --git a/ru-ru/qt-ru.html.markdown b/ru-ru/qt-ru.html.markdown index 5fbcc3b4..15e2c775 100644 --- a/ru-ru/qt-ru.html.markdown +++ b/ru-ru/qt-ru.html.markdown @@ -80,7 +80,7 @@ int main(int argc, char *argv[]) {  ```  Обратите внимание на метод *QObject::connect*. Этот метод соединяет *СИГНАЛЫ* одного объекта со *СЛОТАМИ* другого. -**Сигналы** отправляются когда с объектами происходят отпределённые события, например, сигнал *нажатие* отправляется когда пользователь нажимает на объект типа QPushButton. +**Сигналы** отправляются когда с объектами происходят определённые события, например, сигнал *нажатие* отправляется, когда пользователь нажимает на объект типа QPushButton.  **Слоты** это *действия*, которые могут быть выполнены в ответ на полученные сигналы. diff --git a/ru-ru/sql-ru.html.markdown b/ru-ru/sql-ru.html.markdown index 7353a175..c7ba0edb 100644 --- a/ru-ru/sql-ru.html.markdown +++ b/ru-ru/sql-ru.html.markdown @@ -24,7 +24,7 @@ lang: ru-ru  Некоторые команды ниже предполагают использование  [демонстрационного образца базы данных сотрудников от MySQL](https://dev.mysql.com/doc/employee/en/), доступного на [Github](https://github.com/datacharmer/test_db).  Следовательно, для повторения команд в локальном окружении он должен быть загружен. -Файлы на github — это скрипты с командами, которые схожи с командами ниже, +Файлы на github — это скрипты с командами, схожие с командами ниже,  которые создают и манипулируют таблицами и данными о сотрудниках вымышленной  компании. Синтаксис для запуска этих скриптов будет зависеть от используемой  вами реализации SQL. Обычно используется утилита, запускаемая из командной @@ -50,7 +50,7 @@ SHOW DATABASES;  USE employees;  -- Выбрать все строки и колонки из таблицы «departments» (отделы) текущей базы. --- В интерактивном режиме обыч	но результат будет выведен на экран. +-- В интерактивном режиме обычно результат будет выведен на экран.  SELECT * FROM departments;  -- Тот же запрос, что и выше, но выбор только колонок «dept_no» и «dept_name». diff --git a/ru-ru/tmux-ru.html.markdown b/ru-ru/tmux-ru.html.markdown index aa7545cc..643c48b0 100644 --- a/ru-ru/tmux-ru.html.markdown +++ b/ru-ru/tmux-ru.html.markdown @@ -249,4 +249,4 @@ set -g status-right "#[fg=green] | #[fg=white]#(tmux-mem-cpu-load)#[fg=green] |  [Archlinux Wiki](https://wiki.archlinux.org/index.php/Tmux) -[Отображение CPU/MEM % в статусбаре](https://stackoverflow.com/questions/11558907/is-there-a-better-way-to-display-cpu-usage-in-tmux) +[Отображение CPU/MEM % в статус баре](https://stackoverflow.com/questions/11558907/is-there-a-better-way-to-display-cpu-usage-in-tmux) diff --git a/ru-ru/typescript-ru.html.markdown b/ru-ru/typescript-ru.html.markdown index 09bbb2d1..ad931599 100644 --- a/ru-ru/typescript-ru.html.markdown +++ b/ru-ru/typescript-ru.html.markdown @@ -9,8 +9,8 @@ translators:  filename: learntypescript-ru.ts  --- -TypeScript — это язык программирования, целью которого является лёгкая разработка широкомасштабируемых JavaScript-приложений. -TypeScript добавляет в Javascript общие концепции, такие, как классы, модули, интерфейсы, обобщённое программирование и (опционально) статическую типизацию.   +TypeScript — это язык программирования, целью которого является лёгкая разработка широко масштабируемых JavaScript-приложений. +TypeScript добавляет в Javascript общие концепции, такие как классы, модули, интерфейсы, обобщённое программирование и (опционально) статическую типизацию.    Это надмножество языка JavaScript: весь JavaScript-код является валидным TypeScript-кодом, следовательно, может быть добавлен бесшовно в любой проект.   Компилятор TypeScript генерирует JavaScript-код. diff --git a/ru-ru/vim-ru.html.markdown b/ru-ru/vim-ru.html.markdown index f43f99eb..60b381e7 100644 --- a/ru-ru/vim-ru.html.markdown +++ b/ru-ru/vim-ru.html.markdown @@ -10,7 +10,7 @@ lang: ru-ru  ---  [Vim](http://www.vim.org) -(Vi IMproved) это клон полулярного текстового редактора для Unix. Он разработан +(Vi IMproved) это клон популярного текстового редактора для Unix. Он разработан  с целью повышения скорости и продуктивности и повсеместно используется в   большинство Юникс-подобных систем. В нем имеется множество клавиатурных   сочетаний для быстрой навигации к определенным точкам в файле и быстрого  @@ -167,8 +167,8 @@ Vim можно рассматривать как набор команд в фо  ## Макросы  Макросы это просто записываемые действия. -Во время записи макросы запоминают **все** действия и команды до тех пор пока  -запись не будет остановлена.При вызове макрос применяет ту же самую последовательность  +Во время записи макросы запоминают **все** действия и команды до тех пор, пока  +запись не будет остановлена. При вызове макрос применяет ту же самую последовательность   действий и команд на выделенном тексте.  ``` diff --git a/ru-ru/xml-ru.html.markdown b/ru-ru/xml-ru.html.markdown index bf3f22b0..34e17b9b 100644 --- a/ru-ru/xml-ru.html.markdown +++ b/ru-ru/xml-ru.html.markdown @@ -15,7 +15,7 @@ XML - это язык разметки, предназначенный для х  * XML-Синтаксис  ```xml -<!-- Комментарии в XML выглядят вот так --> +<!-- Это комментарий. -->  <?xml version="1.0" encoding="UTF-8"?>  <bookstore> diff --git a/ru-ru/yaml-ru.html.markdown b/ru-ru/yaml-ru.html.markdown index ddaed2b6..693848fc 100644 --- a/ru-ru/yaml-ru.html.markdown +++ b/ru-ru/yaml-ru.html.markdown @@ -12,7 +12,7 @@ lang: ru-ru  YAML как язык сериализации данных предназначен прежде всего для использования людьми.  Это строгое надмножество JSON с добавлением синтаксически значимых переносов строк и  -отступов как в Python. Тем не менее, в отличие от Python, YAML запрещает  +отступов как в Python. Тем не менее в отличие от Python, YAML запрещает   использование табов для отступов.  ```yaml @@ -53,7 +53,7 @@ literal_block: |          Любые строки с большим отступом сохраняют остатки своего отступа -            эта строка будет содержать дополнительно 4 пробела.  folded_style: > -    Весь блок этого тектса будет значением 'folded_style', но в данном случае +    Весь блок этого текста будет значением 'folded_style', но в данном случае      все символы новой строки будут заменены пробелами.      Пустые строки будут преобразованы в перенос строки. @@ -76,7 +76,7 @@ a_nested_map:  0.25: a float key  # Ключи также могут быть сложными, например многострочными. -# Мы используем ? с последующим пробелом чтобы обозначить начало сложного ключа. +# Мы используем ? с последующим пробелом, чтобы обозначить начало сложного ключа.  ? |    Этот ключ    который содержит несколько строк @@ -124,7 +124,7 @@ base: &base    name: Каждый будет иметь одинаковое имя  # Регулярное выражение << называется ключом объединения независимо от типа языка. -# Он используется чтобы показать что все ключи одного или более словарей должны быть +# Он используется, чтобы показать что все ключи одного или более словарей должны быть  # добавлены в текущий словарь.  foo: &foo @@ -185,5 +185,5 @@ set2:  ### Больше информации -+ [YAML оффициальный вебсайт](http://yaml.org/) ++ [YAML официальный вебсайт](http://yaml.org/)  + [YAML онлайн валидатор](http://www.yamllint.com/) diff --git a/ru-ru/zfs-ru.html.markdown b/ru-ru/zfs-ru.html.markdown new file mode 100644 index 00000000..46a3fbb5 --- /dev/null +++ b/ru-ru/zfs-ru.html.markdown @@ -0,0 +1,406 @@ +--- +category: tool +tool: zfs +contributors: +    - ["sarlalian", "http://github.com/sarlalian"] +    - ["A1EF", "https://github.com/A1EF"] +filename: LearnZfs-ru.txt +translators: +    - ["A1EF", "https://github.com/A1EF"] +lang: ru-ru +--- + + +[ZFS](http://open-zfs.org/wiki/Main_Page) +представляет собой переосмысление системы хранения данных, комбинирующее в едином инструменте +традиционные файловые системы и системы управления томами. ZFS обладает некоторой специфичной +терминологией, которая отличает её от более традиционных систем хранения данных, однако имеет +отличный набор возможностей, акцентированных на удобстве использования системными администраторами. + + +## Концепции ZFS + +### Виртуальные устройства + +Виртуальное устройство (VDEV) подобно устройству RAID, представляемого RAID-контроллером. +Есть несколько типов виртуальных устройств (VDEV), которые предлагают различные преимущества, +включая отказоустойчивость и скорость доступа. В основном виртуальные устройства (VDEV) +предоставляют лучшую отказоустойчивость и безопасность, нежели RAID-контроллеры. Не рекомендуется +использовать установку RAID с ZFS, поскольку ZFS рассчитывает непосредственно управлять дисками. + +Типы виртуальных устройств (VDEV) + +* mirror (поддерживается n-кратное зеркалирование) +* raidz +	* raidz1 (1-диск четности, аналог RAID 5) +	* raidz2 (2-диска четности, аналог RAID 6) +	* raidz3 (3-диска четности, нет имеет аналогичного RAID-массива) +* disk +* file (не рекомендовано для промышленного применения из-за добавления нежелательного промежуточного слоя иной файловой системы) + +Ваши данные распределяются среди всех виртуальных устройств (VDEV), представленных в пуле хранения, +так что увеличив число виртуальных устройств (VDEV), вы увеличите количество IOPS. + +### Пулы хранения + +ZFS использует пулы хранения как абстракцию над нижним уровнем провайдера хранения (VDEV), позволяя вам отделить видимые пользователю +файловые системы от физического их размещения. + +### ZFS датасеты + +ZFS датасеты подобны традиционным файловым системам, но имеют гораздо больше возможностей, обеспечивающих обилие преимуществ ZFS. +Датасеты поддерживают [Copy on Write](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%B8_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B8), снапшоты, квоты, сжатие и дедубликацию. + + +### Ограничения + +Один каталог может содержать до 2^48 файлов, каждый до 16 эксабайт. Один пул хранения может содержать до 256 зеттабайт (2^78) данных +и может быть распределён по 2^64 устройствам. А один хост может иметь 2^64 пула хранения. Лимиты огромны. + + +## Команды + +### Пулы хранения + +Действия: + +* Просмотр +* Статус +* Удаление +* Получение/установка свойств + +Просмотр пулов + +```bash +# Создание пула типа raidz +$ zpool create zroot raidz1 gpt/zfs0 gpt/zfs1 gpt/zfs2 + +# Просмотр пулов +$ zpool list +NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT +zroot   141G   106G  35.2G         -    43%    75%  1.00x  ONLINE  - + +# Просмотр детализованной информации о конкретном пуле +$ zpool list -v zroot +NAME                                     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP HEALTH  ALTROOT +zroot                                    141G   106G  35.2G         -    43%    75%  1.00x ONLINE  - +  gptid/c92a5ccf-a5bb-11e4-a77d-001b2172c655   141G   106G  35.2G         -    43%    75% +``` + +Статус пулов + +```bash +# Получение информации о статусе пулов +$ zpool status +  pool: zroot + state: ONLINE +  scan: scrub repaired 0 in 2h51m with 0 errors on Thu Oct  1 07:08:31 2015 +config: + +        NAME                                          STATE     READ WRITE CKSUM +        zroot                                         ONLINE       0     0     0 +          gptid/c92a5ccf-a5bb-11e4-a77d-001b2172c655  ONLINE       0     0     0 + +errors: No known data errors + +# Скрабинг пула для исправления любых ошибок +$ zpool scrub zroot +$ zpool status -v zroot +  pool: zroot + state: ONLINE +  scan: scrub in progress since Thu Oct 15 16:59:14 2015 +        39.1M scanned out of 106G at 1.45M/s, 20h47m to go +        0 repaired, 0.04% done +config: + +        NAME                                          STATE     READ WRITE CKSUM +        zroot                                         ONLINE       0     0     0 +          gptid/c92a5ccf-a5bb-11e4-a77d-001b2172c655  ONLINE       0     0     0 + +errors: No known data errors +``` + +Свойства пулов + +```bash + +# Получение свойств пула, свойства могут быть заданы пользователем или системой. +$ zpool get all zroot +NAME   PROPERTY                       VALUE                          SOURCE +zroot  size                           141G                           - +zroot  capacity                       75%                            - +zroot  altroot                        -                              default +zroot  health                         ONLINE                         - +... + +# Установка значения свойства пула +$ zpool set comment="Storage of mah stuff" zroot +$ zpool get comment +NAME   PROPERTY  VALUE                 SOURCE +tank   comment   -                     default +zroot  comment   Storage of mah stuff  local +``` + +Удаление пула + +```bash +$ zpool destroy test +``` + + +### Датасеты + +Действия: + +* Создание +* Просмотр +* Переименование +* Удаление +* Получение/установка свойств + +Создание датасетов + +```bash +# Создание датасета +$ zfs create zroot/root/data +$ mount | grep data +zroot/root/data on /data (zfs, local, nfsv4acls) + +# Создание дочернего датасета +$ zfs create zroot/root/data/stuff +$ mount | grep data +zroot/root/data on /data (zfs, local, nfsv4acls) +zroot/root/data/stuff on /data/stuff (zfs, local, nfsv4acls) + + +# Создание тома +$ zfs create -V zroot/win_vm +$ zfs list zroot/win_vm +NAME                 USED  AVAIL  REFER  MOUNTPOINT +zroot/win_vm         4.13G  17.9G    64K  - +``` + +Просмотр датасетов + +```bash +# Просмотр всех датасетов +$ zfs list +NAME                                                                       USED  AVAIL  REFER  MOUNTPOINT +zroot                                                                      106G  30.8G   144K  none +zroot/ROOT                                                                18.5G  30.8G   144K  none +zroot/ROOT/10.1                                                              8K  30.8G  9.63G  / +zroot/ROOT/default                                                        18.5G  30.8G  11.2G  / +zroot/backup                                                              5.23G  30.8G   144K  none +zroot/home                                                                 288K  30.8G   144K  none +... + +# Просмотр конкретного датасета +$ zfs list zroot/home +NAME         USED  AVAIL  REFER  MOUNTPOINT +zroot/home   288K  30.8G   144K  none + +# Просмотр снапшотов +$ zfs list -t snapshot +zroot@daily-2015-10-15                                                                  0      -   144K  - +zroot/ROOT@daily-2015-10-15                                                             0      -   144K  - +zroot/ROOT/default@daily-2015-10-15                                                     0      -  24.2G  - +zroot/tmp@daily-2015-10-15                                                           124K      -   708M  - +zroot/usr@daily-2015-10-15                                                              0      -   144K  - +zroot/home@daily-2015-10-15                                                             0      -  11.9G  - +zroot/var@daily-2015-10-15                                                           704K      -  1.42G  - +zroot/var/log@daily-2015-10-15                                                       192K      -   828K  - +zroot/var/tmp@daily-2015-10-15                                                          0      -   152K  - +``` + +Переименование датасетов + +```bash +$ zfs rename zroot/root/home zroot/root/old_home +$ zfs rename zroot/root/new_home zroot/root/home +``` + +Удаление датасета + +```bash +# Датасеты не могут быть удалены, если у них имеются какие-то снапшоты +$ zfs destroy zroot/root/home +``` + +Получение / установка свойств датасета + +```bash +# Получение всех свойств +$ zfs get all zroot/usr/home +NAME            PROPERTY              VALUE                  SOURCE +zroot/home      type                  filesystem             - +zroot/home      creation              Mon Oct 20 14:44 2014  - +zroot/home      used                  11.9G                  - +zroot/home      available             94.1G                  - +zroot/home      referenced            11.9G                  - +zroot/home      mounted               yes                    - +... + +# Получения свойства для датасета +$ zfs get compression zroot/usr/home +NAME            PROPERTY     VALUE     SOURCE +zroot/home      compression  off       default + +# Установка значения свойства на датасете +$ zfs set compression=lz4 zroot/lamb + +# Получение значений выбранных свойств всех датасетов +$ zfs list -o name,quota,reservation +NAME                                                               QUOTA  RESERV +zroot                                                               none    none +zroot/ROOT                                                          none    none +zroot/ROOT/default                                                  none    none +zroot/tmp                                                           none    none +zroot/usr                                                           none    none +zroot/home                                                          none    none +zroot/var                                                           none    none +... +``` + + +### Снапшоты + +ZFS снапшоты -- одна из очень важных особенностей zfs + +* Место, которое они занимают, равно разнице данных между файловой системой и её снапшотом +* Время создания занимает считанные секунды +* Восстановление настолько быстро, насколько позволяет вам запись данных +* Они очень просты в автоматизации + +Действия: + +* Создание +* Удаление +* Переименование +* Получение доступа к снапшотам +* Отправка / Получение +* Клонирование + + +Создание снапшотов + +```bash +# Создание снапшота единственного датасета +zfs snapshot zroot/home/sarlalian@now + +# Создание снапшота для родительского и дочерних датасетов +$ zfs snapshot -r zroot/home@now +$ zfs list -t snapshot +NAME                       USED  AVAIL  REFER  MOUNTPOINT +zroot/home@now                 0      -    26K  - +zroot/home/sarlalian@now       0      -   259M  - +zroot/home/alice@now           0      -   156M  - +zroot/home/bob@now             0      -   156M  - +... +``` + +Удаление снапшотов + +```bash +# Как удалить снапшот +$ zfs destroy zroot/home/sarlalian@now + +# Удаление снапшота в родительском и дочерних датасетах +$ zfs destroy -r zroot/home/sarlalian@now + +``` + +Переименование снапшотов + +```bash +# Переименование снапшота +$ zfs rename zroot/home/sarlalian@now zroot/home/sarlalian@today +$ zfs rename zroot/home/sarlalian@now today + +$ zfs rename -r zroot/home@now @yesterday +``` + +Получение доступа к спапшотам + +```bash +# CD в каталог снапшота +$ cd /home/.zfs/snapshot/ +``` + +Отправка и получение + +```bash +# Сохранение снапшота в файл +$ zfs send zroot/home/sarlalian@now | gzip > backup_file.gz + +# Отправка снапшота в другой датасет +$ zfs send zroot/home/sarlalian@now | zfs recv backups/home/sarlalian + +# Отправка снапшота на удаленный хост +$ zfs send zroot/home/sarlalian@now | ssh root@backup_server 'zfs recv zroot/home/sarlalian' + +# Отправка полного датасета со снапшотами на новый хост +$ zfs send -v -R zroot/home@now | ssh root@backup_server 'zfs recv zroot/home' +``` + +Клонирование снапшотов + +```bash +# Клонирование снапшота +$ zfs clone zroot/home/sarlalian@now zroot/home/sarlalian_new + +# Повышение клона, чтобы он больше не зависел от снапшота +$ zfs promote zroot/home/sarlalian_new +``` + +### Собираем всё вместе + +Нижеследующий скрипт использует FreeBSD, jails и ZFS для автоматизации +подготовки чистой копии стейджинговой базы mysql с живой реплики слейв-ноды. + +```bash +#!/bin/sh + +echo "==== Остановка стейджингового сервера баз данных ====" +jail -r staging + +echo "==== Очистка существующих стейджингового сервера и снапшота ====" +zfs destroy -r zroot/jails/staging +zfs destroy zroot/jails/slave@staging + +echo "==== Фиксация базы на слейве ====" +echo "FLUSH TABLES WITH READ LOCK;" | /usr/local/bin/mysql -u root -pmyrootpassword -h slave + +echo "==== Сохранение снапшота файлов базы слейва как zroot/jails/slave@staging ====" +zfs snapshot zroot/jails/slave@staging + +echo "==== Запуск слейв-ноды сервера баз данных ====" +jail -c slave + +echo "==== Клонирование снапшота слейва на стейджинговый сервер ====" +zfs clone zroot/jails/slave@staging zroot/jails/staging + +echo "==== Установка конфига стейджингово mysql ====" +mv /jails/staging/usr/local/etc/my.cnf /jails/staging/usr/local/etc/my.cnf.slave +cp /jails/staging/usr/local/etc/my.cnf.staging /jails/staging/usr/local/etc/my.cnf + +echo "==== Настройка стейджингового файла rc.conf ====" +mv /jails/staging/etc/rc.conf.local /jails/staging/etc/rc.conf.slave +mv /jails/staging/etc/rc.conf.staging /jails/staging/etc/rc.conf.local + +echo "==== Запуск стейджингово сервера баз данных ====" +jail -c staging + +echo "==== Отключение синхронизации стейджинговой базы с мастером ====" +echo "STOP SLAVE;" | /usr/local/bin/mysql -u root -pmyrootpassword -h staging +echo "RESET SLAVE;" | /usr/local/bin/mysql -u root -pmyrootpassword -h staging +``` + + +### Почитать дополнительно + +* [BSDNow's Crash Course on ZFS](http://www.bsdnow.tv/tutorials/zfs) +* [FreeBSD Handbook on ZFS](https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/zfs.html) +* [BSDNow's Crash Course on ZFS](http://www.bsdnow.tv/tutorials/zfs) +* [Oracle's Tuning Guide](http://www.oracle.com/technetwork/articles/servers-storage-admin/sto-recommended-zfs-settings-1951715.html) +* [OpenZFS Tuning Guide](http://open-zfs.org/wiki/Performance_tuning) +* [FreeBSD ZFS Tuning Guide](https://wiki.freebsd.org/ZFSTuningGuide) | 
