Docker

Запуск сервера Nginx на порту 8090 с помощью Docker

docker run -it --rm -d -p 8090:80 --name my-nginx-container nginx

Опции:
-d (Detached mode) Запуск контейнер в фоновом режиме. Это позволяет использовать терминал, из которого запущен контейнер, для выполнения других команд во время работы контейнера.
--rm автоматическое удаление контейнера после завершения его работы.
-t предоставляет доступ к терминалу внутри контейнера.
-i делает возможным взаимодействие с терминалом внутри контейнера.
--name my-nginx-container устанавливаем имя контейнера my-nginx-container
-p 8090:80 говорим что порт 8090 на хост машине должен прокидывает все на порт 80 в контейнер

Инструменты для маркетинга

Для создания баннеров и видео для размещения в соц сетях:

https://www.bannersnack.com/
https://crello.com/ru/
https://supa.ru/

https://pressfeed.ru/ — сервис для работы со СМИ. Выступайте в качестве эксперта и получаете упоминание и ссылку

Принудительно добавить слэш в конце URL через .htaccess

Чтобы сделать постоянный редирект с адреса типа

https://example.com/page

на адрес

https://example.com/page/

Воспользуемся следующим правилом которое прописываем в файлике .htaccess

Принудительно добавить слэш в конце URL через .htaccess

Установить платежные данные для использования API от Google

Гугл с недавнего времени (с 2018г) чтобы использовать их сервисы, например Maps JavaScript API, просит зарегистрироваться в Google Cloud Platform и ввести платежные данные.

Регистрация в google_gcp

И что интересно, по умолчанию стоит «Бизнес» аккаунт, и изменить его на «Индивидуальный» нельзя. Странно все это..

Убрать лишние миниатюры в WordPress (1536, 2048, medium, large, medium_large)

По умолчанию новая версия WordPress (5.3) делает множество миниатюр, которые могут быть просто не нужны. Следующий код добавленный в Function.php вашей темы позволяет от них избавиться и оставить только thumbnail

function filter_image_sizes( $sizes) {
  unset( $sizes['1536x1536']); // disable 2x medium-large size
  unset( $sizes['2048x2048']); // disable 2x large size
  unset( $sizes['large']);
    unset( $sizes['medium']);
    unset( $sizes['medium_large']);
  return $sizes;
}
add_filter('intermediate_image_sizes_advanced', 'filter_image_sizes');

 

Задать размер миниатюры thumbnail можно через админку

Убрать лишние миниатюры в WordPress (1536, 2048, medium, large, medium_large)

Изменить пользователя в linux

Команда в консоле для смены пользователя папки или файла

Рекурсивно:

chown -R newname:newgroup directory/

А здесь и смена прав и смена пользователя рекурсивно:

chown -R www-root:www-root /var/www/www-root/data/www/domain.com/
chmod -R 777 /var/www/www-root/data/www/domain.com/

 

Инструменты для разработки и анализа сайтов

Внешний Дизайн

Figma.com — онлайн редактор для прототипирования шаблона
dribbble.com — коллекция трендового дизайна. Чтобы ориентироваться как сейчас актуально делать
Grig.guide — позволяет визуально подобрать базовую сетку для сайта
Colorhunt.co — подобранные цветовые сочетания для быстрого выбора цвета фона, футера, шапки

https://tools.webdevpuneet.com/css-text-shadow-generator/ — онлайн инструменты

шрифты удобно подбирать на https://gwfh.mranftl.com/fonts/montserrat?subsets=cyrillic,latin google-webfonts-helper.herokuapp.com собрал все шрифты предоставляемые гугл.фонт в удобном для скачки виде. Связка eot, ttf, svg, woff и woff2 файлов (т.е. отображение всеми популярными браузерами), а также готовое CSS описание в одном архиве.
Инструменты для разработки и анализа сайтов

Букмарклеты

Букмарклет (англ. bookmarklet; bookmark — «закладка» и applet — «апплет») — небольшая JavaScript-программа, оформленная как javascript: URL и сохраняемая как браузерная закладка.

Инструкция по использованию (видео демонстрация). Коротко: 1) перетаскиваем ссылку на панель закладок; 2) нажимаем соответствующую закладку для совершения определенного действия.

Букмарклеты

Фиксированный (липкий) блок при прокрутке

