CategoryIT Stuff

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 и до нови срещи.

Raspberry Pi 3 – по-мощен от всякога + вградени WiFi и Bluetooth

Тези, които ме познават знаят, че колекционирам разни проекти, които биха тръгнали на Raspberry Pi, Arduino, Olimex* и т.н. (и още нищо не съм реализирал от край до край…). Покрай новото Raspberry Pi се реших да напиша една кратка статия за него, за компанията и защо тази малка платка е толкова популярна.

 

Първо ще започнем с малко интро защо изобщо тези малки SoC (System on Chip) са толкова популярни и се продават с милиони бройки всяка година.

Raspberry Pi е малка развойна платка, която има всички нужни параметри, за да работи като самостоятелен компютър – процесор, памет, storage port, има си няколко USB, GPIO (General-purpose input/output за комуникация с различни периферии извън USB), HDMI аудио/видео изход, без движещи се елементи (вентилатор) и т.н. Цялото това нещо тежи едва 45 грама (за последната версия без адаптера).

Второ – защо ни е такава развойна платка?

Когато за пръв път попаднах на сайта на Raspberry Pi си помислих, че това е развойна платка, която се използва в роботиката и/или автоматизацията (основно заради тогавашните проекти най-вероятно) и е много тясно специализирана. След няколко дни пак се присетих нещо за Pi-то и се замислих, че на това чудо биха тръгнали всякакви интересни неща, ако му се подкара някаква (Linux базирана) операционна система.

Разбира се след като открих Raspbian (базиран на Debian) и NOOBS разбрах колко ценен е този малък продукт. С времето видях как хора го ползват от всякакви проекти – от метереологични станции през малки Apache/nginx services, home automation (с подходящите китове, които се продават отделно можете да настройвате климатици, да отваряте и затваряте прозорци и врати и каквото се сетите още (ето един страхотен пример за open source home automation) и стигнетете до изграждане на клъстери с 256 паралелно работещи Pi-та за каквото се сетите.

Всичко, от което имате нужда е едно Raspberry Pi, памет (последната трета версия работи с microSD карти, предците му – с SD) и адаптер с мощност от над един ампер (тоест повечето зарядни за телефони, например) и ще можете да си поиграете с тази играчка.

Трето – моите идеи. Те, разбира се, са ужасно много, но след строга селекция реших да използвам моето Raspberry Pi 2, за да се запозная малко повече с:

  • mySQL replication;
  • Load balancing (с Apache/nginx);
  • Failover schemes (пак с Apache);
  • Proxies;
  • (евентуално) High-availability.

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

Червърто – периферия. С разширяването на проекта разработчиците и third parity страни започнаха разработки на интересни хардуерни проекти свързани с Pi. Може би първото нещо, което прави в мен най-силна асоциация е Camera Pi. Това е една микроскопична 5 мегапикселова камера с размери 25х24х9 и тежи едва три грама (без интерфейсния кабел), снима видео в 1080p (30 кадъра в секунда), 720p (60 кадъра в секунда) и 640x480p (60/90 кадъра в секунда). Повече информация за нея можете да прочетете тук. Има и инфрачервена версия – NoIR Camera.

Разбира се освен камерата има и още много хардуер, който е съвместим (или правен за) Raspberry Pi, например дисанционни, мишки и клавиатури, WiFi, 3G, Infrared и Bluetooth приемници, звукови карти, GPS, smart card readers, екрани чувствителни на допир, скенери за пръстви отпечатъци и още много други. Ето тук можете да видите пълен списък с устройствата, които са тествани и работят на Pi.

Пето – малко история. Типично за мен започвам нещата малко отзад напред.

В общи линии идеята на проекта се е зародила от възпитаниците на Кеймбридж Eben Upton, Rob Mullins, Jack Lang и Alan Mycroft през 2006 г. с идеята да създадат достъпен компютър за общи цели. Техния ценови диапазон (само за платката) е едва $35 (като имат и Raspberry Pi Zero за … $5, но за него след малко). За рожден ден на проекта създателите смятат датата 29.02, защото тогава са направили и първата продажба на Raspberry Pi 1.
Ето и през какви периоди преминава Raspberry Pi за последните 4 години:

02.2012: Raspberry Pi Model B
10.2012: Raspberry Pi Model B rev2
02.2013: Raspberry Pi Model A
05.2013: Camera module
10.2013: Infra-red Camera module
07.2014: Raspberry Pi Model B+
11.2014: Raspberry Pi Model A+
04.2014: Raspberry Pi Compute Module
02.2015: Raspberry Pi 2 Model B
08.2015: Raspberry Pi Sense HAT
11.2015: Raspberry Pi Zero
02.2016: Raspberry Pi 3 Model B

По данни на Raspberry Pi foundation за 4 години са продадени над 8 милиона устройства.

Пето – най-доброто, което Raspberry Pi може да ви предложи – Raspberry Pi 3.

С всяка версия Raspberry Pi става невъзможно добро, а цената му си остава същата.

Ето и спецификациите с които може да се похвали последния Pi:

Чипсет – Broadcoam BCM2837 (CPU, GPU, DSP, SDRAM) срещу 32 битовия му предшественик Broadcom BCM2836;

Процесор – ARM Cortex-A53 1.2 GHz 64-bit quad-core срещу QUAD Core @900 MHz;

Рам памет – 1 GB @ 400 MHz (споделена с тази на видео картата);

Видео – Broadcom VideoCore IV @ 250 MHz, поддържа OpenGL ES 2.0 (производителност от 24 гигафлопа), хардуерен MPEG-2 и VC-1 кодеци,1080p 30 кадъра в секунда H.264/MPEG-4 AVC декодер и енкодер

USB – 4 готови за използване USB 2 порта (всъщност са 5, но единия е резервиран за ethernet модула);

Видео вход – 15 пинов MIPI  интерфейс (CSI) за връзка с Raspberry Pi Camera и Raspberry Pi NoIR);

