https://github.com/tolik-punkoff
Ну и шоб два раза не вставать, Coub тоже http://coub.com/tolikpunkoff
https://github.com/tolik-punkoff
Ну и шоб два раза не вставать, Coub тоже http://coub.com/tolikpunkoff
В WordPress откровенно не хватает ката в стиле ЖЖ, собственно кат-то там есть, но он монументален, как египетская пирамида и неумолим, как топор палача.
Тег <!--more-->
можно использовать лишь один раз в посту, и все что после него уходит в подкат.
Итак, необходим следующий функционал:
1. Кат в стиле живого журнала, поддерживающий изменение текста ссылки на содержимое под катом, с возможностью использоваться несколько раз в одном посту для скрытия определенных его фрагментов.
2. Сделано это должно быть без javascript и CSS.
<lj-cut>
и </lj-cut>
заменяется на ссылку вида http://blog.livejournal.com/1234567.html#cutid1
со стандартным текстом Read more… или текстом, заданным пользователем. Где1234567.html
— страница, содержащая полный текст постаcutid1
— якорь [4], указывающий на начало скрываемого текста на странице поста.cutid1, cutid2... cutidN
).
Ну ладно, писать, так писать, подумал я и решил добавить возможность задавать осмысленные имена якорей, например, #code, #function, #ioann_grozny_killing_son_2666_x_6666
и т.д.
В директории wp-content
создаем поддиректорию lj-cut
, а в ней файл lj-cut.php
со следующим содержимым:
<?php /* Plugin Name: LJ-cut style cut Description: Add Livejournal-like Cut Shortcode */ function ljcut_shortcode($atts, $content=null) { } add_shortcode ('lj-cut','ljcut_shortcode'); ?>
Информация в комментариях после Plugin Name:
и Description:
будет отображена в админ-панели в разделе плагинов. Plugin Name:
и информация далее должна быть указана обязательно.
Функция ljcut_shortcode($atts, $content=null)
обрабатывает шорткод, ей передаются движком массив с параметрами $atts
и содержимое между открывающим и закрывающим тегом $content
Функция add_shortcode
добавляет шорткод с указанным именем (1 параметр) и устанавливает функцию его обрабатывающую (2 параметр).
Функция обработки шорткода будет вызвана каждый раз, как будет встречена в посту. Ей будут переданы параметры из массива $atts
, указанные в тексте как [shortcodename param1="value1", param2="value2"]
.
1. Заведем 2 статических переменных:
static $cutid=0; //номер текущего cutid в посту
Первая будет хранить номер текущего
static $oldplink=''; //предыдущий permalink
cutid
в посту, а вторая сохранять предыдущую постоянную ссылку на пост. Переменные обязательно должны быть объявлены при помощи ключевого слова static
, иначе их значения будут сброшены при каждом вызове функции.
2. Вытащим из массива $atts
параметры и запишем их в соответствующие переменные. Если параметр не будет определен, то ему будет присвоено значение, указанное в кавычках после =>
extract(shortcode_atts(array( 'text' => 'Read more...', 'unicancor' => '', ), $atts));
4. Получим URL поста, откуда была вызвана функция обработки шорткода, используя внутреннюю функцию WordPress get_permalink()
[2]:
5. $plink=get_permalink(); //получаем URL текущего поста
6. Получим URL текущей страницы:
$clink=get_bloginfo('url').$_SERVER["REQUEST_URI"]; //URL текущей страницы
Функция get_bloginfo('url')
получит адрес блога [3], а в элементе REQUEST_URI
массива $_SERVER
будет находиться значение вида /blog/post.html
если пользователь читает пост на странице поста и значения вида /page/2/
(/author/tolik-punkoff/
, /tag/it/
), если пост читают с какой-то из страниц сайта. В первом случае необходимо показывать весь текст, во втором — заменять скрытую под катом часть на соответствующую ссылку.
7. Далее необходимо проверить, какой раз функция обработки шорткода ката вызывается из поста. Делается это путем сравнения заранее сохраненной постоянной ссылки на пост и только что полученной.
Если ранее сохраненная ссылка не такая же, как и полученная во время вызова функции, значит, мы начали обрабатывать новый пост. В таком случае отсчет текущих фрагментов, скрытых под катом, необходимо начать заново, а постоянную ссылку на новый пост сохранить в соответствующей переменной. Иначе функция была очередной раз вызвана из текущего поста, соответственно, нужно просто увеличить счетчик фрагментов под катом:
if ($oldplink!=$plink) //пост новый, надо начать отсчет cutid заново (с 1) { $cutid=1; $oldplink=$plink; //и сохранить текущий } else //мы все еще обрабатываем старый пост { $cutid++; //прибавляем значение cutid }
8. Далее необходимо сравнить постоянную ссылку на пост (premalink) со ссылкой на той странице, на которой находится пользователь и если пользователь на странице поста — установить якорь [4] и вывести контент, скрытый под катом. Если пользователь на одной из страниц блога со списком постов, то выводится ссылка на пост, дополняемая указателем на якорь (http://tolik-punkoff.com/tag/it/post#ancor
).
Если имя якоря задано пользователем в соответствующем параметре шорткода, то оно и используется, иначе, якорь принимает вид cutidN
, где N
— заранее посчитанный в переменной $cutid
номер.
if ($plink==$clink) { //мы в теле поста, cut надо раскрыть и вставить якорь if ($unicancor=='') //если якорь не задан, используем cutidn { $ret='<a name="cutid' . $cutid . '"></a> ' .$content; } else { $ret='<a name="' . $unicancor . '"></a> ' .$content; } } else { //мы на одной из страниц, но не в самом посту //надо установить ссылку на пост и на нужный якорь в посту if ($unicancor=='') //если якорь не задан, используем cutidn { $ret='<a class="more-link" ' . 'href="' . $plink . '#cutid' . $cutid . '">' . $text . '</a>'; } else { $ret='<a class="more-link" ' . 'href="' . $plink . '#' . $unicancor . '">' . $text . '</a>'; } }
Сохраняем сгенерированный HTML-код в переменной $ret
9. Возвращаем сгенерированный код и завершаем функцию обработки шорткода:
return $ret;
С Pastebin
С Mega.nz
Страничка плагина на сайте HexProject
Страничка плагина на GitHub
Скачать с tolik-punkoff.com
1. Шорткоды в WordPress
2. get_permalink()
3. get_bloginfo()
4. Якорь (HTML)
Ставил я не так давно простой и легкий прокси-сервер tinyproxy, и с удивлением не обнаружил в комплекте запускающего (инициализационного) скрипта.
Что это за зверь такой, если кто не знает. Ко многим демонам в Linux в комплекте идет инициализационный скрипт, позволяющий демона запустить, «убить» или перезапустить из консоли командой вида daemonname start (stop, restart)
без необходимости вручную отлавливать идентификатор процесса, убивать его командой kill
и проверять, завершен ли процесс (или наоборот, стартовал ли он). К squid
, например, такой скрипт идет, называется (в Slackware) rc.squid
и лежит в /etc/rc.d
, а к tinyproxy
в комплекте не шло, но написать его оказалось не так и сложно.
Итак, скрипт будет получать из командной строки единственный параметр с командой:
start
— запускать прокси-сервер
stop
— останавливать его
restart
— перезапускать (останавливать, а после остановки запускать)
status
— отображать, запущен или не запущен прокси.
#!/bin/bash
PIDFILE="/home/provproxy/tinyproxy.pid"
TINYPROXYCMD="/usr/sbin/tinyproxy"
PIDVAL=0
WTIMEOUT=30
OK=0
CH_S[0]='-' #pseudographic items
CH_S[1]='/'
CH_S[2]='|'
CH_S[3]='\'
ITEM_ARR=0 #current item counter
PIDFILE
— переменная, в которой указан PID-файл, файл, содержащий идентификатор основного процесса прокси-сервера. Tinyproxy
при запуске создает сразу несколько процессов, позволяющих ему распараллеливать свою внутреннюю работу. Минимальное и максимальное число таких процессов задается в конфигурационном файле /etc/tinyproxy.conf
параметрами MinSpareServers
и MaxSpareServers
, а процесс, идентификатор которого указан в PID-файле основной, управляющий. Ему можно послать сигнал, например, командой kill
, и все остальные процессы тоже завершатся. Местоположение PID-файла также указывается в файле /etc/tinyproxy.conf
в параметре PidFile
. Конечно, правильнее читать сам конфигурационный файл, и выдергивать значение параметра оттуда, ну да ладно, параметр этот перенастраивается нечасто, посему пусть такое решение останется на моей совести -=^_^-=.TINYPROXYCMD
— путь к исполняемому файлу прокси-сервераPIDVAL
— здесь будет храниться значение PID, полученное из PID-файла.WTIMEOUT
— максимальное время ожидания запуска tinyproxy
, или его завершения.OK
— флаг, принимающий значение 1 в случае успешного запуска/завершения, или 0 — в случае неуспеха. Вообще-то, можно и без него обойтись, но мне с ним удобнее и нагляднее.
CH_S[0] - CH_S[3]
, массив с псевдографическими элементами, для украшательства, отображения хода процесса запуска. Подробности про украшательства тут или тут , и если кому не надо, выбросить лишние команды из скрипта — дело нехитрое. Переменная ITEM_ARR
предназначена для тех же целей.
см. описание функций под катом
case
, после объявления функций.
case "$1" in
start)
start_proxy
;;
stop)
stop_proxy
;;
restart)
restart_proxy
;;
status)
status_proxy
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
esac
start, stop, restart
или status
— выполняются соответствующие функции, если что-то еще (*
) — выводим краткую справку по использованию скрипта. В списке источников в конце заметки есть ссылка на более подробное описание оператора.
process_status()
. Вот ее код:
#Получаем PID
if [ -e $PIDFILE ];then #если файл существует
PIDVAL=`cat $PIDFILE` #читаем PID
TMPGREP=`ps -p $PIDVAL|grep "tinyproxy" -c` #процесс запущен - 1 иначе 0
if [ $TMPGREP -ge 1 ];then #процесс запущен
return #выходим из функции
else #pid-файл есть, процесса нет
rm $PIDFILE #удаляем pid-файл
fi
fi
PIDVAL=0
cat
в переменную PIDVAL
, далее, запрашиваем информацию о процессе (ps
) по его PID (ключ -p
). Если процесс существует, команда ps
отправит на стандартный вывод что-то типа:
PID TTY TIME CMD
2100 ? 00:00:00 tinyproxy
А если процесса не существует:
PID TTY TIME CMD
Далее, этот вывод передается команде grep
, которая фильтрует строки с именем искомого процесса (tinyproxy
) и подсчитывает их количество (ключ -c
). Если строк 1 процесс с данным PID существует, если 0 — процесса нет.
Если PID-файл существует, то в переменной $PIDVAL
остается идентификатор процесса и происходит выход из функции
[...] if [ $TMPGREP -ge 1 ];then #процесс запущен return #выходим из функции [...]
Если PID-файл существует, а процесс с данным PID не обнаружен, значит в PID-файле указан не тот PID, что, в большинстве случаев, может произойти из-за падения программы (с tinyproxy это случается довольно редко), либо из-за общего системного сбоя вызванного, например, отключением питания. Поэтому стоит PID-файл удалить.
Если процесс не обнаружен, или PID-файл не найден, то происходит выход из всех условных конструкций и переменной $PIDVAL
присваивается значение 0
[...]
PIDVAL=0
[...]
Таким образом, если процесс существует, то в переменной $PIDVAL
будет присутствовать его идентификатор, если не существует — значение 0.
Примечание о безопасности и стабильности использования PID-файлов. Конечно, есть более универсальный способ найти процесс не обращаясь к PID-файлу, например, получить список процессов командой ps ax
и отgrep’ать его, найдя нужное нам имя, и, если надо, то завершить его командой pkill имя_процесса
, и данный способ весьма неплохо будет работать с тем же tinyproxy
.
Но tinyproxy — это просто web-прокси сервер, и неизвестно, что произойдет, если применить такой метод, например, к серверу баз данных. Возможно, какие-то транзакции не завершатся, порушится сама база. Поэтому, информации, сохраняемой программами в PID-файлах, стоит доверять. Безопасность их использования и контроль доступа к ним других пользователей должны решаться другими средствами ОС. Посему я не вижу смысла загромождать скрипт дополнительными проверками.
За пояснение благодарю ketmar@ljr
process_status()
используется для получения статуса (и PID) процесса для внутренних целей скрипта, то функция status_proxy()
выводит информацию пользователю. И хоть она очень проста, но лучше вынести ее отдельно, дабы не смешивать взаимодействие с пользователем со внутренней механикой программы.
Вот код этой функции:
status_proxy() { process_status if [ $PIDVAL -eq 0 ]; then echo "Tinyproxy not running" else echo "Tinyproxy running [PID=$PIDVAL]" fi }
Как я и говорил, функция очень проста, сначала вызывается функция process_status
, и если в переменной $PIDVAL
значение 0, то выводится сообщение о том, что tinyproxy не запущен, иначе, что запущен и дополнительно выводится его PID.
start_proxy()
. Вот ее код:-d
tinyproxy -d
tinyproxy: Could not create listening socket.
stop_proxy()
. Ее код:stop_proxy
.
2.
Сбрасываем флаг: $OK=0
Выполняем функцию запуска start_proxy
Вот нехитрый код функции restart_proxy()
:
restart_proxy()
{
stop_proxy
OK=0
start_proxy
}
case
На полноценную инструкцию особо не претендующая, скорее так, некие примочки и припарки от кулхацкеров и всяких говноботов, да ссылки на найденные в сети материалы.
1.Защищаемся от спама. В комплекте с WordPress идет плагин Akismet, настраивается он довольно просто и от спама защищает хорошо. Вот краткая инструкция, например.
2.Ставим капчу на вход в админ-панель, а заодно и на добавление комментариев, форму восстановления пароля с помощью плагина Securimage-WP. Настраивается он тоже несложно, хотя я особо ничего и не настраивал. Поставил, активировал, зашел в Настройки — Securimage-WP и поставил четыре галочки. Ах да, еще матан-капчу включил.
3.Можно установить плагин WP Security Audit Log и отслеживать различные действия, которые производят как пользователи сайта, так и пытаются произвести вредители. Говорят, что плагин тяжелый, но я особо этого не заметил. А вот боты в форму логина wp-login.php
реально ломились нехилыми пачками и это с учетом того, что у меня не сильно известный и популярный блог. Заодно плагин отслеживает и 404 ошибки, что позволяет вовремя заметить косяки в теме оформления, тегах, структуре сайта и т.д.
4.С помощью плагина Jeba Limit Login Attempts можно ограничить количество попыток ввода логина/пароля до трех штук, после чего вход в админку будет заблокирован на 30 минут. Правда, если количество вредителей, ломящихся в админку, превышает разумные пределы, может статься, что туда будет не попасть самому. Хотя есть способ и рыбку съесть, и ног не намочить. О нем далее.
В принципе, если сайт/блог админится одним человеком или даже небольшой командой и не предусматривает регистрацию пользователей, то вполне можно сделать. В противном случае это особого смысла не имеет, ибо форму логина вредители все равно найдут через виджет Мета, или вам придется каждому новому пользователю объяснять, как входить на сайт.
Шаг 1. Оригинальный wp-login.php переименуем в любое другое название, хоть в «s4gr3gerh6hb.php».
Шаг 2. Затем заменим все слова wp-login.php на новое имя, в нашем случае на s4gr3gerh6hb.php, в файле s4gr3gerh6hb.php (старый wp-login.php) и в файле wp-includes/general-template.php [Копия в PDF]
Можно еще в .htaccess
доступ закрыть, либо устроить редирект куда-нибудь, например на http://www.cia.gov или на http://natribu.org
Способ с изменением .htaccess
считается самым надежным и самым ненагружающим сервер, но если не хочется/нет возможности/лень менять что-то на сервере, то можно сделать редирект и вручную средствами php [Копия в PDF]
Например так:
<?php header('Location: http://natribu.org', true, 301); ?>
Или вообще поизвращаться, написать свой скрипт, который будет демонстрировать визитеру рептилоидов, играющих на баяне OST X-files и вести учет IP и количества обращений к скрипту. Но это все-таки дополнительная нагрузка на сервер.
Некое продолжение темы, развитой здесь
Отдел «К» на самом деле такие придурки, что я охуел. Склевали подставное лицо, как голуби семечки из рук гопника.
А технология-то проще, чем музыка у группы «Технология»:
1. Покупаем старый, относительно известный хотя бы в узких кругах блог, желательно вместе со всеми наработанными текстами и связанными ресурсами.
2. Нанимаем старого хозяина контент-менеджером на недолгий срок.
3. Изучаем его литературный стиль, учимся дублировать.
4. Разрываем контракт.
5. Устраиваем скандал, ведущий к «деанону» желательно в таких же узких кругах.
6. Инструктируем чела, как если что говорить с ментами.
7. Устраиваем в блоге скандал, который заинтересует ментов.
8. […] на самом деле, тут могут быть всякие дополнительные плюхи, типа установки на компьютер первоначального хозяина публичного прокси за дополнительные деньги, или даже проплата интервью региональным изданиям
9. Менты наябываются, и даже суда не получается.
10. ФАНФАРЫ! ЗАНАВЕС!
Это такой общий план проекта по наебыванию деанонимизаторов в сети, на деле, чтоб корректно все сделать, надо прикладывать разум и руки, без анализа конкретики и подстройки под ситуацию оно вряд-ли сработает, если вы такой же ламер, как сотрудники отдела «К». Но, если все продумать, то выполнить сможет даже школьник.
Как-то так.
Удачи!
Кое-кто просил pptp-конфиги для vpnbook.com
Получите, распишитесь.
На Pastebin:
Общий конфиг options.pptp
Куда класть, понятно из конфигов пиров (помещаются в директорию /etc/ppp/peers
)
vpnbook-ca1
vpnbook-de233
vpnbook-euro214
vpnbook-euro217
vpnbook-us1
vpnbook-us2
Скачать одним архивом с mega.nz
На euro-214 и 217 открыты все порты, на остальных доступен только HTTP/HTTPS, за торренты (ну так написано) могут типа по голове настучать, в смысле отрубить, но хз, я в принудительном режиме качал 100 метров, не отрубили.
217 на мой взгляд довольно падучий, 214 более стабильный, но чет последнее время тоже периодически разрывает коннект.
Сам пользуюсь в основном канадским, ну нравится мне, что сервер предоставляет моя любимая контора ZOG ЦРУ ФСБ СБУ CDC.
Конфиги не комментированные, гуглите, если что непонятно, как-нибудь может посвящу этому заметку, но не сейчас.
Можно закомментить строчку debug
, чтоб не срал лишнего в логи.
Пароль там действующий на момент публикации заметки, надо пердически менять, когда-нибудь затрону тему, расскажу, как автоматом менять, благо просто.
Собственно, некое продолжение темы из предыдущей заметки. Мне и потребовались русские буквы в консоли для того, чтобы вбивать их в строку поиска гугеля из консольного браузера lynx
. Так уж получилось, что был недавно в ситуации, где окромя консоли ничего нет, а почитать новости или Мракопедию хотелось. Или в гугель что-нибудь вбить.
Но lynx
с настройками по умолчанию подложил мне свинью, точнее маленького поросеночка. Русскоязычные сайты отображались translitom.
Оказалось, что лечится довольно просто (во всяком случае у меня)
1. Запускаем lynx на каком-нибудь сайте с русским текстом. Например lynx tolik-punkoff.com
2. Видим translit, но смело нажимаем кнопку «o» (латинская буква «о») и попадаем в окно с настройками браузера.
3. Пролистываем настройки (клавишами вверх/вниз) и становимся на пункт Display character set
в разделе Display and Character Set
, и видим там какую-нибудь фигню вроде Western (cp850)
4. Поднимаемся выше на пункт Use locale-based character set
, жмем Enter, в выпадающем списке выбираем On, жмем Enter
5. Поднимаемся вверх до пункта сохранения изменений (Accept Changes
) и жмем на нем Enter
Lynx сама определит кодировку, которую использует терминал, сохранит изменения на текущую сессию и перекинет нас обратно на сайт.
Если все получилось, значит, терминал русифицирован, и lynx
определил его кодировку
Если нет — скорее всего, косяк где-то в русификации консоли.
Осталось сохранить это на веки вечные. 🙂
Еще раз нажимаем кнопку «o», спускаемся на пункт Save options to disk: [ ]
, устанавливаем чекбокс нажатием на нем Enter и сохраняем изменения, как описывалось выше.
Можно ради интереса спуститься к пункту Display character set
и посмотреть, какую кодировку определил браузер. У меня, как и ожидалось, оказалась UNICODE (UTF-8)
Понадобились мне русские буквы в чистой консоли. Решилось все на удивление просто.
/etc/rc.d/rc.font
Его надо изменить так, чтобы подгружался нужный шрифт. Мне повезло, и шрифт, устраивающий меня, подгружался из коробки.
Но если шрифт не устраивает, то идем в /usr/share/kbd/consolefonts
и смотрим, какие там есть шрифты, соответственно изменяя /etc/rc.d/rc.font
по своему вкусу.
Например, шрифты у меня были такие:
LatArCyrHeb-19.psfu.gz
А сам
LatArCyrHeb-16.psfu.gz
LatArCyrHeb-14.psfu.gz
LatArCyrHeb-16+.psfu.gz
LatArCyrHeb-08.psfu.gz
rc.font
выглядел так:
#!/bin/sh
#
# This selects your default screen font from among the ones in
# /usr/share/kbd/consolefonts.
#
#setfont -v
setfont -v LatArCyrHeb-16.psfu.gz
Вроде все интуитивно понятно.
/etc/rc.d/rc.keymap
дописываем (или правим соответствующую по виду) строчку:/usr/bin/loadkeys /usr/share/kbd/keymaps/i386/qwerty/ruwin_ctrl-UTF-8.map.gz
ruwin_ctrl-UTF-8.map.gz
В этом файле содержится описание раскладки клавиатуры и способа переключения.
Цитата из источника [2]:
Стоит прежде всего обратить внимание на ruwin под разные кодировки и варианты переключения:
$ (cd /usr/share/kbd/keymaps/i386/qwerty/; ls -1 ru*)
Конец цитаты
ru1.map.gz
ru2.map.gz
ru3.map.gz
ru4.map.gz
ru-cp1251.map.gz
ru.map.gz
ru-ms.map.gz
ruwin_alt-CP1251.map.gz
ruwin_alt-KOI8-R.map.gz
ruwin_alt-UTF-8.map.gz
ruwin_cplk-CP1251.map.gz
ruwin_cplk-KOI8-R.map.gz
ruwin_cplk-UTF-8.map.gz
ruwin_ctrl-CP1251.map.gz
ruwin_ctrl-KOI8-R.map.gz
ruwin_ctrl-UTF-8.map.gz
ruwin_ct_sh-CP1251.map.gz
ruwin_ct_sh-KOI8-R.map.gz
ruwin_ct_sh-UTF-8.map.gz
ru_win.map.gz
ru-yawerty.map.gz
На терминал, запускающийся из X, эти настройки не влияют, как и на PuTTY.
В PuTTY раскладка в консоли переключается аналогично раскладке во всем остальном Windows, а в иксах — соответственно настройкам иксов. Хотя на всякий случай я выбрал переключение левым Ctrl, которое отличается от моего виндового Ctrl+Shift, чисто на всякий случай, мало ли в PuTTY или еще где что поменяется, а я потом забуду где что менял.
Крестина упоротая
(из классификатора «Эсхатологические мутанты»)
Мой дядя самый честный блоггер
Когда не в шутку занемог,
Он даже сам себя забанил,
И лучше выдумать не смог.
Иногда бывает, что в скрипт надо вставить скучную команду sleep
, пока что-нибудь делается, например, поднимается сетевой интерфейс или стартует демон.
Вообще, правильнее в этих случаях писать отдельные проверки, проверяя в цикле, поднялось ли, запустилось ли нужное.
Но иногда лень и где некритично можно «просто подождать», как пелось у классика. А чтобы юзеру не было скучно, и он не думал, что наш скрипт висит, можно подменить обычный sleep
небольшим скриптом, показывающим обратный отсчет, да еще и с вращающейся псевдографической фенечкой.
Я уже когда-то поднимал этот вопрос, посему с ноля все делать не придется, нужно лишь чуть доработать имеющийся скрипт.
Итак, скрипту будут передаваться два параметра. Первый обязательный, содержащий время ожидания, и второй дополнительный — сообщение, выводимое в терминал. Если второй параметр не задан, то по умолчанию будет выдано сообщение, заранее определенное во внутренней переменной скрипта.
Определяем переменные (сообщение по умолчанию, время ожидания, счетчик текущего элемента в массиве псевдографической «мельницы» и сам массив элементов):
MESSAGE="Wait"
WTIMEOUT=0
ITEM_ARR=0 #current item counter
CH_S[0]='-' #pseudographic items
CH_S[1]='/'
CH_S[2]='|'
CH_S[3]='\'
print_help()
{
echo "use waiter <time> [message]"
echo "<time> - wait time"
echo "[message] - optional text message"
}
Проверяем первый параметр скрипта, на предмет того, нужно ли вывести справку и завершить работу:
#parameters check
if [ -z $1 ];then #if no parameters
print_help
exit 2
fi
#if help request
if [ $1 = "-h" ];then
print_help
exit 2
fi
if [ $1 = "--help" ];then
print_help
exit 2
fi
Проверяем первый параметр скрипта на соответствие его числовому значению (подробнее описано здесь):
if (echo $1 | grep -E -q "^?[0-9]+$");then
WTIMEOUT=$1
else
echo "Not a number in first parameter <time>"
exit 1
fi
И второй параметр. Если он не пустой, присваиваем его значение переменной, содержащей сообщение:
if [ -n "$2" ];then
MESSAGE=$2
fi
Переходим к основной части скрипта:
Выводим сообщение для пользователя и сохраняем позицию курсора:
echo -n $MESSAGE" ("$WTIMEOUT" secounds): "
tput sc #save cursor position
Ключ -n
в команде echo
означает, что следующее сообщение будет печататься на той же строке, команда echo
не совершит перевод курсора на следующую строку.
while [ $WTIMEOUT -ge 0 ]; do
#print timeout and current pseudographic char
printf '%3s %s' $WTIMEOUT ${CH_S[ITEM_ARR]}
tput rc #restore cursor position
sleep 1
#decrease timeout and increase current item ctr.
let "WTIMEOUT=WTIMEOUT-1"
let "ITEM_ARR=ITEM_ARR+1"
if [ $ITEM_ARR -eq 4 ];then
#if items ctr > number of array items
#starting with 0 item
let "ITEM_ARR=0"
fi
done
В рабочем цикле сначала выводим оставшееся время ожидания и текущий символ из массива псевдографических элементов, шаблон %3s
команды printf
означает, что если выводимая строка меньше 3 символов, недостающие с начала строки знаки заменяются пробелами, %s
, что просто выводим строку, как она есть. Далее указываются 2 переменных — оставшееся время ожидания и символ из массива.
Следующим шагом восстанавливаем позицию курсора (и все, что будет напечатано в следующей итерации цикла затрет предыдущие значения).
Далее ждем одну секунду и уменьшаем оставшееся время на 1, а счетчик текущего элемента массива увеличиваем и проверяем, не больше ли он, чем последний индекс в массиве. Если больше — присваиваем счетчику значение 0, в следующем цикле опять будет выведен нулевой элемент.
В завершении печатаем символ перехода на новую строку, чтобы следующие сообщения в следующих или в вызывающих этот скрипт скриптах начинались с новой строки
#next message starting with new string
printf '\n'
Бывает mcedit капризничает и при нажатии [Ctrl]-[Ins] не помещает данные в cooledit.clip хотя с правами все в порядке и файл есть. Что делать в этом случае, открываем на правку файл, выделяем нужный текст [F3], жмем [F9] «файл» — «копировать в файл» или [Ctrl]-[f], открывается окно и путь до cooledit.clip жмем «далее», теперь содержимое выделенного текста записано в cooledit.clip. Чтобы вставить, открываем другой файл, жмем [F9] «файл» — «Вставить файл» или [F15] (но таких клавиатур давно нет ^_^).
Мне не пришлось шаманить с файлом буфера редактора mc, но вот [Shift]+[Ins] перехватывает putty, так что оставлю от склероза.
Остальное здесь
Переменные в BASH, как известно, типа не имеют (и как же это иной раз бесит). А проверить, что в переменной — число или строка иногда надо. На помощь придет grep
и регулярные выражения.
Команда grep -E -q regexp
проверит, соответствует ли переданная grep
строка, регулярному выражению regexp
Ключ -E
укажет команде grep
, что образец есть полное регулярное выражение (см. подробности здесь )
Ключ -q укажет, что в стандартный поток ввода-вывода отправятся соответствующие образцу строки, и если хоть одна из входных строк соответствует образцу, то код завершения команды будет 0, иначе 1.
Для простого примера больше одной строки и не надо.
Осталось составить регулярные выражения для нашего случая:
Целое положительное число: ^?[0-9]+$
Целое положительное, либо отрицательное число: ^-?[0-9]+$
Для примера проверим первый параметр скрипта, задаваемый из командной строки
1. положительные целые числа
#!/bin/bash if (echo "$1" | grep -E -q "^?[0-9]+$"); then echo "Number" else echo "Not Number" fi
2. положительные и отрицательные целые числа
#!/bin/bash if (echo "$1" | grep -E -q "^-?[0-9]+$"); then echo "Number" else echo "Not Number" fi
ДОЧИТАЙТЕ ДО КОНЦА, КАК НЕЗНАНИЕ ИЛИ ПРЕНЕБРЕЖЕНИЕ К МАНУАЛАМ, ЗАСТАВЛЯЕТ ИЗОБРЕТАТЬ ВЕЛОСИПЕДЫ
Столкнулся я с проблемой, а как отобразить в посте не результат работы шорткода, а его вид в редакторе, т.е. его синтаксис. Для шорткодов, в том же самом блоге не используемых — все нормально. Но для тех шорткодов, которые в блоге используешь — возникает понятная проблема. Вставляешь шорткод в блог, и движок на место шорткода вставляет результат функции, его обрабатывающий. А задача стоит отобразить написание шорткода.
Отобразить синтаксис html-тегов проще, достаточно заменить угловые скобки «<» и «>» на эскейп-последовательности html. Для символов «[» и «]», заменяющих «<» и «>» для шорткода, я не нашел эксейп-последовательностей.
functions.php
, хоть в отдельный плагин.<?php
/**
* Plugin Name: shortcodes display
*/
function display_shortcode($atts, $content=null)
{
$ret=$content;
return $ret;
}
add_shortcode ('shortcode','display_shortcode');
?>
ВНИМАНИЕ! Переменную $atts
нужно добавить обязательно, хотя она фактически не используется, т.к. у данного шорткода параметров нет, но так уж устроен движок WordPress, что без наличия первого параметра не обработается и параметр $content
Результат работы:
Благодарю злого анонимуса, который хотел постебаться, и случайно помог, хехе.
Т.е. в виде ссылки с «головастиком», как в тестовом посте
Плюс добавим возможность открывать страницу пользователя ЖЖ/LJR в отдельном окне (вкладке)
<ljr user="username">
или <lj user="username">
, данный псевдотег заменяется на ссылку с дополнительной картинкой-головастиком перед ней, клик по картинке ведет к открытию страницы userinfo пользователя ЖЖ и LJR, а клик по имени пользователя — к открытию главной страницы пользователя блогосервиса. Если вставить в пост на LJR псевдотег <lj user="username">
, то к имени пользователя будет добавлена дополнительная строка — username@lj, указывающая, что дневник пользователя находится в Живом Журнале.
[ljr user="username"] или [lj user="username"]
,blank=1
, например [ljr user="hex_laden" blank=1]
, то ссылки на userinfo (при клике по «головастику») или ссылка на главную страницу блога, откроются в новом окне/вкладке.
wp-content/plugins
, создаем отдельный каталог lj-ljr-users
, в нем подкаталог img
, и загружаем туда графические файлы «головастиков» lj-ljr-users.php
в каталоге wp-content/plugins/lj-ljr-users
и вставляем в него нижеследующий код.
styles.css
Заглянул в логи — 25 неудачных попыток подобрать пароль и логин к админке.
Смешно, логин, который нигде не отображается, 35+ символьный пароль от админки, и что самое смешное — ежедневный бэкап постов, высылаемый на e-mail (специально для этого заведенный, который никто не знает).
Про отправку бэкапов на мыло сделаю отдельный пост, таких плагинов нет, ЕМНИС, полезно будет.
Правда мы не стали заморачиваться, сообщество это или пользователь, поэтому иконка и для того, и для другого одинакова, например:
Пользователи:
rutopist@lj
tiphareth@ljr
Сообщества:
potsreotizm@lj
durdom@ljr
Наш шорткод имеет замечательную возможность — открывать нужного юзера/сообщество в новой вкладке, например:
ketmar@ljr
veniamin1@lj
cat@ljr
brigada_hella@lj
simple_html_dom.php
Read more…
Для того, чтобы вставить в свой блог на WordPress опрос с LJ.ROSSIA.ORG, останется добавить в пост следующий шорткод:
[ljrpoll id="<poll_id>"]
Где <poll_id>
идентификатор опроса, например 1307
Тестовый пост с отображенным опросом здесь:
http://tolik-punkoff.com/2016/07/26/opros-s-lj-rossia-org-otobrazhaemyj-v-wordpress/
Код плагина доступен на PasteBin:
getpoll.php
Основной файл плагина
Или можно скачать архив с плагином с mega.nz
Папку из архива надо поместить в директорию wp-content/plugins
вашего сайта, после чего зайти в консоль на страницу плагинов (или обновить ее) и активировать плагин LJR-pollDisplay
Позже напишу, как я такой финт ушами сделал (ну не совсем я, финны с китайцами, точнее с камбоджийцами даже, я только идею подал и над процессом руками водил, то бишь советовал):
ERROR: CONNECTION ERROR [http://lj.rossia.org/poll/?id=1307&mode=results]