Небольшой код на JavaScript позволяет сделать на странице фиксированный/липкий(sticky) блок

function getTopOffset(e) { 
    var y = 0;
    do { y += e.offsetTop; } while (e = e.offsetParent);
    return y;
}
var block = document.getElementById('fixblock'); /* fixblock - значение атрибута id блока */
if ( null != block ) {
    var topPos = getTopOffset( block );

    window.onscroll = function() {
  var scrollHeight = Math.max( document.documentElement.scrollHeight, document.documentElement.clientHeight),

      // высота рекламного блока
      blockHeight = 450,

      // высота подвала
      footerHeight =  250, 

      // считаем позицию, до которой блок будет зафиксирован 
      stopPos = scrollHeight - blockHeight - footerHeight; 

  var newcss = (topPos < window.pageYOffset) ? 
      'margin-left: 25px; top: 5px; position: fixed;' : 'position:static;';

  if ( window.pageYOffset > stopPos ) 
      newcss = 'position:static;';

  block.setAttribute( 'style', newcss );
    }
}

 

 

Перенаправление на с http на https. Варианты через nginx и htaccess

С помощью .htaccess

Options +FollowSymLinks
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

С помощью Nginх

Нужно добавить одну строку в настройки вашего nginx сервера.  Обычное место расположения файлов конфигурации nginx: /etc/nginx/vhosts/

Открываем файл конфигурации и вносим следующу строку (естественно заменив sitename.ru на ваш сайт)в настройку сервера который слушает порт 80:

return 301 https://sitename.ru$request_uri;

301 код ответа сервера для редиректа (напомним код 301- означат перемещен перманентно)

Также нужно убедиться что, есть настройки для обработки запроса через порт 443 ssl. Шаблон конфигурации представлен ниже:

server {



listen 123.123.123.123:80;
return 301 https://sitename.ru$request_uri;
}
server {



listen 123.123.123.123:443 ssl;
}

Исходная css нормализация для WordPress

Версия 1.0 Для кастомной темы HSTR

