CategoryIT Stuff

NAS у нас

Тези с които разговарям напоследък сигурно им е писнало от темата, НО най-накрая се навих да си направя home NAS проекта, който мислих толкова време. В нас при разчистването се оказа, че имам 10 диска (don’t ask…) повечето от които от по 1ТБ. Първо ги бях пуснал в hardwarebg и olx, но при слабия интерес реших да ползвам каквото имам и ето, че в тестова среда имам една много прилична конфигурация с Xeon E3-1225 V2, 16 ГБ ECC рам, 7 диска (от които два са в mirror 4 са в raidz1 и един системен, който скоро време трябва да ъпгрейдна на SSD. Всичко това се търкаля на FreeNAS, който е базиран на FreeBSD, което е чудесен момент да мога да се докосна в света на BSD.
Цялото това нещо го набухах в едно Lenovo E31 с малък хак за захранването, защото оригиналното е 280W и имайки предвид, че процесора е с TPD 95W, 7 диска по средно 20W без да смятаме RAM, дънна платка и т.н. така, че един 400W Fortron свърши чудесна работа.

Цялата машина е супер студена, при няколкодневна работа процесора не се качи на повече от 36 градуса, макар, че съм длъжен да отбележа, че през повече време беше idle.

Ето и как изглеждат за сега zpool-овете ми:

nedko@freenas[~]# zpool list
NAME           SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
Mirror-1.5TB  1.36T  20.5G  1.34T        -         -     0%     1%  1.00x  ONLINE  /mnt
RaidZ-3TB     3.62T  27.4M  3.62T        -         -     0%     0%  1.00x  ONLINE  /mnt
freenas-boot   912G  36.0G   876G        -         -     0%     3%  1.00x  ONLINE  -

Те така. Скоро след като вкарам машината в production ще пиша по-подробно, зщаото темата е мега интересна, а сега с тези евтини workstations (защото Xeon + ecc memory не е излишна екстра особено зa zfs) + 3 диска по 4 ТБ например можете да си разрешите проблемите за няколко години напред.

От тук нататък опциите са всевъзможни като едно от първите неща, които смятам да направя е да заменя моя backup script, който fork-нах преди време с по-сериозен solution като rsync, duplicity, bacula или нещо друго, ще видим тестовете какво ще кажат.

06.04.2020 – Занимавки по време на чума

Значи таз чума трябва да я разкарам от заглавията си, но пък звучи добре, деба. Имам един огромен списък с неща, които искам да споделя с вас, но това май ще стане в отделен пост.

Понеже живеем в tricky времена смятам, че една рубрика с хубави новини няма да навреди на мрачното настроение на блога.

Иначе последните седмици откакто е и извънредното положение работим заедно със Златина в нас. В началото беше малко на нож работата, но след ден-два всеки си намери мястото в къщата, темпото на работа и научихме кой кога има срещи та да не си пречим един-друг.
И като цяло моето ежедневие не се променя много освен, че не ходя да жуля Costa през ден и не се прибираме да се видим с моите и на Златина родителите.
В нас се скъсвам да слушам Leo, вече се опитвам всячески да филтрирам на 95% коронавирус новините, защото ми писна. А във фейсбук е някаква порнография – всеки излезе вирусолог и честно казано обмислям дали да не си деактивирам акаунта.

Иначе в офиса нещата са добре – последно време уач Ruby и ползвам безплатните уроци на CodeCademy и съм доста доволен.

И ако сте забелязали някакво подобрение на зареждането на блога то това е, че ми мина през ума съвсем скоро да проверя през Google Speed колко точки имам, защото ми се стори, че малко бавно ми зарежда началната страница. Отварям и очаквам 75-80 и БАМ – 28 точки. И като излязоха едни змии и гущери (както пя Керанов). Например при embed на youtube клип по някаква причина зареждам от YouTube JS, който се зарежда ВСЕКИ ПЪТ при всеки embed. И при все, че в предната статия имам 5-6 видеа YT зарежда JS с размер от 1 МБ (!!) на клип или 5-6 МБ в JS. Как е, а?
Та започнах да мисля стратегия – gzip по някака причина ПАК не е разрешен, обвинявам ISPConfig за това, защото имам спомен, че го оправях вече веднъж, после JS minification, но направих стъпка назад и се замислих, че проблема ми е основно в снимките и видеата. И реших проблема с един lazy load плъгин. После, защото няма как да е лесно, нали, се наложи да тествам 6-7 плъгина докато стигна до един, който просто прави lazy load без да ми чупи дизайна или да ми предлага по доста интрузивен начин да мина на про план (за lazy load, yea).

Та така де – след малко тихо псуване си харесах a3 Lazy Load, който като цяло е прост, прави това, което искам и е сравнително конфигурируем.

Не казвам, че това е най-гениалния начин за фиксване на производителността на един WP, но за моя върши работа.
Ето и преди/след:

Сега остана и да започна пак да пиша често в него…

27.07.2019 – 6/7

Преди няколко дни ходих да карам за да компенсирам неделята в която се скатах. Този път реших да завъртя до Аладжа Манастир, който е на 10-тина км. от Варна.

И понеже основно започвам с баири (както писах в предните си гърчописи) последната седмица тук маршрута е доста по-лек в началото (и като цяло). Синхронизирах се май с траковете, които Spotify ми пусна от моята прелесна плейлиста и честно казано се изкъртих. Каданса ми по някакво чудо беше точно толкова, колкото ми се искаше стисках силно кормилото и дишах често. Мислих си разни неща, пот ми влизаше в очите, но тогава беше един от малкото моменти в които нищо не може да ме разконцентрира. Гледха стръвнишки баира, който всеки път ме напада и всеки път резултата е различен. Дишах асфалта и приех болката. С пулс от 175 удара в минута и по баира с 13-тина км/ч катерих нагоре като много упорита (и дебела) коза. И го изкатерих. И боля, но този път по-малко.

Реших да обърна и завъртях със средна скорост от 27.7 км/ч, което не ми се случва всеки ден.

In other news:

  1. Юруков отново със страхотен коментар по НАПЛийкс подложен с факти и страхотна карта на българите извън страната;
  2. За втори път хващат лаптопи на HP с предварително инсталирана ОС да има keylogger макар и да бил уж за debugging цели и да не е включен по default (точно за случаите в които някой го намери);
  3. Интересен поглед над новия дизайн на Twitter. Освен това май ще мигрирам в twitter, че FB само ми яде от времето и ми пълни главата с простотии;
  4. Биволъ пуснаха търсачка на #НАПлийкс в която можете да потърсите дали вие сте вътре. Стъпките са описани и няма страшно – генерирането на MD5, който е еднопосочен алгоритъм ще ви даде известна сигурност, че Биволъ няма да ви откраднат ЕГН-тата (които вече си ги има в публичното пространство :D );
  5. В Русия искат да вържат вашия телефонен номер с мейла ви. Това като онази новина от преди няколко дни в която Казахстан правят MITM attack на целия HTTPS трафик в страната. Да живее демокрацията;
  6. Историческия парк около Варна може да се окаже пирамида.

Song of the day

Признавам си, че Joe Bonamassa го харесвах само в комплект с Beth Hart, нооо тряба да чуете това.

Виц на деня

Мъж се събудил и погледнал часовника си, било 7:07ч. Облякъл се, отишъл в кухнята, погледнал календара 7 юли (7ми ден на 7мия месец). Излязъл навън, а на спирката се задавал трамвай 7, хванал го и отишъл на кафе, а там сметката била 7.77лв
“Баси днеска само на седмици ми върви, съдбата се опитва да ми каже нещо”. Отскочил до букмейкъра и се пуснал на конни състезания, там кон номер 7 бил кръстен Съдба. Човекът не можал да повярва и заложил последните 100 лв, които имал на него и естествено конят завършил седми.

Малки SQL трикове за WordPress

Когато не му се спи на човек ума му решава да прави неща, които в нормални условия не биха се случили (не и в този вид).
Ето и списък с няколко интересни SQL заявки, които можете да използвате докато работите с WordPress.

Как да покажем общия брой публикувани постове за определена година

В този блог за 2017 година съм публикувал 155 поста. Чудя се това малко ли са или много, но колкото-толкова.
Интересно е друго – начина по който видях това. Оказа се съвсем лесно с SQL заявка, която изглежда по този начин:

select count(*) from wp_posts where YEAR(post_date) = 2017 and post_type = 'post' and post_status = 'publish'

Имайте предвид, че тази заявка показва само публикуваните постовете (не page или някакъв custom post type) за 2017 г.

Примерен резултат:

mysql> select count(*) from wp_posts where YEAR(post_date) = 2017 and post_type = 'post' and post_status = 'publish';
 +----------+
 | count(*) |
 +----------+
 | 155      |
 +----------+
 1 row in set (0.00 sec)

Ако искате да видите колко draft-а имате можете да изпълните тази заявка:

select count(*) from wp_posts where YEAR(post_date) = 2017 and post_type = 'post' and post_status = 'draft'

Примерен резултат:

mysql> select count(*) from wp_posts where YEAR(post_date) = 2017 and post_type = 'post' and post_status = 'draft';
 +----------+
 | count(*) |
 +----------+
 | 116      |
 +----------+
 1 row in set (0.00 sec)

 

И не – няма грешка. Имам цели 116 поста, които така и не съм публикувал, повечето от които са започнати и недовършени истории, няколко tutorial-а (още ме е яд, че не завърших този за HTTP/2) и няколко пътеписа.

Как да сменим siteurl и homeurl с един ред

Ако не сте чували за siteurl и homeurl няма страшно. Но ако се наложи да мигрирате сайта, да смените домейна или да добавите/премахнете HTTPS поддържка ще се наложи да поработите с тях.

UPDATE wp_options SET option_value = replace(option_value, 'http://www.nedko.info', 'https://www.nedko.info') WHERE option_name = 'home' OR option_name = 'siteurl'

След изпълнението на тази заявка при опит да достъпя сайта ще бъда пренасочван автоматично от non-HTTPS към HTTPS версията на блога. Можете да я използвате и при смян на домейн да кажем като смените втория линк на този, който желаете. Не е най-добрия пример, но е важно да схванете как работят siteurl и homeurl. Друга полза е ако ъпдейтвате сайта и имате да мигрирате да кажем https://nedko.info/v2 към https://nedko.info.

Работа с пароли

Не сме безгрешни – забравяме си понякога паролите или при нужда да дебъгнем проблема в някой клиентски сайт понякога се налага да влезем с подходящите инструменти.

UPDATE wp_users SET user_pass = MD5( '123456' ) WHERE user_login = 'admin'

Тази заявка ще смени паролата на потребителя admin с 123456.

 

Ако ви се наложи да работите върху клиентска инсталация, но не искате да сменяте паролата на потребителя можете първо да запишете хеша ѝ със следната заявка:

select user_login,user_pass from wp_users

Примерен резутат:

mysql> select user_login,user_pass from wp_users;
+------------+---------------------------------------------------+
| user_login | user_pass                                         |                           |
+------------+---------------------------------------------------+
| admin      | $P$B5&50UGz0.kW3tq6jifraX.hT!РqZP.                |
+------------+---------------------------------------------------+
1 row in set (0.00 sec)

Сега запишете стойността на user_pass полето, изпълнете горната заявка, която ще смени паролата на 123456 и като сте готови просто изпълнете следната заявка за да върнете старата парола:

UPDATE wp_users SET user_pass = '$P$B5&50UGz0.kW3tq6jifraX.hT!РqZP.' WHERE user_login = 'admin'

 

Изтриване на всички спам коментари

Преди време ми се наложи да изтрия от един блог над 10 000 коментара. Tricky-то беше, че имаше и коментари от хора, не само спам. Решението е тривиално и се нарича Akismet. Безплатната версия върши страхотна работа, но имах проблем с привилегиите на DB потребителя и коментарите маркирани като спам не се триеха. За това използвах тази заявка за да ги изчистя (~10 000 коментара от които 90%-95% спам се изтриха за под 2 секунди):

DELETE FROM wp_comments WHERE comment_approved = 'spam'

Ако искате да изтриете и тези със статус awaiting moderation можете да ипозлвате следната заявка:

DELETE FROM wp_comments WHERE comment_approved = '0'

Как да видим всички неизползвани тагове

Ако искате да видите дали имате тагове, които никога не са използвани можете да изпълните тази заявка:

SELECT name,count from wp_terms wt INNER JOIN wp_term_taxonomy wtt ON wt.term_id=wtt.term_id WHERE wtt.taxonomy='post_tag' AND wtt.count=0

Примерен резултат:

mysql> SELECT name,count from wp_terms wt INNER JOIN wp_term_taxonomy wtt ON wt.term_id=wtt.term_id WHERE wtt.taxonomy='post_tag' AND wtt.count=0
 -> ;
+--------+-------+
| name | count |
+--------+-------+
| blabla | 0 |
+--------+-------+
1 row in set (0.00 sec)

Ако обаче искат да видите (спорд мен далеч по-практично) тагове, които са използвани 5 или по-малко пъти, сортирани по възходящ ред можете да изпълните следната заявка:

SELECT name,count from wp_terms wt INNER JOIN wp_term_taxonomy wtt ON wt.term_id=wtt.term_id WHERE wtt.taxonomy='post_tag' AND wtt.count<5 order by wtt.count DESC

Примерен резултат:

mysql> SELECT name,count from wp_terms wt INNER JOIN wp_term_taxonomy wtt ON wt.term_id=wtt.term_id WHERE wtt.taxonomy='post_tag' AND wtt.count<5 order by wtt.count
+--------------------------------------------------------+-------+
| name | count |
+--------------------------------------------------------+-------+
| blabla | 0 |
| humor | 1 |
| кино | 1 |
| котка | 1 |
| vulnerability | 1 |
+--------------------------------------------------------+-------+
5 rows in set (0.00 sec)

Извличане на всички мейли от коментарите на потребителите

Маркетинг хората имат нужда да пращат таргетирани съобщения до разни хора и един страхотен начин да изкарате списък с всички мейли от коментиралите по блога хора е следния:

select comment_author_email,comment_author_url,comment_date from wp_comments order by comment_date DESC

Тази заявка ще покаже мейла, сайта (ако има такъв попълнен) и датата на коментара. Това можете да го ползвате като ориентация.

Примерен резултат ще върне следните данни:

somemail@gmail.com | http://www.somedomain.com | 2017-11-01 17:18:19 |

Иначе можете да лимитирате само до списък с мейлите така:

select comment_author_email from wp_comments

 

P.S. For non-Bulgarian speakers:

  • What are you doing here?
  • If you think that the article will be useful I can translate it in English.

09.12.2017

Днес е малко време за четене и спокойствие. И разходка!

Не можах да прочета много, но излязохме на свеж въздух в южен парк, пихме по една Коста и се прибрахме. Носих голямата на нещо като раница, скачах и беснях като изтърван. Липсваше ми студения въздух и разходките.

Вечерта започнах да се подготвям за миграцията на marvin към php-fpm (не с manually build PHP (и при това две – едно антично и едно latest and greatest)), Никото ми представи няколко много вълнуващи идеи и конфигурации за nginx-а.
Плана е да deploy-на наново nginx, php-fpm и да пренапиша изцяло vhost-овете. Освен това сега използвам letsencrypt за … да – да генерирам сертификати за Let’s Encrypt. Ще мигрирам на certbot.

Тези промени ще подобрят:

  • Работата на marvin като цяло;
  • Много по-леката конфигурация на nginx, очаквам скоростта на блога и останалите сайтове да се качи значително;
  • Всичко, което носи PHP 7.2 и най-вече сигурност и скорост;
  • Сигурността трябва да се повиши (имам някои проблеми си правата и потребителите, които ще бъдат разрешени с деплоя на новия nginix);
  • Ще науча много за nginx, конфигурацията му и работата с vhosts;
  • Ще разкарам всичките php-fpm глупости – в момента търкалям PHP 5.3 (което е свръх-антично) и PHP 7.0.3. Накрая ще стане само един (колко крайно прозвуча това :D) – 7.2.

 

In other news:

01.12.2017 – Linux Journal shuts down

Едно от най-големите списания за Linux и Open Source спира изданията си от днес. Първото издание на списанието е от 1994 година и по техни думи е с едно от най-силните микро общества фокусирани в open source-а. Последното печатно издание е от 2011 година, но портала остава популярен и до днес.
Финалната статия на Kyle Rankin повдига няколко основни въпроса относно open source, linux и идеята, която стои зад тях – свобода, прозрачност и гъвкавост.

So long and thanks for all the bash, Linux Journal!

Как да намерим незатворен HTML таг с прост скрипт

Проекта

Вчера ми се наложи да намеря незатворен HTML таг в една страница и се оказа приключение. Първо започнах да търся някакъв начин да го направя през Sublime, но бързо преустанових и реших да потърся някакво WEB решение.

И се оказа, че има. Автора е Jon Aquino, а скрипта му е прост и върши само това, което очаквах от него.

Как се използва?

Използването на скрипта е елементарно – копираме вече генерирания HTML от браузъра (за Chrome – ctrl+u) и после просто paste-ваме тук.
Разбира се можем да сложим и HTML от наши сайтове ако имаме достъп.

 

Притеснението ми е, че проекта е стар (2013 г.) и не съм сигурен, че има добра поддръжка на HTML5/CSS3, но за основни неща ще свърши добра работа.

Архивиране на директория с tar

И понеже ВСЕКИ път като ми се наложи да  архивирам директория под линукс и търся разни тъториали та реших да си го постна тук за по-лесно намиране, пък и на някой ако му е интересно/полезно – още по-добре.

Архивиране с tar

Ако искам да архивирам директория с всичките поддиректории и файлове с tar (zip и rar не идват инсталирани в пакетите на Дебиан и Убунту и вероятно на повечето останали дистрибуции) използвам следната команда:

tar czfv nedko.info.tar.gz /var/www/html/nedko.info/.

 

Дисекция на командата:

c – create

z – де/компресирай с gzip

f – архивирай във файл

v – verbose output (ще ни покаже полезна информация по време на компресирането. Не се препоръчва ако използваме командата в cron)

nedko.info.tar.gz – името на архива

/var/www/html/nedko.info – директорията, която искаме да архивираме

 

Разархивиране на създадения архив

И да речем, че нещо се прецака и искам да разархивирам архива в определена директория:

tar xzfv nedko.info.tar.gz /var/www/html/nedko.info

 

Дисекция на командата:

x – extract

z – де/компресирай с gzip

f – file (трябва да подадем име на файла след тази директива)

v – verbose – ще ни изкара полезна информация по време на декомпресирането. Не се препоръчва ако използваме командата в cron.

100% SSL поддържка на marvin

Днес най-накрая успях да подкарам 100% SSL support на всичките ми хостнати проекти с Let’s Encrypt.

Без проблеми естествено не можеше, но бяха решени с касапския метод:

[code]aptitude remove letsencrypt[/code]

[code]aptitude purge[/code]

[code]aptitude install letsencrypt[/code]

Заедно с това сложих и letsencrypt renew, защото сертификатите са валидни само три месеца. Сега ще чакам да видим след три месеца дали всичко ще стане автоматично :)

Вече съм сертифициран радиолюбител

С времето човек спира да се учи малко по малко и когато аз усетих това реших да се хвана в ръце. Първо дойде решението ми да сменя работата си, а малко по-късно мой приятел ме надъха да изкарам клас 2 радиолюбител.
Преди 2 седмици мина изпита поред КРС в гр. Варна с още около 25 човека и получих оценката си почти ведната – изпит взет.
Оборудването ми е Baofeng UV-5R, което за момента ми е напълно достатъчно.
И най-важното – инициала ми е LZ2NIH или преведено на НАТО фонетичната азбука – Lima Zulu 2 November India Hotel.

73 и до нови срещи.