Видео изход – HDMI (ревизии 1.3 & 1.4) в 14 резолюции от 640×350 до 1920×1200 плюс PAL и NTSC стандарти, composite video (PAL и NTSC) през стандартен 3.5 мм жак със споделен аудио изход;

Звук – всички версии на Raspberry Pi използват I²S;

Storage – през microSDHC карта, идва с допълнителни 4 GB eMMC;

Мрежа – Еthernet – 10/100

Мрежа – Wireless – 802.11n

Bluetooth – 4.1 поддържата и Low Energy

 

Цена от производител (без доставка и адаптер) – $35 (не забравяйте, че в тази версия WiFi и Bluetooth са вградени и няма нужда да ги купувате отделно);

Цена за адаптер – около $8

MicroSD карта – 16GB microSDHC за около $8

Обща цена без доставка – $51

Търсите нещо още по-евтино? Няма проблем. Клон на проекта Pi е Zero. Това е още по-малко, по-просто и много по-евтино устройство, което ще задоволи нуждите на всеки, който търси автоматизация на възможно най-ниска цена.

Спецификации:

Процесор – Broadcom BCM2835 ARM 11 @ 1 GHz (или с около 40% по-бърз от първото Pi);

Рам памет – 512MB LPDDR2;

Слот за microSD карта;

mini-HDMI сокет с до 1080p @ 60 fps

40 pin GPIO (съвместим с всички останали Pi от първия до последния);

Размер – 65мм x 30мм x 5мм

Цена – wait for it… $5.

Извод – няма нужда да сте запален geek или специалист, за да подкарате Raspberry Pi и то да върши точно това, от което имате нужда. Платката е производителна, не грее (много), не е скъпа и има огромно предназначение. Силно препоръчвам Raspberry Pi / Raspberry Zero на хора, които са от специалисти до начинаещи в бранша и дори деца (представете си вашия 10-12 годишен син/дъщеря да котролират кога диода закачен на GPIO-то ще свети и кога не).

 

Ако има интерес ще напиша и за конкурентите на Raspberry Pi, които са също толкова впечатляващи, а някои от тях – дори и по-евтини.

Сканиране за лоши сектори под Linux

Има едно нещо, което е по-лошо от счупения хардуер и то е умиращия такъв. Тия дни ми се наложи да сканирам няколко хард диска за лоши сектори под linux (в моя случай това е офисната ми машина с Ubuntu 14.04.3 LTS + Mate) и след извесно чудене кой метод да избера се спрях на badblocks. Хубавото му е, че единственото нещо, което го накарах да изведе е списък с лошите сектори, които евентуално по-късно можех да обработя с fsck. Без графични интерфейси, излишни прозорци и т.н. Автор на badblocks е Реми Кард.

Инсталацията му под Debian базирани инсталации е тривиална: Continue reading