/*--------------------------------------------------------------
# Normalize based on 
--------------------------------------------------------------*/
/*not important tags normalization*/
abbr[title] {border-bottom: 1px dotted;}
b,strong {font-weight: bold;}
dfn {font-style: italic;}
mark {background: #ff0;	color: #000;}
small {font-size: 80%;}
sub,sup {font-size: 75%;	line-height: 0;	position: relative;	vertical-align: baseline;}
sup {top: -0.5em;}
sub {bottom: -0.25em;}
svg:not(:root) {	overflow: hidden;}
figure {margin: 1em 40px;}
hr {box-sizing: content-box;height: 0;}
pre {overflow: auto;}
code,kbd,pre,samp {font-family: monospace, monospace;font-size: 1em;}
fieldset {border: 1px solid #c0c0c0;margin: 0 2px;	padding: 0.35em 0.625em 0.75em;}
legend {border: 0;padding: 0;}
optgroup {font-weight: bold;}
article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary {	display: block;}
audio,canvas,progress,video {	display: inline-block;	vertical-align: baseline;}
audio:not([controls]) {	display: none;	height: 0;}
[hidden],template {	display: none;}
dfn, cite, em, i {	font-style: italic;}
blockquote {margin: 0 1.5em;}
address {margin: 0 0 1.5em;}
pre {background: #eee;font-family: "Courier 10 Pitch", Courier, monospace;font-size: 15px;font-size: 0.9375rem;line-height: 1.6;margin-bottom: 1.6em;max-width: 100%;overflow: auto;padding: 1.6em;}
code, kbd, tt, var {font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace;font-size: 15px;font-size: 0.9375rem;}
abbr, acronym {border-bottom: 1px dotted #666;cursor: help;}
mark, ins {background: #fff9c0;text-decoration: none;}
big {font-size: 125%;}
blockquote, q {quotes: "" "";}
blockquote:before, blockquote:after, q:before, q:after {content: "";}
hr {background-color: #ccc;border: 0;height: 1px;margin-bottom: 1.5em;}
dt {font-weight: bold;}
dd {margin: 0 1.5em 1.5em;}
figure {margin: 1em 0;}
/*forms and buttons*/
button,input[type="button"],input[type="reset"],input[type="submit"] {border: 1px solid;border-color: #ccc #ccc #bbb;border-radius: 3px;background: #e6e6e6;color: rgba(0, 0, 0, 0.8);font-size: 12px;font-size: 0.75rem;line-height: 1;padding: .6em 1em .4em;}
button:hover,input[type="button"]:hover,input[type="reset"]:hover,input[type="submit"]:hover {border-color: #ccc #bbb #aaa;}
button:active, button:focus,input[type="button"]:active,input[type="button"]:focus,input[type="reset"]:active,input[type="reset"]:focus,input[type="submit"]:active,input[type="submit"]:focus {border-color: #aaa #bbb #bbb;}
input[type="text"],input[type="email"],input[type="url"],input[type="password"],input[type="search"],input[type="number"],input[type="tel"],input[type="date"],input[type="month"],input[type="week"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="color"],textarea {color: #666;border: 1px solid #ccc;border-radius: 3px;padding: 3px;}
input[type="text"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="password"]:focus,input[type="search"]:focus,input[type="number"]:focus,input[type="tel"]:focus,input[type="range"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="week"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="color"]:focus,textarea:focus {color: #111;}
input[type="range"] {color: #fff;height:20px;border-radius: 8px;background:-webkit-gradient(linear,center top, center bottom, from(#CFDCDD),to(#DFE9EA),color-stop(50%,#DFE9EA));}
select {	border: 1px solid #ccc;}
textarea {width: 100%; overflow: auto;}
button,input,optgroup,select,textarea {color: inherit;font: inherit;margin: 0;}
button {overflow: visible;}
button,select {text-transform: none;}
button,html input[type="button"],input[type="reset"],input[type="submit"] {-webkit-appearance: button;	cursor: pointer;}
button[disabled],html input[disabled] {cursor: default;}
button::-moz-focus-inner,input::-moz-focus-inner {	border: 0;	padding: 0;}
input {	line-height: normal;}
input[type="checkbox"],input[type="radio"] {	box-sizing: border-box;	padding: 0;}
input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button {height: auto;}
input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration {-webkit-appearance: none;}
/*Main tags normalization*/
*,*:before,*:after {	box-sizing: inherit;/* Inherit box-sizing to make it easier to change the property for components that leverage other behavior; see http://css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice/ */}
html {font-family: sans-serif;-webkit-text-size-adjust: 100%;-ms-text-size-adjust: 100%; box-sizing: border-box;}
body {margin: 0; background: #fff;}
body,button,input,select,optgroup,textarea {	color: #404040;	font-family: Arial, sans-serif;	font-size: 16px;line-height: 1.5;}
a {	background-color: transparent;}
a:active,a:hover {outline: 0;}
a {color: royalblue;}
a:visited {color: royalblue;}
a:hover, a:focus, a:active {color: midnightblue;}
a:focus {outline: thin dotted;}
a:hover, a:active {outline: 0;}
h1 {	font-size: 2em;	margin: 0.67em 0;}
h1, h2, h3, h4, h5, h6 {clear: both;}
img {border: 0; height: auto;max-width: 100%;}
table {border-collapse: collapse;border-spacing: 0; margin: 0 0 1.5em;width: 100%;}
td,th {	padding: 0;}
p {margin-bottom: 1.5em;}
ul, ol {margin: 0 0 1.5em 3em;}
ul {list-style: disc;}
ol {list-style: decimal;}
li > ul,li > ol {margin-bottom: 0;margin-left: 1.5em;}



/*WP default HSTR styles*/
.site-main .comment-navigation, .site-main .posts-navigation, .site-main .post-navigation {margin: 0 0 1.5em;overflow: hidden;}
.comment-navigation .nav-previous, .posts-navigation .nav-previous,.post-navigation .nav-previous {float: left;width: 50%;}
.comment-navigation .nav-next, .posts-navigation .nav-next, .post-navigation .nav-next {	float: right;	text-align: right;	width: 50%;}
/* Accessibility - Text meant only for screen readers. */
.screen-reader-text {clip: rect(1px, 1px, 1px, 1px);position: absolute !important;height: 1px;width: 1px;overflow: hidden;word-wrap: normal !important;}
.screen-reader-text:focus {background-color: #f1f1f1;border-radius: 3px;box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6);clip: auto !important;color: #21759b;display: block;font-size: 14px;font-size: 0.875rem;font-weight: bold;height: auto;left: 5px;line-height: normal;padding: 15px 23px 14px;text-decoration: none;top: 5px;width: auto;z-index: 100000;	/* Above WP toolbar. */}
#content[tabindex="-1"]:focus {	outline: 0;} /* Do not show the outline on the skip link target. */
/* Alignments*/
.alignleft {display: inline;float: left;margin-right: 1.5em;}
.alignright {display: inline;float: right;margin-left: 1.5em;}
.aligncenter {clear: both;display: block;margin-left: auto;margin-right: auto;}
/*Clearings*/
.clear:before,.clear:after,.entry-content:before,.entry-content:after,.comment-content:before,.comment-content:after,.site-header:before,.site-header:after,.site-content:before,.site-content:after,.site-footer:before,.site-footer:after {content: "";display: table;	table-layout: fixed;}
.clear:after,.entry-content:after,.comment-content:after,.site-header:after,.site-content:after,.site-footer:after {	clear: both;}
/* Widgets */
.widget {margin: 0 0 1.5em;}
.widget select {max-width: 100%;}
/* Posts and pages */
.sticky {display: block;}
.hentry {margin: 0 0 1.5em;}
.updated:not(.published) {display: none;}
.page-content,.entry-content,.entry-summary {margin: 1.5em 0 0;}
.page-links {clear: both;margin: 0 0 1.5em;}
/* Comments*/
.comment-content a {word-wrap: break-word;}
.bypostauthor {display: block;}
/* Infinite scroll*/
/*Globally hidden elements when Infinite Scroll is supported and in use. */
.infinite-scroll .posts-navigation,.infinite-scroll.neverending .site-footer {/* Theme Footer (when set to scrolling) */display: none;}
/* When Infinite Scroll has reached its end we need to re-display elements that were hidden (via .neverending) before. */
.infinity-end.neverending .site-footer {display: block;}
/* Media */
.page-content .wp-smiley,.entry-content .wp-smiley,.comment-content .wp-smiley {border: none;margin-bottom: 0;margin-top: 0;padding: 0;}
/* Make sure embeds and iframes fit their containers. */
embed,iframe,object {	max-width: 100%;}
/* Make sure logo link wraps around logo image. */
.custom-logo-link {	display: inline-block;}
/* Captions */
.wp-caption {margin-bottom: 1.5em;max-width: 100%;}
.wp-caption img[class*="wp-image-"] {display: block;margin-left: auto;margin-right: auto;}
.wp-caption .wp-caption-text {margin: 0.8075em 0;}
.wp-caption-text {text-align: center;}

 

Сама тема hstr

Свой дизайн комментариев в WordPress

Чтобы изменить стандартный дизайн комментариев в движке WordPress часто необходимо подправить html код который генерирует движок.

Переводим листинг комментов wp_list_comments на свою функцию hstr_comment:

[php]<ul class=»comment-list»>
<?php
wp_list_comments( ‘type=comment&callback=hstr_comment’ );
?>
</ul><!— .comment-list —>[/php]

А в этой функции

В файле functions.php добавляем свою функцию:

[php]

function hstr_comment($comment, $args, $depth) {
$GLOBALS[‘comment’] = $comment; ?>

<li <?php comment_class(); ?> id=»comment-<?php comment_ID(); ?>» >

<div class=»comment-author vcard»>
<div class=»comment_avatar»><?php echo get_avatar($comment, $size=’48’ ); ?></div>

<?php printf(__(‘<span class=»fn»>%s</span>’), get_comment_author_link()) ?><br />
<span class=»comment-meta commentmetadata»><a href=»<?php echo htmlspecialchars( get_comment_link( $comment->comment_ID ) ) ?>»><?php printf(__(‘# %1$s O %2$s’), get_comment_date(), get_comment_time()) ?></a> <?php edit_comment_link(__(‘(Edit)’),’ ‘,») ?></span>
<br class=»clear» />
</div>

<?php // if ($comment->comment_approved == ‘0’){echo ‘<em>Ваш комментарий ожидает проверки</em>’;} ?>

<?php comment_text() ?>

<div class=»reply»>
<?php comment_reply_link(array_merge( $args, array(‘depth’ => $depth, ‘max_depth’ => $args[‘max_depth’]))) ?>
</div>

<?php
}

[/php]

 

Не забываем подправить css

 

[css]

.comment-content a {
word-wrap: break-word;
}
.comment-meta a{text-decoration:none;}

.bypostauthor {
display: block;
}

.comment_avatar {float:left; margin-right:15px;}

.comment-author:after{ content: «»;
display: table;
table-layout: fixed; clear:both; }

.comment {margin:0px 0px 50px 0px;}

.reply{ line-height:0px;}

.comment .fn { font-size:26px; line-height:0px; font-style:normal;}

.children { margin:40px 0px 0px 40px;}

[/css]

putty — не верное отображение символов в MC — qqqqqq

Часто бывает что при заходе на сервер через Putty встречаешь «аброкадабру» вместо букв в Midnight Commander (MC) или неверное отображение псевдографики (линии отображаются qqqqqqqqqqq…) Обычно это решается выставлением правильной кодировки в настройках Putty:

Window -> Translation -> Remote character set

Устанавливаем ту же кодировку что и на удаленном сервере. Обычно это UTF-8

Чтобы узнать какая кодировка используется на сервере вводим ssh команду:

locale

В ответ сервер выдает что-то типа:

LANG=ru_RU.UTF-8
LC_CTYPE=»ru_RU.UTF-8″
LC_NUMERIC=»ru_RU.UTF-8″
LC_TIME=»ru_RU.UTF-8″
LC_COLLATE=»ru_RU.UTF-8″
LC_MONETARY=»ru_RU.UTF-8″
LC_MESSAGES=»ru_RU.UTF-8″
LC_PAPER=»ru_RU.UTF-8″
LC_NAME=»ru_RU.UTF-8″
LC_ADDRESS=»ru_RU.UTF-8″
LC_TELEPHONE=»ru_RU.UTF-8″
LC_MEASUREMENT=»ru_RU.UTF-8″
LC_IDENTIFICATION=»ru_RU.UTF-8″
LC_ALL=

Это значит что кодировка используемая в консоли ru_RU.UTF-8. Выставляем в Putty UTF-8 и все должно заработать нормально.

Однако бывает что в ответ на команду locale сервер выдает:

LC_CTYPE=»POSIX»
LC_NUMERIC=»POSIX»
LC_TIME=»POSIX»
LC_COLLATE=»POSIX»
LC_MONETARY=»POSIX»
LC_MESSAGES=»POSIX»
LC_PAPER=»POSIX»
LC_NAME=»POSIX»
LC_ADDRESS=»POSIX»
LC_TELEPHONE=»POSIX»
LC_MEASUREMENT=»POSIX»
LC_IDENTIFICATION=»POSIX»
LC_ALL=

Это значит что локаль на сервере не настроена.

Чтобы посмотреть предустановленые локали:

locale -a | grep ru

Сервер выдаст что-то типа:

ru_RU
ru_RU.iso88595
ru_RU.koi8r
ru_RU.utf8

Видим что необходимая локаль есть ru_RU.utf8

Чтобы настроить использование ее в консоли создаем файл /etc/sysconfig/i18n командой:

touch /etc/sysconfig/i18n

После чего в файл пишем следующие строки:

LANG=»ru_RU.UTF-8″
SUPPORTED=»ru_RU.UTF-8:ru_RU:ru»
SYSFONT=»latarcyrheb-sun16″

Сохраняем файл и выходим из консоли. Заходим снова. И наблюдаем что всее символы отображаются корректно.

Если при использовании команды

locale -a | grep ru

в списке нет необходимой локали. То нужно ее установить командой:

localedef -i ru_RU -f UTF-8 ru_RU.UTF-8

Эта команда извлечет из папки /usr/share/i18n/charmaps файл UTF-8.gz (символьная карта для юникода) и сгенерирует нужный нам файл ru_RU.UTF-8

Нормализация CSS

Добиться одинаковости отображения сайтов различными браузерами можно двумя способами:

1. Стереть все стили(которые используются в браузерах по умолчанию) и далее с чистого листа писать новые — так называемый резет;
2. Нормализовать стили — сделать похожим отображение большинства элементов html, сохраняя полезные свойства браузеров и не обнуляя их.

Хороший код нормализации CSS который используют Twitter, GitHub, Guardian, Bootstrap, Pure и др. это Normalize.css

Это хорошая основа для написания собственных стилей..или просто как дополнение для коссбраузерности уже существующих стилей.